С++: 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)==WAIT_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; }
Не вчитывлася, нет сейчас времени. Вот мой код который нормально работает. Посмотри может поможет. Х.м. у меня немного не так.. : ) bool WriteCPort(unsigned char* buf_in, DWORD cnt) { DWORD numbytes_ok; WriteFile(port, buf_in, cnt, &numbytes_ok, NULL); if (cnt!=numbytes_ok) return false; else return true; } bool ReadCPort(unsigned char* buf_in, DWORD cnt) { DWORD numbytes_ok; ReadFile(port, buf_in, cnt, &numbytes_ok, NULL); if (cnt!=numbytes_ok) return false; else return true; } Перед этим открываю порт.
Я дополнил и подправил свое первое сообщение, может быть поможет. LynXzp, спасибо , но алгоритм похож на синхронное 4тение. На крайняк попробую и его. Delimiter спасибо за линк, доступно икратко написано, кое-4то я для себя новое нашел, но ето не решает моей проблеммы.
..... видимо невнимательно читал своместное использование этих функций я не нашел.... может это чисто твои измышления! Какой смысл в использовании обеих функций? Обьясни плиз!