Последние записи
- TChromium (CEF3), сохранение изображений
- Как в Delphi XE обнулить таймер?
- Изменить цвет шрифта TextBox на форме
- Ресайз PNG без потери прозрачности
- Вывод на печать графического файла
- Взаимодействие через командную строку
- Перенести программу из Delphi в Lazarus
- Определить текущую ОС
- Автоматическая смена языка (раскладки клавиатуры)
- Сравнение языков на массивах. Часть 2
Интенсив по Python: Работа с API и фреймворками 24-26 ИЮНЯ 2022. Знаете Python, но хотите расширить свои навыки?
Slurm подготовили для вас особенный продукт! Оставить заявку по ссылке - https://slurm.club/3MeqNEk
Online-курс Java с оплатой после трудоустройства. Каждый выпускник получает предложение о работе
И зарплату на 30% выше ожидаемой, подробнее на сайте академии, ссылка - ttps://clck.ru/fCrQw
1st
Фев
Чтение блока данных из COM порта на Си в VS 2013 .
Posted by obzor under Win Api
Передо мной встала задача написать 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 бод в сек).
Ставите маску на EV_RXCHAR. Получили, читаете сколько есть. Анализируете и опять по кругу.
Случайные статьи
Купить рекламу на сайте за 1000 руб
пишите сюда - alarforum@yandex.ru
Да и по любым другим вопросам пишите на почту
пеллетные котлы
Пеллетный котел Emtas
Наши форумы по программированию:
- Форум Web программирование (веб)
- Delphi форумы
- Форумы C (Си)
- Форум .NET Frameworks (точка нет фреймворки)
- Форум Java (джава)
- Форум низкоуровневое программирование
- Форум VBA (вба)
- Форум OpenGL
- Форум DirectX
- Форум CAD проектирование
- Форум по операционным системам
- Форум Software (Софт)
- Форум Hardware (Компьютерное железо)