Форум программистов, компьютерный форум, киберфорум
C++/CLI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.96/25: Рейтинг темы: голосов - 25, средняя оценка - 4.96
25 / 25 / 2
Регистрация: 08.11.2011
Сообщений: 284

Обработка данных из порта

03.03.2013, 06:03. Показов 5864. Ответов 46
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Данные с порта считываются каждую секунду. Эти данные надо обработать. Вопрос как это сделать ? А то начинаю орабатывать тут:
C++
1
2
3
4
5
6
7
8
private: System::Void serialPort1_DataReceived(System::Object^  sender, System::IO::Ports::SerialDataReceivedEventArgs^  e) 
        {   
            System::String^ buffrdRMT69L=serialPort1->ReadExisting();
            //label4->Text="Ответ получен";
            //label4->ForeColor = System::Drawing::Color::Green;
            //textBox1->Text=(buffrdRMT69L);
            }
        }
ругается на то что я пытаюсь управлять label4 и т.д. из другого потока.

Код программы целеком:
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
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
#pragma once
 
namespace Project1 {
 
    using namespace System;
    using namespace System::ComponentModel;
    using namespace System::Collections;
    using namespace System::Windows::Forms;
    using namespace System::Data;
    using namespace System::Drawing;
    using namespace System::IO::Ports;
 
    /// <summary>
    /// Сводка для Form1
    /// </summary>
    public ref class Form1 : public System::Windows::Forms::Form
    {
    public:
        Form1(void)
        {
            InitializeComponent();
            //TODO: добавьте код конструктора
            //
        }
 
    protected:
        /// <summary>
        /// Освободить все используемые ресурсы.
        /// </summary>
        ~Form1()
        {
            if (components)
            {
                delete components;
            }
        }
    private: System::Windows::Forms::GroupBox^  groupBox1;
    private: System::IO::Ports::SerialPort^  serialPort1;
 
    private: 
 
    private: System::Windows::Forms::Timer^  timer1;
    private: System::Windows::Forms::GroupBox^  groupBox2;
    private: System::Windows::Forms::GroupBox^  groupBox4;
    private: System::Windows::Forms::Label^  label5;
    private: System::Windows::Forms::GroupBox^  groupBox3;
    private: System::Windows::Forms::Label^  label4;
    private: System::Windows::Forms::Label^  label3;
    private: System::Windows::Forms::Label^  label2;
    private: System::Windows::Forms::Label^  label1;
    private: System::Windows::Forms::GroupBox^  groupBox7;
    private: System::Windows::Forms::GroupBox^  groupBox5;
    private: System::Windows::Forms::GroupBox^  groupBox6;
    private: System::Windows::Forms::DataVisualization::Charting::Chart^  chart1;
    private: System::Windows::Forms::TextBox^  textBox1;
 
 
    private: System::ComponentModel::IContainer^  components;
    protected: 
 
    private:
        /// <summary>
        /// Требуется переменная конструктора.
        /// </summary>
 
#pragma region Windows Form Designer generated code
        /// <summary>
        /// Обязательный метод для поддержки конструктора - не изменяйте
        /// содержимое данного метода при помощи редактора кода.
        /// </summary>
 
    protected:
        void InitializeComponent(void)
        {
            this->components = (gcnew System::ComponentModel::Container());
            System::Windows::Forms::DataVisualization::Charting::ChartArea^  chartArea1 = (gcnew System::Windows::Forms::DataVisualization::Charting::ChartArea());
            System::Windows::Forms::DataVisualization::Charting::Legend^  legend1 = (gcnew System::Windows::Forms::DataVisualization::Charting::Legend());
            System::Windows::Forms::DataVisualization::Charting::Series^  series1 = (gcnew System::Windows::Forms::DataVisualization::Charting::Series());
            this->groupBox1 = (gcnew System::Windows::Forms::GroupBox());
            this->textBox1 = (gcnew System::Windows::Forms::TextBox());
            this->serialPort1 = (gcnew System::IO::Ports::SerialPort(this->components));
            this->timer1 = (gcnew System::Windows::Forms::Timer(this->components));
            this->groupBox2 = (gcnew System::Windows::Forms::GroupBox());
            this->chart1 = (gcnew System::Windows::Forms::DataVisualization::Charting::Chart());
            this->groupBox7 = (gcnew System::Windows::Forms::GroupBox());
            this->groupBox5 = (gcnew System::Windows::Forms::GroupBox());
            this->groupBox6 = (gcnew System::Windows::Forms::GroupBox());
            this->groupBox4 = (gcnew System::Windows::Forms::GroupBox());
            this->label5 = (gcnew System::Windows::Forms::Label());
            this->groupBox3 = (gcnew System::Windows::Forms::GroupBox());
            this->label4 = (gcnew System::Windows::Forms::Label());
            this->label3 = (gcnew System::Windows::Forms::Label());
            this->label2 = (gcnew System::Windows::Forms::Label());
            this->label1 = (gcnew System::Windows::Forms::Label());
            this->groupBox1->SuspendLayout();
            this->groupBox2->SuspendLayout();
            (cli::safe_cast<System::ComponentModel::ISupportInitialize^  >(this->chart1))->BeginInit();
            this->groupBox4->SuspendLayout();
            this->groupBox3->SuspendLayout();
            this->SuspendLayout();
            // 
            // groupBox1
            // 
            this->groupBox1->Controls->Add(this->textBox1);
            this->groupBox1->Location = System::Drawing::Point(12, 12);
            this->groupBox1->Name = L"groupBox1";
            this->groupBox1->Size = System::Drawing::Size(444, 564);
            this->groupBox1->TabIndex = 0;
            this->groupBox1->TabStop = false;
            this->groupBox1->Text = L"groupBox1";
            // 
            // textBox1
            // 
            this->textBox1->Location = System::Drawing::Point(6, 83);
            this->textBox1->Multiline = true;
            this->textBox1->Name = L"textBox1";
            this->textBox1->Size = System::Drawing::Size(432, 114);
            this->textBox1->TabIndex = 0;
            this->textBox1->Text = L"gfdsgfdgsd";
            // 
            // serialPort1
            // 
            this->serialPort1->BaudRate = 57600;
            this->serialPort1->PortName = L"COM2";
            this->serialPort1->ReadBufferSize = 256;
            this->serialPort1->WriteBufferSize = 256;
            this->serialPort1->DataReceived += gcnew System::IO::Ports::SerialDataReceivedEventHandler(this, &Form1::serialPort1_DataReceived);
            // 
            // timer1
            // 
            this->timer1->Enabled = true;
            this->timer1->Interval = 5000;
            this->timer1->Tick += gcnew System::EventHandler(this, &Form1::timer1_Tick);
            // 
            // groupBox2
            // 
            this->groupBox2->BackColor = System::Drawing::Color::Green;
            this->groupBox2->Controls->Add(this->chart1);
            this->groupBox2->Controls->Add(this->groupBox7);
            this->groupBox2->Controls->Add(this->groupBox5);
            this->groupBox2->Controls->Add(this->groupBox6);
            this->groupBox2->Controls->Add(this->groupBox4);
            this->groupBox2->Controls->Add(this->groupBox3);
            this->groupBox2->Location = System::Drawing::Point(578, 12);
            this->groupBox2->Name = L"groupBox2";
            this->groupBox2->Size = System::Drawing::Size(631, 564);
            this->groupBox2->TabIndex = 1;
            this->groupBox2->TabStop = false;
            // 
            // chart1
            // 
            chartArea1->Name = L"ChartArea1";
            this->chart1->ChartAreas->Add(chartArea1);
            legend1->Name = L"Legend1";
            this->chart1->Legends->Add(legend1);
            this->chart1->Location = System::Drawing::Point(40, 299);
            this->chart1->Name = L"chart1";
            this->chart1->Palette = System::Windows::Forms::DataVisualization::Charting::ChartColorPalette::None;
            series1->ChartArea = L"ChartArea1";
            series1->Legend = L"Legend1";
            series1->Name = L"Series1";
            this->chart1->Series->Add(series1);
            this->chart1->Size = System::Drawing::Size(585, 300);
            this->chart1->TabIndex = 5;
            this->chart1->Text = L"chart1";
            // 
            // groupBox7
            // 
            this->groupBox7->BackColor = System::Drawing::SystemColors::Control;
            this->groupBox7->Location = System::Drawing::Point(259, 235);
            this->groupBox7->Name = L"groupBox7";
            this->groupBox7->Size = System::Drawing::Size(144, 46);
            this->groupBox7->TabIndex = 4;
            this->groupBox7->TabStop = false;
            this->groupBox7->Text = L"Давление ВХ, кг/см2";
            // 
            // groupBox5
            // 
            this->groupBox5->BackColor = System::Drawing::SystemColors::Control;
            this->groupBox5->Location = System::Drawing::Point(35, 235);
            this->groupBox5->Name = L"groupBox5";
            this->groupBox5->Size = System::Drawing::Size(187, 58);
            this->groupBox5->TabIndex = 2;
            this->groupBox5->TabStop = false;
            this->groupBox5->Text = L"Давление газа ВЫХ2,кг/см2";
            // 
            // groupBox6
            // 
            this->groupBox6->BackColor = System::Drawing::SystemColors::Control;
            this->groupBox6->Location = System::Drawing::Point(259, 152);
            this->groupBox6->Name = L"groupBox6";
            this->groupBox6->Size = System::Drawing::Size(159, 49);
            this->groupBox6->TabIndex = 3;
            this->groupBox6->TabStop = false;
            this->groupBox6->Text = L"Температура окр. ср., С";
            // 
            // groupBox4
            // 
            this->groupBox4->BackColor = System::Drawing::SystemColors::Control;
            this->groupBox4->Controls->Add(this->label5);
            this->groupBox4->Location = System::Drawing::Point(35, 152);
            this->groupBox4->Name = L"groupBox4";
            this->groupBox4->Size = System::Drawing::Size(195, 58);
            this->groupBox4->TabIndex = 1;
            this->groupBox4->TabStop = false;
            this->groupBox4->Text = L"Давление газа ВЫХ1, кг/см2";
            // 
            // label5
            // 
            this->label5->AutoSize = true;
            this->label5->Location = System::Drawing::Point(12, 32);
            this->label5->Name = L"label5";
            this->label5->Size = System::Drawing::Size(0, 13);
            this->label5->TabIndex = 0;
            // 
            // groupBox3
            // 
            this->groupBox3->BackColor = System::Drawing::SystemColors::Control;
            this->groupBox3->Controls->Add(this->label4);
            this->groupBox3->Controls->Add(this->label3);
            this->groupBox3->Controls->Add(this->label2);
            this->groupBox3->Controls->Add(this->label1);
            this->groupBox3->Location = System::Drawing::Point(29, 29);
            this->groupBox3->Name = L"groupBox3";
            this->groupBox3->Size = System::Drawing::Size(374, 97);
            this->groupBox3->TabIndex = 0;
            this->groupBox3->TabStop = false;
            this->groupBox3->Text = L"Связь с прибором";
            // 
            // label4
            // 
            this->label4->AutoSize = true;
            this->label4->Font = (gcnew System::Drawing::Font(L"Microsoft Sans Serif", 16, System::Drawing::FontStyle::Regular, System::Drawing::GraphicsUnit::Point, 
                static_cast<System::Byte>(204)));
            this->label4->ForeColor = System::Drawing::Color::Red;
            this->label4->Location = System::Drawing::Point(99, 54);
            this->label4->Name = L"label4";
            this->label4->Size = System::Drawing::Size(243, 26);
            this->label4->TabIndex = 3;
            this->label4->Text = L"Нет ответа от прибора";
            // 
            // label3
            // 
            this->label3->AutoSize = true;
            this->label3->Font = (gcnew System::Drawing::Font(L"Microsoft Sans Serif", 16, System::Drawing::FontStyle::Regular, System::Drawing::GraphicsUnit::Point, 
                static_cast<System::Byte>(204)));
            this->label3->ForeColor = System::Drawing::Color::Red;
            this->label3->Location = System::Drawing::Point(99, 21);
            this->label3->Name = L"label3";
            this->label3->Size = System::Drawing::Size(260, 26);
            this->label3->TabIndex = 2;
            this->label3->Text = L"Ошибка открытия порта";
            // 
            // label2
            // 
            this->label2->AutoSize = true;
            this->label2->Font = (gcnew System::Drawing::Font(L"Microsoft Sans Serif", 16, System::Drawing::FontStyle::Regular, System::Drawing::GraphicsUnit::Point, 
                static_cast<System::Byte>(204)));
            this->label2->Location = System::Drawing::Point(6, 54);
            this->label2->Name = L"label2";
            this->label2->Size = System::Drawing::Size(95, 26);
            this->label2->TabIndex = 1;
            this->label2->Text = L"Прибор:";
            // 
            // label1
            // 
            this->label1->AutoSize = true;
            this->label1->Font = (gcnew System::Drawing::Font(L"Microsoft Sans Serif", 16, System::Drawing::FontStyle::Regular, System::Drawing::GraphicsUnit::Point, 
                static_cast<System::Byte>(204)));
            this->label1->Location = System::Drawing::Point(6, 21);
            this->label1->Name = L"label1";
            this->label1->Size = System::Drawing::Size(68, 26);
            this->label1->TabIndex = 0;
            this->label1->Text = L"Порт:";
            // 
            // Form1
            // 
            this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
            this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
            this->ClientSize = System::Drawing::Size(1370, 748);
            this->Controls->Add(this->groupBox2);
            this->Controls->Add(this->groupBox1);
            this->Name = L"Form1";
            this->Text = L"Form1";
            this->Load += gcnew System::EventHandler(this, &Form1::Form1_Load);
            this->groupBox1->ResumeLayout(false);
            this->groupBox1->PerformLayout();
            this->groupBox2->ResumeLayout(false);
            (cli::safe_cast<System::ComponentModel::ISupportInitialize^  >(this->chart1))->EndInit();
            this->groupBox4->ResumeLayout(false);
            this->groupBox4->PerformLayout();
            this->groupBox3->ResumeLayout(false);
            this->groupBox3->PerformLayout();
            this->ResumeLayout(false);
 
        }
 
private:
#pragma endregion
    
private: System::Void timer1_Tick(System::Object^  sender, System::EventArgs^  e)
        {
            if(serialPort1->IsOpen) serialPort1->Write(":1;37;01000D;14794"+"\r");
        }
 
private: System::Void serialPort1_DataReceived(System::Object^  sender, System::IO::Ports::SerialDataReceivedEventArgs^  e) 
        {   
            System::String^ buffrdRMT69L=serialPort1->ReadExisting();
            //label4->Text="Ответ получен";
            //label4->ForeColor = System::Drawing::Color::Green;
            //textBox1->Text=(buffrdRMT69L);
            }
        }
 
private: System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e) 
        {
            array<String^>^ serialPorts = nullptr;
            serialPorts = SerialPort::GetPortNames();
            for each(String^ port in serialPorts)
            {
                if (serialPort1->PortName==port) 
                {
                    serialPort1->Open();
                    label3->Text="Открыт";
                    label3->ForeColor = System::Drawing::Color::Green;
                }
            }
        }
 
};
}
1
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.03.2013, 06:03
Ответы с готовыми решениями:

Обработка данных с COM порта
Здравстыуйте помогите решить проблемму, есть устройство COM (CH340) с него снимаются данные его настроек в виде : ( B1 C1 R1 X0 ...

Обработка данных из com порта
Неправильно читаются данные из массива (в одном байте игнорируется 0 спереди) Настройки порта не привожу, чтобы не захламлять код Кусок...

Обработка данных с com порта.
При подключении к com порту контроллера, неважно какого, мне в консоль приходит от него ответ вот в таком виде: как еа рисунке. Это...

46
9 / 9 / 0
Регистрация: 03.10.2012
Сообщений: 35
07.04.2013, 08:59
Студворк — интернет-сервис помощи студентам
Привет.
Пришлось кое-что подучить, чтобы появился очередной вопрос.

Здесь протокол для задачи.
Кликните здесь для просмотра всего текста

Adress=16
Lenght=1
Type=unsign. char
Explanation=O2(Oxygen, e.g. 209=20,9%)


1. Вот здесь зачем конвертируется unsign.char в массив unsign.char. И почему именно 133 ???
Code
1
array<unsigned char>^ buffrdBVR=gcnew array<unsigned char>(133);
Добавлено через 16 часов 43 минуты
2. Вот это условие: Если ?????????, то переменной Т присваиваем значение ??????????? Можно подробней?
Code
1
2
3
4
5
6
if (serialPort2->BytesToRead==133)
            {
                serialPort2->Read(buffrdBVR,0,133);
                
                //температура газа
                T=BitConverter::ToSingle(buffrdBVR,20);
Что такое 133 и 20?
0
25 / 25 / 2
Регистрация: 08.11.2011
Сообщений: 284
18.04.2013, 12:23  [ТС]
1. Вот здесь зачем конвертируется unsign.char в массив unsign.char. И почему именно 133 ???
Эт я не конвертирую а создаю новый массив (или я только так думаю, я же еще не спец, главное работает) А 133 именно потому что я сниффером вижу ну или по документации что размер ответа устройства 133 байта
2. Вот это условие: Если ?????????, то переменной Т присваиваем значение ??????????? Можно подробней?
А это проверка если в буфере порта реально 133 байта то считываем эти байты в созданный массив buffrdBVR и далее обрабатываем его. Например выводим температуру. Проверку делаем что бы избежать считывания и обработки в наш массив левых или некорректных данных.
1
9 / 9 / 0
Регистрация: 03.10.2012
Сообщений: 35
18.04.2013, 18:25
20-й байт это по твоему протоколу температура?
0
25 / 25 / 2
Регистрация: 08.11.2011
Сообщений: 284
18.04.2013, 19:02  [ТС]
Ты уш извиняй но описание функций то можно и посмотреть, чтоб таких вопросов не возникало. 20 это номер байта с которого берет нужные 4 байта функция.
1
9 / 9 / 0
Регистрация: 03.10.2012
Сообщений: 35
25.04.2013, 20:41
Привет. Посмотри пож. код. Не работает. Где неправильно?
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private: System::Void serialPort1_DataReceived(System::Object^  sender, System::IO::Ports::SerialDataReceivedEventArgs^  e) {
 
                 array<unsigned char>^ buffer=gcnew array<unsigned char>(72);
                 if (serialPort1->BytesToRead==72){
 
                 
                 
                 serialPort1->Read(buffer,0,72);
                 }
                 //температура окр. среды
                 T=BitConverter::ToInt32(buffer,25);
                 label1->Text=String::Format("{0:f1}",T);
 
 
 
             }
основной сектор данных состоит из 72 байт.
25-й адрес длинной 2 байта (signed int) - это температура окр. среды.
0
25 / 25 / 2
Регистрация: 08.11.2011
Сообщений: 284
26.04.2013, 11:47  [ТС]
Во первых должно быть вот так, а во вторых что именно работает не так ??
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private: System::Void serialPort1_DataReceived(System::Object^  sender, System::IO::Ports::SerialDataReceivedEventArgs^  e) {
 
                 array<unsigned char>^ buffer=gcnew array<unsigned char>(72);
                 if (serialPort1->BytesToRead==72) //(тут проверяешь что к прочтению из порта действительно 72 байта, если да то см код ниже)
                 {
                       serialPort1->Read(buffer,0,72); //(читаешь в buffer 72 байта)
                        //температура окр. среды
                       T=BitConverter::ToInt32(buffer,25); //(преобразуешь температуру используя 4 байта начиная с 25 из buffer. Уверен что с 25 ?)
                       label1->Text=String::Format("{0:f1}",T);
                 }
                 
 
 
 
 
             }
1
9 / 9 / 0
Регистрация: 03.10.2012
Сообщений: 35
26.04.2013, 15:04
Что не работает конкретно...
Создал форму, добавил метку label1. Добавил компонент serialPort1.
Создал код на основе твоего кода и протокола задачи. Во вложении "протокол задачи". Сделал настройки компонента порта в соответствии с настройками порта в протоколе задачи.

a) подключил прибор с которого снимаются данные. Посмотрел "снифером" (Serial port Monitor), что прибор действительно посылает данные, что кабель исправен и ось тоже.

б) Скомпилировал код. Ошибок компиляции нет. Появилась форма с меткой. Метка как была с двумя нулями, так и осталась.

Я понимаю, что это примитив, что нужно в цикле опрашивать "читать" 25, 26 байты. Но при запуске формы должен же был "прилететь" хоть какой-то мусор?

Ты вот пишешь, что преобразуем 4 байта начиная с 25-го. В протоколе "длина =2 байта". Т.е. 25-й, 26-й.

Попробовал твой код из предыдущего поста. Тоже самое. Метка с двумя нулями.
Миниатюры
Обработка данных из порта  
0
25 / 25 / 2
Регистрация: 08.11.2011
Сообщений: 284
26.04.2013, 16:22  [ТС]
Скинь мне весь проект, гляну че ты там накодил.
И справку смотри по классам, например вот этот метод работает только для 32 битного числа, то есть для 4 байт.
C++
1
T=BitConverter::ToInt32(buffer,25);
Вот тут подбери нужный метод
http://msdn.microsoft.com/ru-r... erter.aspx

Добавлено через 10 минут
И кстате как компилятор у тебя вот это пропускает ???
C++
1
label1->Text=String::Format("{0:f1}",T);
Он должен ругаться, если я не ошибаюсь, что ты пытаешься label1 из другого потока изменить!
Тут подругому надо делать !

Добавлено через 4 минуты
Вот пример как должно быть
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
private: System::Void serialPort2_DataReceived(System::Object^  sender, System::IO::Ports::SerialDataReceivedEventArgs^  e) 
         {
            
            if (serialPort2->BytesToRead==133)
            {
                array<unsigned char>^ buffrdBVR=gcnew array<unsigned char>(133);
                serialPort2->Read(buffrdBVR,0,133);
                //счетчик газа 
                G=BitConverter::ToInt32(buffrdBVR,56);
                //температура газа
                T=BitConverter::ToSingle(buffrdBVR,20);
                this->ChangeText2();
            }
        }
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
private: System::Void ChangeText2()
    {
        if (this->label6->InvokeRequired)
        {
            SetVoidDelegate^ d = gcnew SetVoidDelegate(this, &Form1::ChangeText2);
            this->Invoke(d);
        }
        else
        {
            label6->Text="Ответ получен";
            label6->ForeColor = System::Drawing::Color::Green;
        }
        //счетчик газа
        if (this->label15->InvokeRequired)
        {
            SetVoidDelegate^ d = gcnew SetVoidDelegate(this, &Form1::ChangeText2);
            this->Invoke(d);
        }
        else
        {
            label15->Text=G.ToString();
        }
        //температура газа
        if (this->label16->InvokeRequired)
        {
            SetVoidDelegate^ d = gcnew SetVoidDelegate(this, &Form1::ChangeText2);
            this->Invoke(d);
        }
        else
        {
            groupBox10->BackColor = System::Drawing::SystemColors::Control;
            if (T<Tmin) {groupBox10->BackColor = System::Drawing::Color::Red;};
            label16->Text=String::Format("{0:f1}",T);
        }
    }
Добавлено через 9 минут
И со сниффера информацию мне дай. И еще во тут посмотри
C++
1
serialPort2->Read(buffrdBVR,0,133);
читается ли в buffrdBVR данные с порта. Сверь их со сниффером.
0
9 / 9 / 0
Регистрация: 03.10.2012
Сообщений: 35
26.04.2013, 17:37
Во вложении скрин снифера. Видно, что байты бегут непрерывным потоком. Где начало, где конец -непонятно.
Миниатюры
Обработка данных из порта  
0
9 / 9 / 0
Регистрация: 03.10.2012
Сообщений: 35
26.04.2013, 17:50

Code
1
serialPort2->Read(buffrdBVR,0,133);
читается ли в buffrdBVR данные с порта. Сверь их со сниффером.
Не понимаю как можно увидеть данные в буфере, чтобы сверить.

Вот это: "buffrdBVR" -это ты просто "обозвал" буфер?

В течение часа проект скину.
0
25 / 25 / 2
Регистрация: 08.11.2011
Сообщений: 284
26.04.2013, 18:03  [ТС]
Teбе и не надо смотреть данные в буфере, тебе надо посмотреть доходят ли они до "buffrdBVR"! И я же тебе давал сниффер пользуйся им он пишет где запрос где ответ, там все понятно а тут куча данных. Для анализа не очень пригодна.
0
9 / 9 / 0
Регистрация: 03.10.2012
Сообщений: 35
26.04.2013, 18:25
Здесь архив с проектом задачи.
Вложения
Тип файла: rar Task_34.rar (659.0 Кб, 4 просмотров)
0
25 / 25 / 2
Регистрация: 08.11.2011
Сообщений: 284
26.04.2013, 18:37  [ТС]
Как все сложно. )) во. Посмотри что у тебя попадает сюда buffrdBVR при выполнении программы.

Добавлено через 2 минуты
И учти у меня VS 2010. И сниффер поставь мой и сними им данные! С то там хрен поймешь че.
0
9 / 9 / 0
Регистрация: 03.10.2012
Сообщений: 35
26.04.2013, 18:41
ты мне посылал конвертер чисел. Каким снифером пользуешься?
Как посмотреть, каким способом посмотреть, что попадает в буфер?
0
25 / 25 / 2
Регистрация: 08.11.2011
Сообщений: 284
26.04.2013, 18:47  [ТС]
А точно, завтр скину, и проект гляну я щас с телефона, запарилмя писать.

Добавлено через 31 секунду
А точно, завтр скину, и проект гляну я щас с телефона, запарился писать.
0
25 / 25 / 2
Регистрация: 08.11.2011
Сообщений: 284
27.04.2013, 05:32  [ТС]
Вот пользуйся вот етой прогой. Там данные такого формата:

Запрос:18.11.2012 9:09:30.26864 (+0.9375 seconds)

02 03 10 02 00 40 E1 09

Ответ:18.11.2012 9:09:30.29964 (+0.0313 seconds)

02 03 80 02 06 35 62 0E 00 0C 0B 12 09 0B 15 7A
2C 50 03 02 C8 8E AB 41 34 90 01 3F 1E 39 7D 3F
DA 71 AB 42 EE 3E 01 44 B8 BF 2E 03 00 00 94 1B
28 00 F2 2F D4 3E 00 00 A6 47 D4 00 4B 04 39 3E
00 00 00 00 00 00 00 00 00 00 01 27 8D 15 C2 F5
3D 7F BE 00 00 00 00 00 00 00 00 00 00 00 00 12
00 00 00 00 00 05 00 00 00 5E 8F 42 3F 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 08 BD 20 F8
Вложения
Тип файла: rar free-serial-port-monitor СНИФФЕР СОМ ПОРТА.rar (2.82 Мб, 10 просмотров)
0
25 / 25 / 2
Регистрация: 08.11.2011
Сообщений: 284
27.04.2013, 06:01  [ТС]
Ну ты ваще молодец, глянул я твой проект. Во первых ты уверен что ты правильно настроил порт ? Скорость, номер порта, стоп биты, RTS и тд ? И вот в этот параметр ReceivedBytesThreshold поставь 72. Это число байт которые должны быть доступны перед запуском события порта Read.
Во вторых как ты хочешь получить ответ от порта не послав туда ничего ???
Да и вообще ты его даже не открыл, его нужно еще открыть потом посылать туда данные.
Добавь на форму таймер, укажи через какое время будут у тебя записываться данные в порт!
Вот мой код для открытия и записи данных в порт. У меня каждую секунду туда записывается данные.
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
private: System::Void timer2_Tick(System::Object^  sender, System::EventArgs^  e) 
         {
             if(!serialPort2->IsOpen)
             {
                 label6->ForeColor = System::Drawing::Color::Red;
                 label6->Text = "Нет ответа от прибора";
                 label7->ForeColor = System::Drawing::Color::Red;
                 label7->Text = "Ошибка открытия порта";
 
                 array<String^>^ serialPorts = nullptr;
                 serialPorts = SerialPort::GetPortNames();
                 for each(String^ port in serialPorts)
                 {
                    if (serialPort2->PortName==port) 
                    {
                        serialPort2->Open();
                        serialPort2->Encoding=System::Text::Encoding::GetEncoding(1251);
                        label7->ForeColor = System::Drawing::Color::Green;
                        label7->Text="Открыт";
                     }
                 }
             }
             //очистить передающий буфер
             if(serialPort2->IsOpen) serialPort2->DiscardOutBuffer();
             //02 03 10 02 00 40 E1 09
             if(serialPort2->IsOpen) serialPort2->Write("\x02"+"\x03"+"\x10"+"\x02"+"\x00"+"\x40"+"б"+"\x09");
             //очистить принимающий буфер
             if(serialPort2->IsOpen) serialPort2->DiscardInBuffer();
             DT=DateTime::Now;
         }
Добавлено через 4 минуты
Я вот послал командой информацию в порт:
C++
1
if(serialPort2->IsOpen) serialPort2->Write("\x02"+"\x03"+"\x10"+"\x02"+"\x00"+"\x40"+"б"+"\x09");
И через сниффер сразу видно что вот информация записалась в виде "02 03 10 02 00 40 E1 09"
Запрос:18.11.2012 9:09:30.26864 (+0.9375 seconds)

02 03 10 02 00 40 E1 09
И прибор мне на этот запрос отвечает
Ответ:18.11.2012 9:09:30.29964 (+0.0313 seconds)

02 03 80 02 06 35 62 0E 00 0C 0B 12 09 0B 15 7A
2C 50 03 02 C8 8E AB 41 34 90 01 3F 1E 39 7D 3F
DA 71 AB 42 EE 3E 01 44 B8 BF 2E 03 00 00 94 1B
28 00 F2 2F D4 3E 00 00 A6 47 D4 00 4B 04 39 3E
00 00 00 00 00 00 00 00 00 00 01 27 8D 15 C2 F5
3D 7F BE 00 00 00 00 00 00 00 00 00 00 00 00 12
00 00 00 00 00 05 00 00 00 5E 8F 42 3F 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 08 BD 20 F8

Добавлено через 6 минут
Вот поэтому у тебя никаких ошибок и не выдает, у тебя не разу дело до события serialPort1_DataReceived не дошло, поэтому ошибки о которой я говорил выше не выдает. (то что ты из другого потока пытаешься изменить label2)
C++
1
2
3
4
5
6
7
8
9
10
11
    private: System::Void serialPort1_DataReceived(System::Object^  sender, System::IO::Ports::SerialDataReceivedEventArgs^  e) {
 
                 array<unsigned char>^ buffer=gcnew array<unsigned char>(72);
                 if (serialPort1->BytesToRead==72) 
                 {
                       serialPort1->Read(buffer,0,72); 
 
                       //температура окр. среды
                       T=BitConverter::ToInt16(buffer,25); 
                       label2->Text=String::Format("{0:f1}",T);
                 }
1
9 / 9 / 0
Регистрация: 03.10.2012
Сообщений: 35
29.04.2013, 14:46
Во вторых, как ты хочешь получить ответ от порта не послав туда ничего ???
Не понимаю зачем в порт или прибор нужно что-то отправлять. И что именно отправлять. Какой-то код?
Я считал, что после установления связи, когда сигналы RTS (запрос на передачу), CTS (чист для передачи что-ли) обменялись, начинается обмен данными.
Я препода спросил, он ответил, что при подаче питания на прибор и при исправном кабеле и com port hardware, передача данных начинается немедленно. И отправил меня изучать теорию (UART).
0
25 / 25 / 2
Регистрация: 08.11.2011
Сообщений: 284
29.04.2013, 15:15  [ТС]
Я не специалист пока еще, но вот у меня ни один из имеющихся приборов не отправляет сам себе никакие данные. Надо сначала ему отправить запрос и только после этого в зависимости от запроса я получаю те или иные данные в виде ответа от прибора.

Добавлено через 1 минуту
Но вот правильно на строить порт и открыть его надо в любом случае!

Добавлено через 1 минуту
Я думаю у тебя тоже прибор не ответит пока в него не пошлёшь запрос.

Добавлено через 1 минуту
Тем более откуда он сам знает какие данные тебе присылать и через какой период ?

Добавлено через 4 минуты
Протокол modbuse (не помню как правильно пишется) rtu ? Если да просчитай про него.

Добавлено через 12 секунд
Протокол modbuse (не помню как правильно пишется) rtu ? Если да просчитай про него.
0
9 / 9 / 0
Регистрация: 03.10.2012
Сообщений: 35
29.04.2013, 15:26
Потом, я же проверил свойством

Code
1
 if(serialPort2->IsOpen)
, что порт открыт.

Снифер, который ты мне прислал вообще отказывается что-то показывать. проверил Port Monitor(ом), данные идут.

Пока "перевариваю" и пробую все-что ты мне прислал (замечания, софт и т.д.).

И вообще, на MSDN какие-то примеры свойств компонентов приводят, вроде и С++ закладку выбираешь. Очень отличаются от того, что у тебя и других в коде на VS 2010. Взять тот же (IsOpen).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.04.2013, 15:26
Помогаю со студенческими работами здесь

Обработка данных принятых с COM-порта
Добрыйдень опытные коллеги))) Помогите с алгоритмом обработки данных принятых с ком-порта. Есть следующее: Формат пакета от...

Обработка данных с COM порта без использования Sleep
делаю проект, который взаимодействует с реальным устройством через COM-PORT я отправляю команду, жду (я сделал через sleep) пока в...

Обработка ошибки при потере COM порта
Добрый день! Пока не приходилось сталкиваться с обработкой ошибок, поэтому обращаюсь к вам. Есть программа, которая работает с COM...

Обработка данных с COM порта
ПОдскажите, как обрабатывать строку полученную с COm порта У меня с COM порта идет строка ...

Обработка данных, полученных из COM-порта
В текстовом файле одна строка с данными полученными из СОМ порта(файл REG.jpg). Ее надо обработать, конкретно получить цифровые значения...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru