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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
power12
6 / 6 / 1
Регистрация: 14.04.2010
Сообщений: 100
#1

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

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

всем привет, такая задача.

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

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

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++):

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

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

Задача Таймер. Считывание из консоли - C++
Здравствуйте, помогите с задачей. На вход подается строка формата: чч:мм:сс (текущее время) и вторая строка формата: чч.мм.сс(время, через...

Потоки ввода/вывода. Сохранение информации в файл и ее считывание оттуда - C++
Всем доброго времени суток. Неделю две назад я начал делать программу, которая бы сохраняла информацию о так называемых фирмах в текстовом...

Потоки данных - C++
Все наверно знают, что стандартные потоки (cout, cin, cerr, clog) ввода и вывода можно перенаправлять в файлы. Зачем тогда нужны классы...

Тема потоки данных - C++
Задача: Создается файл путем ввода имени файла с клавиатуры, хочу с помощью функции get() и цикла do while ввести текст, который выведется...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
SatanaXIII
Супер-модератор
Эксперт С++
5609 / 2643 / 244
Регистрация: 01.11.2011
Сообщений: 6,502
Завершенные тесты: 1
05.06.2014, 16:16 #2
Цитата Сообщение от power12 Посмотреть сообщение
Так работает, но как сделать без таймера?
Не останавливать поток, а усыплять до получения события прихода данных в порт. И пусть система сама его будит, когда нужно.

Поищите по форуму работу с COM портом. Куча примеров.
Вот например:
Баг в работе с COM портом
power12
6 / 6 / 1
Регистрация: 14.04.2010
Сообщений: 100
05.06.2014, 16:46  [ТС] #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  [ТС] #4
если расставить точки останова, и смотреть в дебагере, то видно, что данные меняются, подскажите, пожалуйста, как теперь эти данные вытащить в ListBox?
SatanaXIII
Супер-модератор
Эксперт С++
5609 / 2643 / 244
Регистрация: 01.11.2011
Сообщений: 6,502
Завершенные тесты: 1
06.06.2014, 17:38 #5
Цитата Сообщение от power12 Посмотреть сообщение
ReadFile(COMport, bufrd, btr, &temp, &overlapped); //прочитать байты из порта в буфер программы
___
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 1
06.06.2014, 17:46 #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  [ТС] #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
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 1
07.06.2014, 12:55 #8
Цитата Сообщение от power12 Посмотреть сообщение
но я в потоке не могу обратиться к ListControl, что бы передавать данные туда(
при чём тут лист-то? Лист и ком-порт это две разные не пересекающиеся вещи!
power12
6 / 6 / 1
Регистрация: 14.04.2010
Сообщений: 100
07.06.2014, 13:12  [ТС] #9
Kuzia domovenok, я знаю, что разные вещи, мне нужна помощь в том, что бы передать данные в ListControl, которые постоянно приходят на ком порт.
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 1
07.06.2014, 13:16 #10
power12, ну так и назови тему "как передать данные в ListControl?" !
ты winapi используешь?
power12
6 / 6 / 1
Регистрация: 14.04.2010
Сообщений: 100
07.06.2014, 13:22  [ТС] #11
Kuzia domovenok,
ты winapi используешь?
только функцию чтения из потока.

для всего остального обычный MFC.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.06.2014, 13:22
Привет! Вот еще темы с ответами:

Потоки и сокрытие данных - C++
Всем доброго времени суток. Появился вопрос, касающийся потоков. Есть класс, в котором имеются функции для вывода внутренних данных в...

Потоки. Ввод данных. - C++
Если согласится на ввод второго человека, пропускается ввод его имени... вроде ввод все правильно, не знаю в чем беда :wall: ...

Файловые потоки данных - C++
Помогите, пожалуйста! Надо написать программу, которая считывает из файла строки и сохраняет их в другой файл в обратном порядке. Я...

Считывание данных - C++
#include <stdio.h> #include <stdlib.h> #include <iostream> using namespace std; int main() { FILE *f; char c; int...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
07.06.2014, 13:22
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru