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..
|
|
|

27.02.2008, 13:25
|
|
Участник форума
Регистрация: 21.10.2007
Сообщений: 147
Провел на форуме: 388646
Репутация:
31
|
|
Не вчитывлася, нет сейчас времени. Вот мой код который нормально работает.
Посмотри может поможет. Х.м. у меня немного не так.. : )
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;
}
Перед этим открываю порт.
|
|
|

27.02.2008, 14:57
|
|
Banned
Регистрация: 08.04.2005
Сообщений: 446
Провел на форуме: 2187381
Репутация:
518
|
|
http://www.intuit.ru/department/pl/cil/12/2.html
|
|
|

27.02.2008, 18:39
|
|
Новичок
Регистрация: 20.02.2008
Сообщений: 2
Провел на форуме: 6131
Репутация:
0
|
|
Я дополнил и подправил свое первое сообщение, может быть поможет.
LynXzp, спасибо , но алгоритм похож на синхронное 4тение. На крайняк попробую и его.
Delimiter спасибо за линк, доступно икратко написано, кое-4то я для себя новое нашел, но ето не решает моей проблеммы.
|
|
|

27.02.2008, 19:01
|
|
Banned
Регистрация: 08.04.2005
Сообщений: 446
Провел на форуме: 2187381
Репутация:
518
|
|
 ..... видимо невнимательно читал
Функция GetOverlappedResult в данном случае проверяет состояние операции и, если она еще не завершена, вызывает функцию WaitForSingleObject для ожидания завершения операции ввода-вывода.
своместное использование этих функций я не нашел.... может это чисто твои измышления!
Какой смысл в использовании обеих функций? Обьясни плиз!
Последний раз редактировалось Delimiter; 27.02.2008 в 19:06..
|
|
|

27.02.2008, 20:25
|
|
Banned
Регистрация: 18.05.2005
Сообщений: 1,981
Провел на форуме: 1941233
Репутация:
2726
|
|
... пацаны я невруливаю ваще о чем речь ......
|
|
|

27.02.2008, 22:53
|
|
Banned
Регистрация: 08.04.2005
Сообщений: 446
Провел на форуме: 2187381
Репутация:
518
|
|
 об асинхронных операциях на ком порте
|
|
|
|
 |
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|