вопрос про com порт
Народ, подскажите как узнать что в ком порт что-то записалось, точнее пришло от подключенного оборудования. Пробовал постоянно опрашивать порт но иногда программа как-будто бы не замечает пришеддших данных пока они повторно не придут. Программа пишется на VC++ 6.0 под winapi. Я хотел бы узнать можно ли перехватить само событие прихода данных что бы стопроцентно с первого раза прочитать что туда пришло.
Цитата:
Originally posted by gerich
Народ, подскажите как узнать что в ком порт что-то записалось, точнее пришло от подключенного оборудования. Пробовал постоянно опрашивать порт но иногда программа как-будто бы не замечает пришеддших данных пока они повторно не придут. Программа пишется на VC++ 6.0 под winapi. Я хотел бы узнать можно ли перехватить само событие прихода данных что бы стопроцентно с первого раза прочитать что туда пришло.
Народ, подскажите как узнать что в ком порт что-то записалось, точнее пришло от подключенного оборудования. Пробовал постоянно опрашивать порт но иногда программа как-будто бы не замечает пришеддших данных пока они повторно не придут. Программа пишется на VC++ 6.0 под winapi. Я хотел бы узнать можно ли перехватить само событие прихода данных что бы стопроцентно с первого раза прочитать что туда пришло.
RS232 используется или сам все коммуникации делаешь? Вообще-то есть какое-то прерывание, которое генерируется на ДТР, вроде (не помню точно).
Рекомендую использовать асинхронный ввод. Или явно использовать асинхронные операции ввода/вывода, либо просто вызывать ReadFile синхронно, но в параллельном потоке. Тайм-ауты можно отключить (SetCommTimeout или что-то типа того) и ждать пока что-либо не придет.
Цитата:
Originally posted by segev
gerich
Рекомендую использовать асинхронный ввод. Или явно использовать асинхронные операции ввода/вывода, либо просто вызывать ReadFile синхронно, но в параллельном потоке. Тайм-ауты можно отключить (SetCommTimeout или что-то типа того) и ждать пока что-либо не придет.
gerich
Рекомендую использовать асинхронный ввод. Или явно использовать асинхронные операции ввода/вывода, либо просто вызывать ReadFile синхронно, но в параллельном потоке. Тайм-ауты можно отключить (SetCommTimeout или что-то типа того) и ждать пока что-либо не придет.
Если не стандартный протокол RS232 используется, то такая штука не пройдет
Устройство с компьютером связанно по трехпроводной схеме. Причем все напаянно своими ручками так как старый кабель предназначен для 25-ти контактного кома. Я хотел ещё узнать, существует ли ограничение на длинну такого кабеля? Может проблема в этом и какие-то данные просто теряются?
SetCommMask( m_PortHandle , EV_RXCHAR);
В потоке чтения сделай так:
COMSTAT Comstatus;
OVERLAPPED overlapped;
memset(&overlapped,0,sizeof(OVERLAPPED));
memset(&Comstatus ,0,sizeof(COMSTAT));
overlapped.hEvent=CreateEvent(NULL, TRUE, FALSE, NULL);
if(!WaitCommEvent(m_PortHandle, &dwEvtMask, &overlapped))
{
if(GetLastError()!=ERROR_IO_PENDING)
{
// ??????
}
WaitForSingleObject(overlapped.hEvent,INFINITE);
}
if (dwEvtMask & EV_RXCHAR)
{
ClearCommError(m_PortHandle,&dwError,&Comstatus);
if(!ResetEvent(overlapped.hEvent))
{
// ??????
}
if(!ReadFile(m_PortHandle,
&m_InBuffer[m_IndexForRead],
MAX_BUFFER_SIZE,//Comstatus.cbInQue,
&nBytesRead,
&overlapped))
}