ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Программирование > С/С++, C#, Delphi, .NET, Asm
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

С++: Win32: Особенности асинхронного чтения информации с КОМ порта используя Win API
  #1  
Старый 27.02.2008, 12:48
Аватар для carnage
carnage
Новичок
Регистрация: 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..
 
Ответить с цитированием

  #2  
Старый 27.02.2008, 13:25
Аватар для LynXzp
LynXzp
Участник форума
Регистрация: 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;
}

Перед этим открываю порт.
 
Ответить с цитированием

  #3  
Старый 27.02.2008, 14:57
Аватар для Delimiter
Delimiter
Banned
Регистрация: 08.04.2005
Сообщений: 446
Провел на форуме:
2187381

Репутация: 518
По умолчанию

http://www.intuit.ru/department/pl/cil/12/2.html
 
Ответить с цитированием

  #4  
Старый 27.02.2008, 18:39
Аватар для carnage
carnage
Новичок
Регистрация: 20.02.2008
Сообщений: 2
Провел на форуме:
6131

Репутация: 0
По умолчанию

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

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

  #5  
Старый 27.02.2008, 19:01
Аватар для Delimiter
Delimiter
Banned
Регистрация: 08.04.2005
Сообщений: 446
Провел на форуме:
2187381

Репутация: 518
По умолчанию

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

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

Последний раз редактировалось Delimiter; 27.02.2008 в 19:06..
 
Ответить с цитированием

  #6  
Старый 27.02.2008, 20:25
Аватар для KEZ
KEZ
Banned
Регистрация: 18.05.2005
Сообщений: 1,981
Провел на форуме:
1941233

Репутация: 2726


По умолчанию

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

  #7  
Старый 27.02.2008, 22:53
Аватар для Delimiter
Delimiter
Banned
Регистрация: 08.04.2005
Сообщений: 446
Провел на форуме:
2187381

Репутация: 518
По умолчанию

об асинхронных операциях на ком порте
 
Ответить с цитированием
Ответ





Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ