Текущий архив: 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.11 c