Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.81/21: Рейтинг темы: голосов - 21, средняя оценка - 4.81
-22 / 1 / 0
Регистрация: 29.08.2013
Сообщений: 49

Чтение данных из COM порта в массив

20.08.2014, 19:32. Показов 4389. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
задача следующая. прочитать байты приходящие из ком порта и положить их в массив.
вот код в котором для теста по нажатию кнопки происходит чтение байта из ком порта и отображается в текстовом поле на экране - это работает. надо сделать чтобы чтение данных происходило постоянно от нажатия кнопки старт до нажатия кнопки стоп и чтоб это не грузило процессор компа на 100 процентов. то есть пришли данные на ком порт, программа прочитала положила в массив и ждёт следующего прихода данных не грузя проц и не зависая.
если попользоваться командой sleep или сделать постоянное чтение вернувшись в началоgoto read_port; то прога висит и грузит проц.


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

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
35
36
void j9Frame::OnButton2Click(wxCommandEvent& event)
{
 
    Button1->SetLabel(_("Yes"));
 
    port_set:
    fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY); /*'open_port()' - Открывает последовательный порт */
      if (fd == -1)
        {
          /*
           * Возвращает файловый дескриптор при успехе или -1 при ошибке.
           */
           Button1->SetLabel(_("error port Unable to open"));
        }
     else
        { struct termios options; /*структура для установки порта*/
         tcgetattr(fd, &options); /*читает пораметры порта*/
 
         cfsetispeed(&options, B57600); /*установка скорости порта*/
         cfsetospeed(&options, B57600); /*установка скорости порта*/
 
         options.c_cflag &= ~PARENB; /*выкл проверка четности*/
         options.c_cflag &= ~CSTOPB; /*выкл 2-х стобит, вкл 1 стопбит*/
         options.c_cflag &= ~CSIZE; /*выкл битовой маски*/
         options.c_cflag |= CS8; /*вкл 8бит*/
         tcsetattr(fd, TCSANOW, &options); /*сохронения параметров порта*/
        }
 
read_port:
 
 iIn=read(fd,buf,8); /*чтения приходящих данных из порта*/
 wxString mystring = wxString::From8BitData(buf);
 TextCtrl1->SetValue(mystring);
 
  //sleep(20);
   //goto read_port;
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
/***************************************************************
 * Name:      j9Main.cpp
 * Purpose:   Code for Application Frame
 * Author:     ()
 * Created:   2012-12-04
 * Copyright:  ()
 * License:
 **************************************************************/
 
#include "j9Main.h"
#include <wx/msgdlg.h>
 
//(*InternalHeaders(j9Frame)
#include <wx/intl.h>
#include <wx/string.h>
//*)
#include <stdlib.h>
#include <stdio.h>
 
 
#include <string.h>  /* Объявления строковых функций */
#include <unistd.h>  /* Объявления стандартных функций UNIX */
#include <fcntl.h>   /* Объявления управления файлами */
#include <errno.h>   /* Объявления кодов ошибок */
#include <termios.h> /* Объявления управления POSIX-терминалом */
#include <sys/types.h>
#include <sys/stat.h>
#include <signal.h>
#include <time.h>
 
int fd; /* Файловый дескриптор для порта */
char buf[8];/*размер зависит от размера строки принимаемых данных*/
int outa=0;
int iIn;
char result;
int wr;
int f;
 
int open_port(void);
int main(void);
 
//helper functions
enum wxbuildinfoformat {
    short_f, long_f };
 
wxString wxbuildinfo(wxbuildinfoformat format)
{
    wxString wxbuild(wxVERSION_STRING);
 
    if (format == long_f )
    {
#if defined(__WXMSW__)
        wxbuild << _T("-Windows");
#elif defined(__UNIX__)
        wxbuild << _T("-Linux");
#endif
 
#if wxUSE_UNICODE
        wxbuild << _T("-Unicode build");
#else
        wxbuild << _T("-ANSI build");
#endif // wxUSE_UNICODE
    }
 
    return wxbuild;
}
 
//(*IdInit(j9Frame)
const long j9Frame::ID_STATICTEXT1 = wxNewId();
const long j9Frame::ID_CHOICE1 = wxNewId();
const long j9Frame::ID_BUTTON1 = wxNewId();
const long j9Frame::ID_BUTTON2 = wxNewId();
const long j9Frame::ID_STATICTEXT2 = wxNewId();
const long j9Frame::ID_TEXTCTRL1 = wxNewId();
const long j9Frame::idMenuQuit = wxNewId();
const long j9Frame::idMenuAbout = wxNewId();
const long j9Frame::ID_STATUSBAR1 = wxNewId();
//*)
 
BEGIN_EVENT_TABLE(j9Frame,wxFrame)
    //(*EventTable(j9Frame)
    //*)
END_EVENT_TABLE()
 
j9Frame::j9Frame(wxWindow* parent,wxWindowID id)
{
    //(*Initialize(j9Frame)
    wxMenuItem* MenuItem2;
    wxMenuItem* MenuItem1;
    wxMenu* Menu1;
    wxMenuBar* MenuBar1;
    wxMenu* Menu2;
 
    Create(parent, id, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_STYLE, _T("id"));
    SetClientSize(wxSize(919,450));
    StaticText1 = new wxStaticText(this, ID_STATICTEXT1, _("Label"), wxPoint(512,376), wxDefaultSize, 0, _T("ID_STATICTEXT1"));
    Choice1 = new wxChoice(this, ID_CHOICE1, wxPoint(216,144), wxDefaultSize, 0, 0, 0, wxDefaultValidator, _T("ID_CHOICE1"));
    Button1 = new wxButton(this, ID_BUTTON1, _("Label"), wxPoint(192,64), wxDefaultSize, 0, wxDefaultValidator, _T("ID_BUTTON1"));
    Button2 = new wxButton(this, ID_BUTTON2, _("Label"), wxPoint(56,72), wxDefaultSize, 0, wxDefaultValidator, _T("ID_BUTTON2"));
    StaticText2 = new wxStaticText(this, ID_STATICTEXT2, _("Labu"), wxPoint(144,296), wxDefaultSize, 0, _T("ID_STATICTEXT2"));
    TextCtrl1 = new wxTextCtrl(this, ID_TEXTCTRL1, _("Text"), wxPoint(320,72), wxSize(552,27), 0, wxDefaultValidator, _T("ID_TEXTCTRL1"));
    MenuBar1 = new wxMenuBar();
    Menu1 = new wxMenu();
    MenuItem1 = new wxMenuItem(Menu1, idMenuQuit, _("Quit\tAlt-F4"), _("Quit the application"), wxITEM_NORMAL);
    Menu1->Append(MenuItem1);
    MenuBar1->Append(Menu1, _("&File"));
    Menu2 = new wxMenu();
    MenuItem2 = new wxMenuItem(Menu2, idMenuAbout, _("About\tF1"), _("Show info about this application"), wxITEM_NORMAL);
    Menu2->Append(MenuItem2);
    MenuBar1->Append(Menu2, _("Help"));
    SetMenuBar(MenuBar1);
    StatusBar1 = new wxStatusBar(this, ID_STATUSBAR1, 0, _T("ID_STATUSBAR1"));
    int __wxStatusBarWidths_1[1] = { -1 };
    int __wxStatusBarStyles_1[1] = { wxSB_NORMAL };
    StatusBar1->SetFieldsCount(1,__wxStatusBarWidths_1);
    StatusBar1->SetStatusStyles(1,__wxStatusBarStyles_1);
    SetStatusBar(StatusBar1);
 
    Connect(ID_BUTTON1,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&j9Frame::OnButton1Click);
    Connect(ID_BUTTON2,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&j9Frame::OnButton2Click);
    Connect(ID_TEXTCTRL1,wxEVT_COMMAND_TEXT_UPDATED,(wxObjectEventFunction)&j9Frame::OnTextCtrl1Text);
    Connect(idMenuQuit,wxEVT_COMMAND_MENU_SELECTED,(wxObjectEventFunction)&j9Frame::OnQuit);
    Connect(idMenuAbout,wxEVT_COMMAND_MENU_SELECTED,(wxObjectEventFunction)&j9Frame::OnAbout);
    //*)
}
 
j9Frame::~j9Frame()
{
    //(*Destroy(j9Frame)
    //*)
}
 
void j9Frame::OnQuit(wxCommandEvent& event)
{
    Close();
}
 
void j9Frame::OnAbout(wxCommandEvent& event)
{
    wxString msg = wxbuildinfo(long_f);
    wxMessageBox(msg, _("Welcome to..."));
}
 
void j9Frame::OnButton2Click(wxCommandEvent& event)
{
 
    Button1->SetLabel(_("Yes"));
 
    port_set:
    fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY); /*'open_port()' - Открывает последовательный порт */
      if (fd == -1)
        {
          /*
           * Возвращает файловый дескриптор при успехе или -1 при ошибке.
           */
           Button1->SetLabel(_("error port Unable to open"));
        }
     else
        { struct termios options; /*структура для установки порта*/
         tcgetattr(fd, &options); /*читает пораметры порта*/
 
         cfsetispeed(&options, B57600); /*установка скорости порта*/
         cfsetospeed(&options, B57600); /*установка скорости порта*/
 
         options.c_cflag &= ~PARENB; /*выкл проверка четности*/
         options.c_cflag &= ~CSTOPB; /*выкл 2-х стобит, вкл 1 стопбит*/
         options.c_cflag &= ~CSIZE; /*выкл битовой маски*/
         options.c_cflag |= CS8; /*вкл 8бит*/
         tcsetattr(fd, TCSANOW, &options); /*сохронения параметров порта*/
        }
 
read_port:
 
 iIn=read(fd,buf,8); /*чтения приходящих данных из порта*/
 wxString mystring = wxString::From8BitData(buf);
 TextCtrl1->SetValue(mystring);
 
  //sleep(20);
   //goto read_port;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.08.2014, 19:32
Ответы с готовыми решениями:

Чтение данных с COM-порта
Здравствуйте. В ответ на мои запросы, COM порт присылает мне ответ различной длины. Как прочитать полностью то, что он прислал? Я хотел...

Чтение данных с COM-порта
Добрый день. Помогите пожалуйста. Я подаю команду, чтобы поменялись цифры на приборе и нужно чтобы эти цифры отобразились у меня в...

Чтение данных с COM порта
Есть два оборудования которые между собой подключены через COM. Одно все время передает данные другому. Хочу данные перехватить. Написал...

4
90 / 109 / 15
Регистрация: 26.01.2014
Сообщений: 710
20.08.2014, 20:11
Не помню точно, но по моему COMу дано прерывание. Попробуй поиграть им.

Твой Etien.
0
20 / 20 / 3
Регистрация: 25.05.2011
Сообщений: 62
22.08.2014, 14:07
Не использовал wxWidgets, но вам очевидно нужно потоковое чтение. Погуглил, вот есть: http://docs.wxwidgets.org/trun... tream.html

Т.е. вам надо привязать объект типа wxFFile к вашему файловому дескриптору порта, а затем использовать методы canRead и Read или ReadAll.
Подробнее пока не могу, поскольку некогда мучаться со сборкой/настройкой этого
0
-22 / 1 / 0
Регистрация: 29.08.2013
Сообщений: 49
22.08.2014, 18:35  [ТС]
на входе ком порта сыпятся данные в хексе типа AA E3 C7 91 FE
мне надо прочитать их, преобразовать в числа к примеру - 56 67 89 45 33 и записать в массив.
пока не знаю как преобразовать.
наверно можно без потокового чтения? нужно просто выделить из всего потока одну такую последовательность из 5 чисел в хексе. весь поток писать не нужно.
когда проверяю iIn, то он равен 255, значит данные в буфер считались?
когда пытаюсь посмотреть что записалось в буфер - преобразовать в текст и высветить в текстовом поле - пару кракозябров всего высвечивает. по идее должно быть много, ведь буфер256. попытки записать результат в файл чтобы посмотреть что получилось при чтении программой пока не увенчались успехом - в файле пусто. при записи в файл терминалкой - всё нормально, пишет AA E3 C7 91 FE и т д
C++
1
2
char buf[256];
iIn=read(fd,buf,255);
Добавлено через 53 минуты
хочется вывести в консоль типа такого

C++
1
2
3
for (;ee<res;ee++) {
             printf("buf[%i]:%x \n",ee, buf[ee]);
             bufer[ee]=buf[ee];
чтобы посмотреть что пришло, но у меня окошки. незнаю как извратиться чтобы посмотреть что пришло

Добавлено через 33 минуты
попытался вывести результат в файл чтобы посмотреть что пришло.
iIn равно 255 (иногда другое число скажем 156 или 48) значит типа данные записались в буфер?

в файл пишутся только буквы t без пробелов - tttttttttttttttttttttttttttttttt
в TextCtrl1 видно 2-3 кракозябра
как увидеть то что пришло и работать с ним?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 iIn=read(fd,buf,255);
 wxString mystring = wxString::From8BitData(buf); //
 TextCtrl1->SetValue(mystring);
 
 
 FILE *file;
 
    file = fopen("fscanf.txt", "w");
 
    int  ee=0;
 
          for (;ee<255;ee++) {
 
             fprintf(file,"t",buf[ee]);
 
                             }
 
                             fclose(file);
0
0 / 0 / 0
Регистрация: 28.07.2017
Сообщений: 5
28.08.2017, 09:14
очень знакомый код, точнее та часть что с СОМ дружит я его лет восемь назад выкладовал, кстате он был как демонстрация работы COM, после iIn=read(fd,buf,8);
было еще printf..... а далее зациклеволось, не понимаю зачем описовать ввашем случае метку <read_port:> //sleep(20);
//goto read_port; это было создано исключительно для демонстрации.
в ващем случае создана ошибка при каждом обращени void j9Frame::OnButton2Click(wxCommandEvent& event) происходит установка порта, установка порта должна быть оди раз. либо когда смена параметров происходит.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.08.2017, 09:14
Помогаю со студенческими работами здесь

Чтение данных с COM порта
Доброго времени, установил javax.comm,в документации указано что: &gt;The javax.comm.properties file must be installed. If it is not, no...

Чтение данных из COM порта
Добрый день. Требуется написать программу для чтения данных из ком порта на Visual c++ 6.0. Собственно говоря, у меня получилось объявить...

Чтение данных из com-порта
Доброго времени суток! Есть ошибка: &quot;аргуметн типа char несовместим с параметром типа const char&quot; Подскажите как исправить? ...

Чтение данных с COM-порта
Доброго времени суток. Уверен тема поднималась не раз, уже все прочитал разобраться не смог. В общем есть сканер который подключается по...

Чтение данных с COM/RS232 порта
Стоят весы подключённые к компу через RS232. Кладём на весы продукт, весы &quot;устаканиваются&quot; и кидают вес в виде &quot;000.254&quot;...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2. Данные берутся из. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru