как организовать асинхронную работу через rs-232?
От: EandG  
Дата: 25.11.03 00:53
Оценка:
Проблема с пар портом — очень большая просьба помочь кто хорошо разбирается

дело вот в чем
открываем порт как показано ниже

port=CreateFile(m_port,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);

if(port==INVALID_HANDLE_VALUE)
{
AfxMessageBox("Cannot open port");
return;
}

DCB* dcb;

dcb=new DCB;

if (!GetCommState(port,dcb))
{
return ;
};

dcb->BaudRate=CBR_9600;

dcb->Parity=NOPARITY;
dcb->ByteSize=8;
dcb->StopBits = ONESTOPBIT;



if (!SetCommState(port,dcb))
{
CloseHandle(port);
delete dcb;
return;
}

delete dcb;

COMMTIMEOUTS* timeouts;

timeouts=new COMMTIMEOUTS;

GetCommTimeouts (port, timeouts);

timeouts->ReadIntervalTimeout = 40;
timeouts->ReadTotalTimeoutMultiplier = 20;
timeouts->ReadTotalTimeoutConstant = 100;
timeouts->WriteTotalTimeoutMultiplier = 20;
timeouts->WriteTotalTimeoutConstant = 100;

SetCommTimeouts (port, timeouts);

SetupComm (port, 65536, 65536);

delete timeouts;


if (!SetCommMask(port, EV_ERR))
{
AfxMessageBox("Error setting communications mask");
return;
}


потом в ::OnTimer(UINT nIDEvent)

делаем

......
dwToWrite=8; //посыдаем 8-байтовую команду
expectLengthOfLine=12; //ждем 12-байтовый ответ

PurgeComm(port,PURGE_TXCLEAR);
PurgeComm(port,PURGE_RXCLEAR);

WriteFile(port, ask, dwToWrite, &dwWritten, NULL);
ReadFile(port, reply, expectLengthOfLine, NULL);
......

Все работает отлично — но только если на компе не крутят еще какие то задачи

особенно если на компе кто то начинает лазить по инет то тут же начинаются сбои
наиболее частый сбой состоит в том что пропадает первый байт получаемых данных —
ну а дальше конечно весь обмен нарушается так как неверно начинают расшифровываться принимаемые пакеты

Вопрос — можно сделать нечто похожее на асинхронные сокеты?
или
может есть какие то готовые классы для этого ?

скорее всего как то надо использовать FILE_FLAG_OVERLAPPED вместо OPEN_EXISTING

если кто нибудь может хорошо объяснить или помочь написать нужный код

то очень большая просьба написать

Эдуард

25.11.03 13:15: Перенесено модератором из 'C/C++' — ПК
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.