Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
6 / 6 / 7
Регистрация: 14.04.2010
Сообщений: 101

COM порт, потоки, и таймер. Считывание данных

05.06.2014, 16:05. Показов 3477. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
всем привет, такая задача.

Нужно считывать данные с ком порта, сразу после того как я открыл ком порт.

начал с этой темы.

http://piclist.ru/S-COM-THREAD... D-RUS.html

сделал как там пишут, считывает если все время жать на кнопочку считать данные).

добавил функцию считывания данных(поток) сразу после настройки порта.Но когда я открываю ком порт, считывания не происходит.

Поэтому воспользовался таймером, каждую секунду вызываю функцию считывания данных(поток) с ком порта. Так работает, но как сделать без таймера?


Надеюсь внятно объяснил.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.06.2014, 16:05
Ответы с готовыми решениями:

COM порт, GTK+, потоки
Всех приветствую! Нужна Ваша помощь! Суть вопроса: Есть прога работающая с исп. GTK считывающая данные с COM порта. Работала без...

Считывание и запись в COM порт
Есть код на стороне Ардуины, он работает, с ним всё порядке: boolean dataReady = 0; char incomingChar; char typeMessage; String...

Файловые потоки, считывание сначала
Есть проблема. Функцию recording вызываю несколько раз. В первый раз она считывает информацию, пока не конец файла, а во второй раз ничего...

10
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
05.06.2014, 16:16
Цитата Сообщение от power12 Посмотреть сообщение
Так работает, но как сделать без таймера?
Не останавливать поток, а усыплять до получения события прихода данных в порт. И пусть система сама его будит, когда нужно.

Поищите по форуму работу с COM портом. Куча примеров.
Вот например:
Баг в работе с COM портом
0
6 / 6 / 7
Регистрация: 14.04.2010
Сообщений: 101
05.06.2014, 16:46  [ТС]
SatanaXIII, хм, такая же функция получения данных, поток не останавливается.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
DWORD WINAPI ReadThread(LPVOID)
{
    COMSTAT comstat;        //структура текущего состояния порта, в данной программе используется
    //для определения количества принятых в порт байтов
    DWORD btr, temp, mask, signal;  //переменная temp используется в качестве заглушки
 
    //создать сигнальный объект-событие для асинхронных операций
    overlapped.hEvent = CreateEvent(NULL, true, true, NULL);
 
    //установить маску на срабатывание по событию приёма байта в порт
    SetCommMask(COMport, EV_RXCHAR);                
    while(1)    //пока поток не будет прерван, выполняем цикл
    {
        //ожидать события приёма байта (это и есть перекрываемая операция)
        WaitCommEvent(COMport, &mask, &overlapped);
 
        signal = WaitForSingleObject(overlapped.hEvent, INFINITE);  //приостановить поток до прихода байта
        if(signal == WAIT_OBJECT_0)                     //если событие прихода байта произошло
        {
            if(GetOverlappedResult(COMport, &overlapped, &temp, true)) //проверяем, успешно ли завершилась
                //перекрываемая операция WaitCommEvent
                if((mask & EV_RXCHAR)!=0)               //если произошло именно событие прихода байта
                {
                    ClearCommError(COMport, &temp, &comstat);       //нужно заполнить структуру COMSTAT
                    btr = comstat.cbInQue;                              //и получить из неё количество принятых байтов
                    if(btr)                                     //если действительно есть байты для чтения
                    {
                        ReadFile(COMport, bufrd, btr, &temp, &overlapped);     //прочитать байты из порта в буфер программы
                    }
                }
        }
    }
    CloseHandle(overlapped.hEvent);
}
но данные не считывает без таймера, прошу помощи(
0
6 / 6 / 7
Регистрация: 14.04.2010
Сообщений: 101
06.06.2014, 16:49  [ТС]
если расставить точки останова, и смотреть в дебагере, то видно, что данные меняются, подскажите, пожалуйста, как теперь эти данные вытащить в ListBox?
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
06.06.2014, 17:38
Цитата Сообщение от power12 Посмотреть сообщение
ReadFile(COMport, bufrd, btr, &temp, &overlapped); //прочитать байты из порта в буфер программы
___
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
06.06.2014, 17:46
Это вопрос скорее по WINAPI
А ещё точнее по ListBox'ам, а не работе с COM портом.
Есле тебе нужно знать, как заполняется ListBox, то в него надо послать сообщение
C++
1
SendMessage(ListWindowHandle, LB_ADDSTRING, NULL, (LPARAM)your_string);
0
6 / 6 / 7
Регистрация: 14.04.2010
Сообщений: 101
07.06.2014, 10:49  [ТС]
SatanaXIII, я знаю, что функцией ReadFile)

но я в потоке не могу обратиться к ListControl, что бы передавать данные туда(

вот у меня в чем проблема.

Kuzia domovenok, можно по подробней, у меня есть функция потока, данные приходят,но как мне их вытащить и запихнуть в List_Control.

в bufrd данные все время разные, что доказывает, что данные ходят, мне теперь их надо просто вытащить оттуда( а вытаскивать наверное тоже надо в потоке.

заполняю обычно так

C++
1
2
3
CString str;
    str.Format("%02X %02X %02X", bufrd[0],bufrd[1],bufrd[2]);
    m_list.AddString(str);
как это приделать к потоку?)
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
07.06.2014, 12:55
Цитата Сообщение от power12 Посмотреть сообщение
но я в потоке не могу обратиться к ListControl, что бы передавать данные туда(
при чём тут лист-то? Лист и ком-порт это две разные не пересекающиеся вещи!
0
6 / 6 / 7
Регистрация: 14.04.2010
Сообщений: 101
07.06.2014, 13:12  [ТС]
Kuzia domovenok, я знаю, что разные вещи, мне нужна помощь в том, что бы передать данные в ListControl, которые постоянно приходят на ком порт.
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
07.06.2014, 13:16
power12, ну так и назови тему "как передать данные в ListControl?" !
ты winapi используешь?
0
6 / 6 / 7
Регистрация: 14.04.2010
Сообщений: 101
07.06.2014, 13:22  [ТС]
Kuzia domovenok,
ты winapi используешь?
только функцию чтения из потока.

для всего остального обычный MFC.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.06.2014, 13:22
Помогаю со студенческими работами здесь

Считывание данных, отправляемых программой на COM-порт
Здравствуйте! Суть проблемы вот в чём: программа А общается с внешним устройством через COM-порт. Из программы Б нужно получить...

Потоки. Считывание данных из текстового файла "in.txt"
Добрый день. Подскажите, плз. Программа ведет себя вопреки ожиданиям. вот код (тестю файловый ввод-вывод): #include <iostream>...

COM порт и потоки
Помогите плиз железячнику разобраться с мьютексами! Есть девайс, который подключается к компу через ком порт. При посылке в него...

Таймер и параллельные потоки
Добрый день, сразу оговорюсь, что прошёлся поиском по темам с запросом "таймер", "потоки" и т.д. Разрабатываю...

Delphi, потоки таймер, Что не так?
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru