Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   С++: Win32: Особенности чтения информации с КОМ порта используя WIn API (https://forum.antichat.xyz/showthread.php?t=62889)

carnage 27.02.2008 12:48

С++: 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;
}

LynXzp 27.02.2008 13:25

Не вчитывлася, нет сейчас времени. Вот мой код который нормально работает.
Посмотри может поможет. Х.м. у меня немного не так.. : )

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;
}

Перед этим открываю порт.

Delimiter 27.02.2008 14:57

http://www.intuit.ru/department/pl/cil/12/2.html

carnage 27.02.2008 18:39

Я дополнил и подправил свое первое сообщение, может быть поможет.

LynXzp, спасибо , но алгоритм похож на синхронное 4тение. На крайняк попробую и его.
Delimiter спасибо за линк, доступно икратко написано, кое-4то я для себя новое нашел, но ето не решает моей проблеммы.

Delimiter 27.02.2008 19:01

:D ..... видимо невнимательно читал
Цитата:

Функция GetOverlappedResult в данном случае проверяет состояние операции и, если она еще не завершена, вызывает функцию WaitForSingleObject для ожидания завершения операции ввода-вывода.
своместное использование этих функций я не нашел.... может это чисто твои измышления!

Какой смысл в использовании обеих функций? Обьясни плиз!

KEZ 27.02.2008 20:25

... пацаны я невруливаю ваще о чем речь ......

Delimiter 27.02.2008 22:53

:D об асинхронных операциях на ком порте


Время: 11:31