Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

Ответ
 
Опции темы
Старый 15.12.2017, 21:12   #1
karpukopf
Новичок
 
Регистрация: 15.12.2017
Сообщений: 3
Репутация: 10
По умолчанию Чтение блока данных из 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 в 21:45.
karpukopf вне форума   Ответить с цитированием
Старый 15.12.2017, 21:48   #2
p51x
Профессионал
 
Регистрация: 15.02.2010
Сообщений: 11,715
Репутация: 1932

icq: 216409213
По умолчанию

Ставите маску на EV_RXCHAR. Получили, читаете сколько есть. Анализируете и опять по кругу.
__________________
Запомните раз и навсегда: помочь != "решите за меня"!
p51x на форуме   Ответить с цитированием
Старый 15.12.2017, 23:38   #3
karpukopf
Новичок
 
Регистрация: 15.12.2017
Сообщений: 3
Репутация: 10
По умолчанию

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

icq: 216409213
По умолчанию

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

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

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

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

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


16:45.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru