Главная страница
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.099 c
3-1125930670
_Lucky_
2005-09-05 18:31
2005.10.23
Возможно ли реализовать одним запросом на SQL, без использования


2-1128239239
elysee
2005-10-02 11:47
2005.10.23
CSV(MS-DOS)


2-1127822713
Mameluke
2005-09-27 16:05
2005.10.23
Тип переменных boolean


11-1109577063
Интересующийся
2005-02-28 10:51
2005.10.23
KOLMouseDown: как заставить реагировать на нажатие кнопок мыши?


14-1127815455
tuxds
2005-09-27 14:04
2005.10.23
Передача снимка экрана по сети