Главная страница
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.48 MB
Время: 0.057 c
14-1128003502
mr.il
2005-09-29 18:18
2005.10.23
D7 глючит после апдейта


14-1128247418
злобная танька
2005-10-02 14:03
2005.10.23
десятичная система


4-1124209558
Twister1222
2005-08-16 20:25
2005.10.23
Запрет на запуск


2-1127653919
Zap
2005-09-25 17:11
2005.10.23
Растягивание имаджа


2-1127749201
Shader
2005-09-26 19:40
2005.10.23
Opengl - прозрачный фон и вывод текста и другое