Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.12.2017, 20:12   #1
karpukopf
Новичок
Джуниор
 
Регистрация: 15.12.2017
Сообщений: 3
По умолчанию Чтение блока данных из COM порта.

Добрый день. Господа приходится просить у Вас указать на свои ошибки)
Передо мной встала задача написать win приложение которое должно получать данные из виртуального COM порта. данные - десять байт друг за другом, такой пакет посылается раз в секунду. Собственно, нужно вытащить их в виде массива, последовательность байт должна быть сохранена. Часть написанного кода:
Код:
overlapped.hEvent = CreateEvent(NULL, true, true, NULL);

	//установить маску на срабатывание по событию приёма байта в порт
	SetCommMask(hCom, EV_RXCHAR);
	while (true) //пока поток не будет прерван, выполняем цикл
	{
		//ожидать события приёма байта (это и есть перекрываемая операция)
		WaitCommEvent(hCom, &mask, &overlapped);

		signal = WaitForSingleObject(overlapped.hEvent, INFINITE);   //приостановить поток до прихода байта
		if (signal == WAIT_OBJECT_0)                      //если событие прихода байта произошло
		{
			if (GetOverlappedResult(hCom, &overlapped, &temp, true)) //проверяем, успешно ли завершилась
				//перекрываемая операция WaitCommEvent
			if ((mask & EV_RXCHAR) != 0)                                 //если произошло именно событие прихода байта
			{
				ClearCommError(hCom, &temp, &comstat);               //нужно заполнить структуру COMSTAT
				btr = comstat.cbInQue;                                  //и получить из неё количество принятых байтов
				if (btr)                                                 //если действительно есть байты для чтения
				{
					ReadFile(hCom, bufrd, btr, &temp, &overlapped);     //прочитать байты из порта в буфер программы
					for (int i = 0; i < temp; i++)
					{
						printf("%X", bufrd);
						printf(";");
					}
					printf("\n");
Программа работает, но событие EV_RXCHAR происходит после приёма каждого байта, соответственно и функция ReadFile вызывается после приёма каждого байта. Итого я получаю не буфер с нудной мне информацией а отдельные байты. Как быть? Думал на SetCommTimeouts но какие только значения временных интервалов не ставил - не вышло (скорость передачи - 9600 бод в сек). Спасибо!

Как бы в название темы добавить что пишу на Си в VS 2013 *______*

Последний раз редактировалось karpukopf; 15.12.2017 в 20:45.
karpukopf вне форума Ответить с цитированием
Старый 15.12.2017, 20:48   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Ставите маску на EV_RXCHAR. Получили, читаете сколько есть. Анализируете и опять по кругу.
p51x на форуме Ответить с цитированием
Старый 15.12.2017, 22:38   #3
karpukopf
Новичок
Джуниор
 
Регистрация: 15.12.2017
Сообщений: 3
По умолчанию

Но ведь я так и делаю. И моя проблема в том что получается прочесть не весь пакет (до нескольких десятков байт) а чтение происходит по одному байту, что неудобно. Возможно дело в значениях таймаутов? Хотя, байты в ком порт приходят друг за другом, разделены только стоп битами, пакет должен читаться целиком.
karpukopf вне форума Ответить с цитированием
Старый 16.12.2017, 07:46   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Нет, вы имеено реагируете на каждый байт. Можно и так. Но если устройство присылает сразу пакет, то обычно ждут первый байт и несколько раз пытаются вычитать пакет (имеено реадфайлом на оставшийся размер пакета).
p51x на форуме Ответить с цитированием
Старый 17.12.2017, 01:26   #5
karpukopf
Новичок
Джуниор
 
Регистрация: 15.12.2017
Сообщений: 3
По умолчанию

Медленно но дошло) После события "приём байта" вызываем ReadFile не на 1 байт а на длину пакета. Огромное спасибо
karpukopf вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чтение COM порта vovken1997 Общие вопросы Delphi 13 25.05.2020 16:44
Com port (rs232) асинхронные чтение. Использование таймаута во время ожидания события прихода данных из порта Mefil Win Api 0 20.02.2017 08:41
Чтение данных с COM-порта и вывод их в memo CHEburaschka Общие вопросы Delphi 12 21.05.2015 09:24
Дикий тупняк - чтение данных с com порта. GMX Компоненты Delphi 8 26.03.2014 15:39
Чтение данных с COM порта 232 Dimitr_88 Общие вопросы C/C++ 10 03.09.2010 10:39