Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.10.23;
Скачать: CL | DM;

Вниз

Проблемы с обменом RS232   Найти похожие ветки 

 
SiJack ©   (2005-09-29 09:36) [0]

Такая проблема, в своей программе я принимаю данные по RS232, данных много скорость 57600. Прием асинхронный

{Основная функция потока}
Procedure TReadThread.Execute;
Var
 str:string;
 CurrentState : TComStat;
 AvaibleBytes, ErrCode, ModemState, RealRead : Cardinal;
 ReadOL : TOverLapped; {структура для асинхронного чтения}
 Signaled, Mask : DWORD;
 BytesTrans : DWORD; {не используется для WaitCommEvent}
Begin
 With FOwner do
 begin
   Try
     {создание события для асинхронного чтения}
     FillChar(ReadOL, SizeOf(ReadOL), 0);
     ReadOL.hEvent:= CreateEvent(nil, True, True, nil);
     While (not Terminated) and Connected do
     begin {пока порт открыт}

       { Ждем одного из событий }
       WaitCommEvent(FHandle, Mask, @ReadOL);
       Signaled:= WaitForSingleObject(ReadOL.hEvent, INFINITE);
       If (Signaled  = WAIT_OBJECT_0) then
       begin
         If GetOverlappedResult(FHandle, ReadOL, BytesTrans, False) then
         begin
         //после GetOverlappedResult в переменной mask, которая передавалась
         //в WaitCommEvent, появятся флаги произошедших событий, либо 0 в
         // случае ошибки.
         If (Mask and EV_RXCHAR ) <> 0 then
         begin
           {Получаем состояние порта (линий и модема)}
           CurrentState:= GetState(ErrCode);
           ModemState  := GetModemState;
           { Число полученных, но еще не прочитанных байт}
           AvaibleBytes:= CurrentState.cbInQue;
           { Проверка числа доступных байт}
           If AvaibleBytes > 0 then
           begin
             SetLength(Str, AvaibleBytes);
             If ReadFile(FHandle, str[1], AvaibleBytes, RealRead, @ReadOL) then
             begin
               {сохраняем параметры вызова события}
               FBufer:=str;
               FPState := CurrentState;
               FMState := ModemState;
               FErrCode:= ErrCode;
               {Вызываем событие OnReadByte. Для синхронизации с VCL}
               {надо вызвать метод Synchronize }
               Synchronize(DoReadByte);    
             End;
           End;
         End;
         // Из буфера передачи передан последний символ
         If (Mask and EV_TXEMPTY ) <> 0 then
         begin
           Synchronize(DoWriteBuffer);
         end;
         // ошибка четности или др
         If (Mask and EV_ERR ) <> 0 then
         begin
          // Synchronize(DoWriteBuffer);
         end;
       End;
     End;
   End;
   Finally
     {закрытие дескриптора сигнального объекта}
     CloseHandle(ReadOL.hEvent);
     {Сброс события и маски ожидания}
     SetCommMask(FHandle, 0);
   End;
 End;
End;

Данные отображаются в Chart, если я начинаю двигать Chart или активно маштабировать обмен сбивается, тоесть принимающий поток блокируется, пробывал ставить ему больший приоритет, ничего не изменилось, в чем проблема? Подскажите как ее решить?


 
wal ©   (2005-09-29 11:29) [1]


> в чем проблема? Подскажите как ее решить?

Проблема где-то тут
...
Synchronize(DoReadByte);
...
Synchronize(DoWriteBuffer);
...        
Ну не может основной поток одновременно и форму двигать (или что ты там еще "активно масштабируешь") и выполнять методы DoReadByte и DoWriteBuffer.

С уважением.



Страницы: 1 вся ветка

Текущий архив: 2005.10.23;
Скачать: CL | DM;

Наверх




Память: 0.46 MB
Время: 0.074 c
14-1127983580
ocean
2005-09-29 12:46
2005.10.23
Честность и доброта не нужны


1-1128334352
NightLord
2005-10-03 14:12
2005.10.23
ScanDisk


9-1118410468
grouzd[E]v
2005-06-10 17:34
2005.10.23
Как определить минимальное расстояние от точки до полигона


3-1126111402
MSMEN
2005-09-07 20:43
2005.10.23
Установил ORACLE8j! вроде не вводил пароль


4-1124531824
FireMan_Alexey
2005-08-20 13:57
2005.10.23
Как добавить свой параметр в консольное меню проводника!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский