Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
power12
6 / 6 / 1
Регистрация: 14.04.2010
Сообщений: 100
05.06.2014, 16:05     COM порт, потоки, и таймер. Считывание данных #1
всем привет, такая задача.

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

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

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

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

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

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


Надеюсь внятно объяснил.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.06.2014, 16:05     COM порт, потоки, и таймер. Считывание данных
Посмотрите здесь:

Считывание данных C++
Считывание данных C++
Тема потоки данных C++
C++ Потоки. Ввод данных.
C++ Файловые потоки данных
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5548 / 2562 / 233
Регистрация: 01.11.2011
Сообщений: 6,332
Завершенные тесты: 1
05.06.2014, 16:16     COM порт, потоки, и таймер. Считывание данных #2
Цитата Сообщение от power12 Посмотреть сообщение
Так работает, но как сделать без таймера?
Не останавливать поток, а усыплять до получения события прихода данных в порт. И пусть система сама его будит, когда нужно.

Поищите по форуму работу с COM портом. Куча примеров.
Вот например:
Баг в работе с COM портом
power12
6 / 6 / 1
Регистрация: 14.04.2010
Сообщений: 100
05.06.2014, 16:46  [ТС]     COM порт, потоки, и таймер. Считывание данных #3
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);
}
но данные не считывает без таймера, прошу помощи(
power12
6 / 6 / 1
Регистрация: 14.04.2010
Сообщений: 100
06.06.2014, 16:49  [ТС]     COM порт, потоки, и таймер. Считывание данных #4
если расставить точки останова, и смотреть в дебагере, то видно, что данные меняются, подскажите, пожалуйста, как теперь эти данные вытащить в ListBox?
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5548 / 2562 / 233
Регистрация: 01.11.2011
Сообщений: 6,332
Завершенные тесты: 1
06.06.2014, 17:38     COM порт, потоки, и таймер. Считывание данных #5
Цитата Сообщение от power12 Посмотреть сообщение
ReadFile(COMport, bufrd, btr, &temp, &overlapped); //прочитать байты из порта в буфер программы
___
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
06.06.2014, 17:46     COM порт, потоки, и таймер. Считывание данных #6
Это вопрос скорее по WINAPI
А ещё точнее по ListBox'ам, а не работе с COM портом.
Есле тебе нужно знать, как заполняется ListBox, то в него надо послать сообщение
C++
1
SendMessage(ListWindowHandle, LB_ADDSTRING, NULL, (LPARAM)your_string);
power12
6 / 6 / 1
Регистрация: 14.04.2010
Сообщений: 100
07.06.2014, 10:49  [ТС]     COM порт, потоки, и таймер. Считывание данных #7
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);
как это приделать к потоку?)
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
07.06.2014, 12:55     COM порт, потоки, и таймер. Считывание данных #8
Цитата Сообщение от power12 Посмотреть сообщение
но я в потоке не могу обратиться к ListControl, что бы передавать данные туда(
при чём тут лист-то? Лист и ком-порт это две разные не пересекающиеся вещи!
power12
6 / 6 / 1
Регистрация: 14.04.2010
Сообщений: 100
07.06.2014, 13:12  [ТС]     COM порт, потоки, и таймер. Считывание данных #9
Kuzia domovenok, я знаю, что разные вещи, мне нужна помощь в том, что бы передать данные в ListControl, которые постоянно приходят на ком порт.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
07.06.2014, 13:16     COM порт, потоки, и таймер. Считывание данных #10
power12, ну так и назови тему "как передать данные в ListControl?" !
ты winapi используешь?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.06.2014, 13:22     COM порт, потоки, и таймер. Считывание данных
Еще ссылки по теме:

C++ Потоки данных
C++ Задача Таймер. Считывание из консоли
C++ Потоки и сокрытие данных

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

Или воспользуйтесь поиском по форуму:
power12
6 / 6 / 1
Регистрация: 14.04.2010
Сообщений: 100
07.06.2014, 13:22  [ТС]     COM порт, потоки, и таймер. Считывание данных #11
Kuzia domovenok,
ты winapi используешь?
только функцию чтения из потока.

для всего остального обычный MFC.
Yandex
Объявления
07.06.2014, 13:22     COM порт, потоки, и таймер. Считывание данных
Ответ Создать тему
Опции темы

Текущее время: 12:09. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru