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

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

03.03.2013, 06:03. Показов 5857. Ответов 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
25 / 25 / 2
Регистрация: 08.11.2011
Сообщений: 284
04.03.2013, 13:47  [ТС]
Все разобрался кое как )))) Спасибо =))
0
9 / 9 / 0
Регистрация: 03.10.2012
Сообщений: 35
10.03.2013, 10:03
Цитата Сообщение от GrukhvinEV Посмотреть сообщение
Все разобрался кое как )))) Спасибо =))



GrukhvinEV. Если я правильно понял, ты прочитал данные с порта и обработал. Кодил в Visual C++ 2008?

Столкнулся с такой же проблемой. пож. дай проект. Хотелось бы посмотреть как это делается. Комментарии писал?

P.S. Оч. надо для дипломной работы.
1
25 / 25 / 2
Регистрация: 08.11.2011
Сообщений: 284
10.03.2013, 10:42  [ТС]
Вот само событие
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
private: System::Void serialPort2_DataReceived(System::Object^  sender, System::IO::Ports::SerialDataReceivedEventArgs^  e) 
         {
            array<unsigned char>^ buffrdBVR=gcnew array<unsigned char>(133);
            if (serialPort2->BytesToRead==133)
            {
                serialPort2->Read(buffrdBVR,0,133);
                //счетчик газа 
                G=BitConverter::ToInt32(buffrdBVR,56);
                //температура газа
                T=BitConverter::ToSingle(buffrdBVR,20);
                if (T<Tmin) {Console::Beep(1000,200);MessageBox::Show("Tmin");};
                //давление газа
                P=10*BitConverter::ToSingle(buffrdBVR,24);
                if (P>Pmax) {Console::Beep(1000,200);MessageBox::Show("Pmax");};
                if (P<Pmin) {Console::Beep(1000,200);MessageBox::Show("Pmin");};
                //Время
                s=buffrdBVR[14];
                m=buffrdBVR[13];
                h=buffrdBVR[12];
                //Дата
                D=buffrdBVR[11];
                M=buffrdBVR[10];
                Y=buffrdBVR[9];
                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
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
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
        {
            label16->Text=Math::Round(T,1).ToString();
        }
        //давление газа
        if (this->label18->InvokeRequired)
        {
            SetVoidDelegate^ d = gcnew SetVoidDelegate(this, &Form1::ChangeText2);
            this->Invoke(d);
        }
        else
        {
            label18->Text=String::Format("{0:f1}", P);
            //label18->Text=Math::Round(P,1).ToString();
        }
        if (this->chart1->InvokeRequired)
        {
            SetVoidDelegate^ d = gcnew SetVoidDelegate(this, &Form1::ChangeText2);
            this->Invoke(d);
        }
        else
        {
            chart1->Series[0]->Points->AddXY(0,P);
        }
        //время
        if (this->label19->InvokeRequired)
        {
            SetVoidDelegate^ d = gcnew SetVoidDelegate(this, &Form1::ChangeText2);
            this->Invoke(d);
        }
        else
        {
            label19->Text=(h.ToString()+":"+m.ToString()+":"+s.ToString());
        }
        //дата
        if (this->label17->InvokeRequired)
        {
            SetVoidDelegate^ d = gcnew SetVoidDelegate(this, &Form1::ChangeText2);
            this->Invoke(d);
        }
        else
        {
            label17->Text=(D.ToString()+":"+M.ToString()+":20"+Y.ToString());
        }
    }
0
9 / 9 / 0
Регистрация: 03.10.2012
Сообщений: 35
10.03.2013, 11:35
Какой компонент com порта? MS Visual Studio С++?

Добавлено через 11 минут
Куча вопросов сразу возникла.
Можно весь проект. В этих кусках нубу не разобраться. Пожалуйста.
1
25 / 25 / 2
Регистрация: 08.11.2011
Сообщений: 284
10.03.2013, 11:48  [ТС]
Да я сам недавно начал учиться, на работе мониторинг приборов сижу делаю. Раньше с билдере делал, теперь на VS 2010 прешел. Вот проект, он компилируется но не закончен. У меня у самого еще вопросов куча.
Вложения
Тип файла: rar Project1.rar (1.03 Мб, 23 просмотров)
0
9 / 9 / 0
Регистрация: 03.10.2012
Сообщений: 35
10.03.2013, 14:15
Очень интересно. Сейчас буду разбираться.

В своем коде, я научился с данным компонентом открывать и закрывать порт. Эта штуковина, которую препод дал, выдает на свой дисплей окр. температуру и атм.давление и еще что-то.
Задание такое: Открыть порт, прочитать нужные байты. И вывести на label "temperature" и на label "Pressure" + кнопки и CheckBox для открытия и настройки порта. В порт-мониторе вижу, что эта штуковина шлет что-то около 128 байтов с определенным интервалом. Что и как дальше...?


Спасибо. Буду спрашивать у тебя. Как нашел нужные байты и как преобразовал.
1
25 / 25 / 2
Регистрация: 08.11.2011
Сообщений: 284
10.03.2013, 14:23  [ТС]
Ну найти байты и их тип, а так же протокол обмена помогает документация на прибор. Я допустим с сайта производителя брал на некоторые приборы, а на некоторые с завода запрашивал. А то где ты там угадаешь какие байты тебе нужны и какой тип данных если их 128. Тем более они могут вообще быть произвольными, как захотели так и реализовали на заводе.
0
9 / 9 / 0
Регистрация: 03.10.2012
Сообщений: 35
10.03.2013, 15:12
Вот на примере температуры и давления метана.
Какие по номеру байты идут на температуру, а какие на давление метана. И их тип.
Можно глянуть в документации на твой счетчик, как они реализовали передачу?
1
25 / 25 / 2
Регистрация: 08.11.2011
Сообщений: 284
10.03.2013, 16:37  [ТС]
Вот конкретно для левого окна 2 порт
Вложения
Тип файла: rar Рабочий стол.rar (119.5 Кб, 17 просмотров)
0
9 / 9 / 0
Регистрация: 03.10.2012
Сообщений: 35
10.03.2013, 19:30
Вставил я в онлайн калькулятор ( 16-ричная ---> 10-ти) перевернутые 17-й, 18, 19, 20 байты (41 AB 8E C8). Получил пургу близко не похожую на температуру. Хотя автор файла Запрос ответ.doc пишет, что все ОК. Температура 22,44 градуса.

Туплю Я?
1
25 / 25 / 2
Регистрация: 08.11.2011
Сообщений: 284
11.03.2013, 05:17  [ТС]
Тупишь ты )) Автор файла я ))) Если ты посмотришь внимательнее файл то увидишь что тип данных температуры float в конце файла указан стандарт "Структура вещественных чисел с плавающей запятой стандарта IEEE754". Вот ссылка
HTML5
1
http://www.softelectro.ru/ieee754.html
посмотри что это за число и как приводится в нормальный вид. И программку прикладываю для перевода таких чисел. Учти что у тебя число с плавающей точкой одинарной точности т.к. 32 бита. И ели не сложно ставь плюсики за сообщения, мелочь а приятно! =))
Вложения
Тип файла: rar ieee100 КОНВЕРТЕР ЧИСЕЛ ИЗ IEEE754.rar (1.40 Мб, 11 просмотров)
1
9 / 9 / 0
Регистрация: 03.10.2012
Сообщений: 35
11.03.2013, 09:40
И правда, 21,44 градуса.

Почитал про IEEE 754...
Очень большое число техногенных аварий и катастроф произошло за последнее десятилетие (обрушение крыш аквапарков, рынков и стадионов, авиационные катастрофы, сбои при запуске ракет и при работе спутников на орбите, взрывы и пожары на химических производствах и многое другое). И можем ли мы полностью исключить из числа причин этих катастроф работу компьютера по стандарту IEEE 754? Тем более, что идентифицировать эту причину аварии чрезвычайно сложно, а нередко и вообще невозможно. Дуглас Н.Арнольд смог идентифицировать четыре крупнейшие катастрофы в первой половине девяностых годов прошлого века. А сколько их неидентифицированных произошло после этого? Мы не знаем. Можем только догадываться.

А директор Института математики и ее применений в Миннеаполисе, США Дуглас Н.Арнольд утверждает, что целый ряд крупнейших аварий с человеческими жертвами и миллиардными убытками всецело обязан нынешней технологии компьютерных вычислений и представлений данных по стандарту IEEE 754:

–Взрыв ракеты "Пэтриот» в Саудовской Аравии 25 февраля 1991, который привел к гибели 28 человек, связан с ошибками округления.

–Взрыв ракеты Ариан-5 сразу после старта при ее первом испытании во Французской Гвиане 4 июня 1996 был следствием переполнения числовой сетки компьютера.

–23 августа 1991 в Гандсфиорде в Норвегии затонула нефтяная платформа, что привело к убытку почти в один миллиард долларов. Это, как предполагается, было результатом inaccurate finite element analysis.
Хорошо, что я просто лабораторку делаю....
1
25 / 25 / 2
Регистрация: 08.11.2011
Сообщений: 284
11.03.2013, 09:45  [ТС]
Интересная инфа, не знал такого )))
0
9 / 9 / 0
Регистрация: 03.10.2012
Сообщений: 35
11.03.2013, 10:43
Вопросы.

Если учесть что данные начинаются с 4 байта
Это исходя из протокола Modbus?

смещение 17 и длина 4 бита
Это откуда узнал? Производитель?

переворачиваем
биты передаются с конца?
0
25 / 25 / 2
Регистрация: 08.11.2011
Сообщений: 284
11.03.2013, 11:13  [ТС]
1) Начинаются они с первого байта, но там первые байты идут адрес устройства, номер функции и т.д. в .pdf файле это написано. Под данными я подразумевал параметры всякие, температуру, давление и т.д.
2) Да это производитель, он же может сам как хочет организовывать данные.
3) Нет, прибор передает с начала. Если не ошибаюсь это зависит от процессора компа, он их переворачивает.
А вообще почитай про протокол Modbus RTU, ASCII. Может что пригодится.
1
9 / 9 / 0
Регистрация: 03.10.2012
Сообщений: 35
11.03.2013, 11:44
не совсем понял
2) Да это производитель, он же может сам как хочет организовывать данные.
-смещение 17 для температуры, длина 4 бита
-смешения 51 для метана, длина 10 бит

Это стандарт? Или сам производитель так сделал?
Я к тому, что если это стандарт, то будет возможно "отловить" нужные биты, потом преобразовывая хотя бы на том же калькуляторе. Сравнивать с числовыми показаниями на дисплее "штуковины".

например: "отловил" нужные биты. Преобразовал на калк, получилось =23,2345. Похоже на комнатную температуру? , совпадает с числовыми данными на дисплее? Ну и т.д., "засовываешь" в код.
Прокатит такой вариант?
0
25 / 25 / 2
Регистрация: 08.11.2011
Сообщений: 284
11.03.2013, 12:30  [ТС]
Нет. Это не стандарт. Это производитель так захотел.
1
9 / 9 / 0
Регистрация: 03.10.2012
Сообщений: 35
11.03.2013, 14:42
подозревал...

Препод наверное сидит и ухмыляется, когда я к нему приду за таблицей (смещение, тип), кстати как она может называться? Чтобы правильно спросить. И где прочитать про смещения?
0
25 / 25 / 2
Регистрация: 08.11.2011
Сообщений: 284
11.03.2013, 15:12  [ТС]
Да просто спроси протокол обмена на прибор. Про смещение читать нечего. Это просто с какого байта начинается нужный параметр. Зависит от количества параметров. Например у тебя 3 параметра длинною 4 2 и 6 байт. И первые 4 байта получается адрес, функция и тд. Вот и получается что бы попасть на первый параметр надо пропустить первые 4 байта(адрес, и тд.) Что бы попасть на второй надо пропустить 4(адрес и т.д)+4(первый параметр). Те смещение 8, а наш параметр начнется с 9 байта и закончится 10 байтом. Т.к длина второго параметра 2 байта. И т.д. Понял?
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.03.2013, 15:12
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
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. Номеклатура. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru