Проблема с пар портом — очень большая просьба помочь кто хорошо разбирается
дело вот в чем
открываем порт как показано ниже
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++' — ПК