Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
С++: Win32: Особенности асинхронного чтения информации с КОМ порта используя Win API |

27.02.2008, 12:48
|
|
Новичок
Регистрация: 20.02.2008
Сообщений: 2
Провел на форуме: 6131
Репутация:
0
|
|
С++: Win32: Особенности асинхронного чтения информации с КОМ порта используя Win API
Всем привет. Извиняюсь за кривой код, я не программер.В общем есть проблемка,может кто 4то подскажет, буду признателен.
1) При первом запуске программы, И посылании телеграммы все работает кошерно.
2) Если же припервом запуске проги не подана телеграмма, И функция WaitForSingleObject ожидает обьект не дождавшись передает управление дальше, затем после цыкла while(byte_count<len) когда все повторяется происходит вот 4то:
Согласно примеру функции асинхронного 4тения данных из порта(используя WinAPI), если моя телеграмма приходит в момент времени до вызова функции WaitForSingleObject, то я 4ерез дебаггер вижу 4то данные помещены в буфер, однако моя фукция GetOverlappedResult не выполняется (так как ветка иф не туда идет). Полу4ается мой алгоритм работает только тогда когда активна (в ожидании в те4ении времени(последний аргумент)) функция WaitForSingleObject. Я же боюсь 4то вдруг если устройство пошлёт телеграмму до выполнения этой функции, тогда я ее про4есть не смогу.
Полу4ается WaitForSingleObject ждет, ждет данных И уходит с тайм аутом, хотя приемные данные вроде как в буфере. При4ем придальнейшем прогоне проге в цикле по томуже алгоритму, иногда WaitForSingleObject хавает мою телеграмму. Закономерности я впоймать немогу. Такое впя4атление 4то порт работает нестабильно в режиме 4тения, хотя запись в него идет на УРА. Для посылания телеграммы я исползовал прогу HyperTerminal. Да И 4тение я производил 4ерез (USB) в режиме емуляции COM порта(Проверит’ 4тение с COM1 пока не представляется возможным), может в етом И кроется при4ина моих боков?
COM1 посылает данные (HyperTERminal не может работать с USB(COM7)) а 4ерез COM7 с помощ’ю моей проги 4итаю данные. Полу4ается как бы петля.
Кусок проги (функция отве4ающая за 4тение) вот.
Крыпным текстом выделены те фрагменты функции,которые имеют прямое отношение к вопросу
RdBuffer IOP_comPort::getMsg()
{
// declaration
DWORD num_bytes_ok;
OVERLAPPED Event;
unsigned char rd_buf[COM_BUF_SIZE];
int stop = 0;
int len = 6; // potom eto zna4enie vytjagivaetsja iz telegrammy
int byte_count = 0;
num_bytes_ok = 0;
memset(&Event, 0, sizeof(Event)); Event.hEvent=CreateEvent(NULL, TRUE, FALSE, NULL);
while(byte_count<len)
{
ReadFile(hPort, rd_buf, COM_BUF_SIZE, &num_bytes_ok, &Event);
if(WaitForSingleObject(Event.hEvent,m_timeOut)==WA IT_OBJECT_0)
{ GetOverlappedResult(hPort,&Event, &num_bytes_ok, FALSE); Status.Read_GetOverlappedResult = GetLastError();
}
else
{
// Error
}
for (int j=0;j<num_bytes_ok;j++)
m_rd_buf.buf[j+byte_count]=rd_buf[j];
byte_count +=num_bytes_ok;
decodeMsg(len, Status.Read_GetOverlappedResult);
}
return m_rd_buf;
}
Последний раз редактировалось carnage; 27.02.2008 в 18:35..
|
|
|
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|