Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.56/140: Рейтинг темы: голосов - 140, средняя оценка - 4.56
2 / 2 / 0
Регистрация: 12.05.2015
Сообщений: 155

Младший и старший байт и запись 16 битных чисел на ардуино

28.12.2017, 11:40. Показов 30228. Ответов 41
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброе утро коллеги!
Изучаю протокол один, и тут нужно :
1) Записать данные с помощью младшего и старшего байта.
2)Все данные в структуре должны быть в 16-ричной форме.

Отсюда вытекает вопрос, подскажите на примере , как превратить число определенное , например в диапозоне от 0 до 1000 в младший и старший байт. Так же ни когда не работал с 16-ричной системой (программирование учил по учебникам, поэтому я нуб), подскажите как правильно на ардуинке писать в структуру такие данные, так как протокол это требует.

Заранее спасибо!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.12.2017, 11:40
Ответы с готовыми решениями:

Функция: изменить старший байт числа на заданное значение, не изменяя младший байт
функция изменяет старший байт числа на заданное значение не изменяя младший байт. как можно проще

Скетч для ардуино: разделить на младший и старший бит
Здравствуйте, помогите со скетчем, нужно разделить на младший и старший бит int microsec = 0; int stepp = 1; void setup() { ...

Как получить младший байт и его старший бит
Подскажите как получить младший байт и его старший бит. И как сделать замену старшего бита младшего байта на противоположный? Работа с...

41
2 / 2 / 0
Регистрация: 12.05.2015
Сообщений: 155
28.12.2017, 17:50  [ТС]
Студворк — интернет-сервис помощи студентам
Вы думаете все таки купить свисток USB -RS485 ? А на ардуинке как настроить параметры uart? на винде там WinAPi структуру заполнить надо определенную если мне память не изменяет, а на Qt библиотека есть, а вот на ардуинке хз)))
Адрес можно поменять, стоит по умолчанию 1.
0
73 / 86 / 40
Регистрация: 02.11.2017
Сообщений: 379
28.12.2017, 17:59
Цитата Сообщение от MaximusL Посмотреть сообщение
А на ардуинке как настроить параметры uart
Курите класс Serial. Его конструкторы инициализации. Либо смотрите в инете примеры.
Если соответствующих конструкторов нет, то придется курить даташит на контроллер. Благо, там примитивная AVR-ка стоит.
Цитата Сообщение от MaximusL Посмотреть сообщение
на винде там WinAPi структуру заполнить надо определенную если мне память не изменяет
К чему такие извраты? Скачайте ComPort toolKit или подобную прогу

Свисток купите - пригодится еще не раз
0
2 / 2 / 0
Регистрация: 12.05.2015
Сообщений: 155
29.12.2017, 11:30  [ТС]
Попробуйте настроить uart на 2 стоп бита и отправить последовательность
Я правильно понимаю что это то что надо : https://www.arduino.cc/en/Serial/Begin
C++
1
Serial2.begin(9600,SERIAL_8N2)
Добавлено через 21 минуту
Ничего не изменилось)

Добавлено через 4 минуты
А как понять, может он вообще мертвый? В доках что то не найду ничего, что он отправляет постоянно.....

Добавлено через 45 секунд
А последовательность отправлять как строку? Тупо скопировать и отправить?
0
73 / 86 / 40
Регистрация: 02.11.2017
Сообщений: 379
29.12.2017, 14:36
Цитата Сообщение от MaximusL Посмотреть сообщение
Я правильно понимаю
Правильно

Цитата Сообщение от MaximusL Посмотреть сообщение
А как понять, может он вообще мертвый
Ну, пробуйте разные варианты. Разные команды, адреса, скорости.
ПОпробуйте последовательность из главы 5 - она наверняка правильная. Это защитит нас от того, что мы в коде где-то накосячили

Мож есть форумы по этой приблуде. Кто-то юзал уже, наверняка.


Цитата Сообщение от MaximusL Посмотреть сообщение
А последовательность отправлять как строку? Тупо скопировать и отправить?
Вы про компорт тулкит? там в настройках можно сменить, чтобы не строку, а байты отправлять. И можно еще настроить задержку между отправкой байт, чтоы не сильно большая была. И еще много чего. Поковыряйте

Добавлено через 1 минуту
Банальный вопрос.. А питание этого своего блока вы включили? )))))))))))))))))))

Добавлено через 3 минуты
RX-TX блока не перепутали?

RX ардуины на TX блока и наоборот (кстати, TX блока можно на комп завести)

Добавлено через 32 секунды
Попробуйте RX-TX местами поменять - может там обозначение какое дибильное

Добавлено через 16 секунд
Но лучше схему посмотреть
0
2 / 2 / 0
Регистрация: 12.05.2015
Сообщений: 155
12.01.2018, 11:42  [ТС]
Китайские друзья отправили мне исходники своей программы которая работает с данным контроллером. Написана она на Qt,
вот код структуры и работы с ней:
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
#ifndef APPFRAME_H
#define APPFRAME_H
 
#define RDTYPE                                  (164)
#define WRTYPE                                  (134)
#define ERR_OK                  (0)     //执行成功
#define ERR_ERROR               (1)     //执行错误
#define ERR_TIMEOUT             (2)     //通讯超时
#define ERR_INVALIED_PARAM                      (3)     //非法参数
 
//AIJ仪表通讯协议请求帧帧格式
typedef struct tagREQ_FRM_T
{
        quint8  u8DevAddr1;     //设备地址
        quint8  u8DevAddr2;     //设备地址
        quint8  u8ReqType;      //请求类型
        quint8  u8DevPara;      //设备参数
        quint8  u8LoParam;      //参数数据-低字节
        quint8  u8HiParam;      //参数数据-高字节
        quint8  u8LoSumCheck;           //累加和校验码-低字节
        quint8  u8HiSumCheck;           //累加和校验码-高字节
}REQ_FRM_T;
 
 
//AIJ仪表通讯协议应答帧帧格式
typedef struct tagANS_FRM_T
{
        quint8  u8LoPV;         //应答PV值的低字节
        quint8  u8HiPV;         //应答PV值的高字节
        quint8  u8LoSV;         //应答SV值的低字节
        quint8  u8HiSV;         //应答SV值的高字节
        quint8  u8LoMV;         //应答MV值
        quint8  u8HiMV;     //应答报警状态
        quint8  u8ALm;      //参数数据-低字节
        quint8  u8LoParam;      //参数数据-高字节
        quint8  u8HiParam;           //累加和校验码-低字节
        quint8  u8SumCheck;           //累加和校验码-高字节
}ANS_FRM_T;
 
 
 
#endif // APPFRAME_H
Это я так понимаю работа со структурой:
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
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
#include<QTime>
#include <QDebug>
#include "AppFrame.h"
#include "qcomprotocol.h"
 
static quint8 u8ResBuff[]= {3,2,2,2,2,2,2,2,2,3,2,2,3,2,3,2,2,2};
static quint8 u8InputStandard = 0;
 
QComProtocol::QComProtocol()
{
    m_MyComPort = NULL;
}
 
QComProtocol::~QComProtocol()
{
    if(m_MyComPort != NULL)
    {
        m_MyComPort->close();
        delete m_MyComPort;
    }
}
 
//向串口读取数据
qint64 QComProtocol::ReadData(char *pcReadBuff, qint64 nReadLenth)
{
    qint64 nTempReadLenth = 0;
 
    if((m_MyComPort != NULL) && (m_MyComPort->isOpen()))
    {
        nTempReadLenth = m_MyComPort->read(pcReadBuff, nReadLenth);
    }
    return nTempReadLenth;
}
 
 
//向串口写入数据
qint64 QComProtocol::WriteData(const char *pcWriteBuff, qint64 nWriteLenth)
{
    qint64 nTempWriteLenth=0;
    if((m_MyComPort != NULL) && (m_MyComPort->isOpen()))
    {
        nTempWriteLenth = m_MyComPort->write(pcWriteBuff, nWriteLenth);
    }
 
    return nTempWriteLenth;
}
 
 
//发送帧接口
bool QComProtocol::SendFrame(const char *pcFrameBuff, qint64 nFrameSize, int nTimeOut)
{
 
    QTime time;
    time.start();
 
    while((time.elapsed() < nTimeOut) && (nFrameSize > 0))
    {
        qint64 nWriteBytes = WriteData(pcFrameBuff, nFrameSize);
        pcFrameBuff += nWriteBytes;
        nFrameSize -= nWriteBytes;
    }
 
    return (nFrameSize==0);
}
 
 
//接收数据,接收完成返回true
bool QComProtocol::ReceiveFrame(char *pcFrameBuff, qint64 nFrameSize, int nTimeOut)
{
 
    QTime Time;
    Time.start();
    qint64 nReadCurCount = 0;
 
    while((Time.elapsed()< nTimeOut) && (nReadCurCount < nFrameSize))
    {
        qint64 nReadBytes = ReadData(pcFrameBuff, nFrameSize);
        pcFrameBuff += nReadBytes;
        nReadCurCount += nReadBytes;
    }
 
    return(nReadCurCount == nFrameSize);
}
 
 
 
bool QComProtocol::myComPortOpen(QSerialParameter &myComPortPara)
{
    //先判断串口是否存在,如果存在则删除重新创建
    if(m_MyComPort != NULL)
    {
        delete m_MyComPort;
        m_MyComPort = NULL;
    }
 
    m_MyComPort = new Win_QextSerialPort(myComPortPara.m_UartId,QextSerialBase::Polling);
    if( m_MyComPort->open(QIODevice::ReadWrite))
    {
        m_MyComPort->setBaudRate((BaudRateType)myComPortPara.m_UartBaud.toInt());
        m_MyComPort->setDataBits((DataBitsType)myComPortPara.m_UartDataBit.toInt());
        m_MyComPort->setStopBits((StopBitsType)myComPortPara.m_UartStopBit.toInt());
        m_MyComPort->setParity((ParityType)myComPortPara.m_UartParity.toInt());
        m_MyComPort->setFlowControl(FLOW_OFF);
        myComPortPara.isOpen = true;
        return true;
    }
    return false;
 
}
 
bool QComProtocol::isOpen()
{
    if((m_MyComPort != NULL) && (m_MyComPort->isOpen()))
    {
        return true;
    }
 
    return false;
}
 
qint16 QComProtocol::Get2Byte(quint8 u8LoByte, quint8 u8HiByte)
{
    qint16 nsValue = 0;
 
    nsValue |= (u8HiByte << 8);
    nsValue &= 0xFF00;
    nsValue |= u8LoByte;
 
    return nsValue;
}
 
//封装读参数接口;
int QComProtocol::ReadParam(quint8 u8DevAddr, quint16 u16DevPara, ANS_FRM_T &stAnsFrm)
{
 
    REQ_FRM_T stReqFrm;
    qint32 n32CheckSum = 0;
    quint8 u8Temp = 0;
    int nErrCnt = 0;
    int nError = ERR_ERROR;
    u8Temp = u16DevPara % 256;
 
    stReqFrm.u8DevAddr1 = 0x80 + u8DevAddr;
    stReqFrm.u8DevAddr2 = 0x80 + u8DevAddr;
    stReqFrm.u8ReqType = RDTYPE + (u16DevPara >> 8);
    stReqFrm.u8DevPara = u8Temp;
    stReqFrm.u8LoParam = 0;
    stReqFrm.u8HiParam = 0;
    n32CheckSum = u8DevAddr + (stReqFrm.u8DevPara << 8) + stReqFrm.u8ReqType;
    stReqFrm.u8LoSumCheck = n32CheckSum & 0xff;
    stReqFrm.u8HiSumCheck =( n32CheckSum >> 8) & 0xff;
 
    while(nErrCnt < 6)
    {
        //发送请求帧
        if(SendFrame((const char *)&stReqFrm, sizeof(REQ_FRM_T), 200))
        {
            //接收应答帧
            if(ReceiveFrame((char *)&stAnsFrm, sizeof(ANS_FRM_T), 200))
            {
                //对数据进行校验
                if(QComProtocol::GetSumCheck(stAnsFrm))
                {
                    if(u16DevPara == 0x16)
                    {
                        u8InputStandard = stAnsFrm.u8LoParam;
                    }
                    nErrCnt = 10;
                    nError = ERR_OK;
                }
            }
        }
        nErrCnt++;
    }
 
    return nError;
}
 
//封装写参数接口
int QComProtocol::WriteParam(quint8 u8DevAddr, quint16 u16DevPara, quint8 u8LoParam, quint8 u8HiParam, ANS_FRM_T &stAnsFrm)
{
    REQ_FRM_T stReqFrm;
    qint32 n32CheckSum = 0;
    quint8 u8Temp = 0;
    int nErrCnt = 0;
    int nError = ERR_ERROR;
    u8Temp = u16DevPara % 256;
 
    stReqFrm.u8DevAddr1 = 0x80 + u8DevAddr;
    stReqFrm.u8DevAddr2 = 0x80 + u8DevAddr;
    stReqFrm.u8ReqType = WRTYPE + (u16DevPara >> 8);
    stReqFrm.u8DevPara = u8Temp;
    stReqFrm.u8LoParam = u8LoParam;
    stReqFrm.u8HiParam = u8HiParam;
    n32CheckSum = u8DevAddr + (stReqFrm.u8DevPara << 8) + stReqFrm.u8ReqType;
    stReqFrm.u8LoSumCheck = n32CheckSum & 0xff;
    stReqFrm.u8HiSumCheck =( n32CheckSum >> 8) & 0xff;
 
    while(nErrCnt < 6)
    {
        //发送请求帧
        if(SendFrame((const char *)&stReqFrm, sizeof(REQ_FRM_T), 200))
        {
            //接收应答帧
            if(ReceiveFrame((char *)&stAnsFrm, sizeof(ANS_FRM_T), 200))
            {
                //对数据进行校验
                if(QComProtocol::GetSumCheck(stAnsFrm))
                {
                    if(u16DevPara == 0x16)
                    {
                        u8InputStandard = stAnsFrm.u8LoParam;
                    }
 
                    nErrCnt = 10;
                    nError = ERR_OK;
                }
            }
        }
        nErrCnt++;
    }
 
    return nError;
}
 
int QComProtocol::WriteParam(quint8 u8DevAddr, quint16 u16DevPara, quint8 u8LoParam, quint8 u8HiParam)
{
    int nError = ERR_OK;
 
    ANS_FRM_T stAnsFrm;
 
    nError = WriteParam(u8DevAddr, u16DevPara, u8LoParam, u8HiParam, stAnsFrm);
 
    return nError;
}
 
bool QComProtocol::GetSumCheck(ANS_FRM_T stAnsFrm)
{
    quint8  u8CrcVal = 0;
    quint8  u8CalCrcVal = 0;
    quint8  u8TempCheck;
    bool bResult = false;
 
    u8TempCheck = stAnsFrm.u8SumCheck % 16;
    u8CrcVal = ((stAnsFrm.u8HiPV + stAnsFrm.u8LoPV + stAnsFrm.u8HiSV + stAnsFrm.u8LoSV +
                 stAnsFrm.u8LoMV + stAnsFrm.u8HiMV + stAnsFrm.u8HiParam + stAnsFrm.u8LoParam +
                 stAnsFrm.u8ALm + u8TempCheck) % 256) / 16;
 
    u8CalCrcVal = stAnsFrm.u8SumCheck / 16;
 
    if(u8CrcVal == u8CalCrcVal)
    {
        bResult = true;
    }
 
    return bResult;
}
 
//读单个参数
bool QComProtocol::ReadParam(quint8 u8DevAddr, quint16 u16DevPara, float & fParaValue)
{
    ANS_FRM_T stAnsFrm;
    if(QComProtocol::ReadParam(u8DevAddr, u16DevPara, stAnsFrm) == ERR_OK)
    {
        int nTempVal = 0;
        nTempVal = QComProtocol::Get2Byte(stAnsFrm.u8LoParam, stAnsFrm.u8HiParam);
        fParaValue = (float)GetSinglePara(nTempVal, u16DevPara);
 
        if(u16DevPara == 0x16)
        {
            u8InputStandard = stAnsFrm.u8LoParam;
        }
        return true;
    }
 
    return false;
}
 
bool QComProtocol::WriteParam(quint8 u8DevAddr, quint16 u16DevPara, float fParaValue)
{
    ANS_FRM_T stAnsFrm;
    int nParaValue = 0;
 
    nParaValue = QComProtocol::GetInputValue(u16DevPara, fParaValue);
 
 
    if(QComProtocol::WriteParam(
                u8DevAddr, u16DevPara,
                (nParaValue & 0xFF), ((nParaValue >> 8) & 0xFF),
                stAnsFrm) == ERR_OK)
    {
        if(u16DevPara == 0x16)
        {
            u8InputStandard = stAnsFrm.u8LoParam;
        }
        return true;
    }
 
    return false;
}
 
int QComProtocol::GetInputValue(quint16 u16DevPara, float fParaValue)
{
    int nRetPara = 1;
    int nTempValue = 0;
 
    switch(u16DevPara)
    {
    case 0:
        nRetPara = fParaValue * 100;
        break;
 
    case 3:
    case 4:
    case 5:
    case 6:
    case 24:
    case 25:
    case 33:
    case 37:
    case 38:
    case 39:
        nTempValue = fParaValue * QComProtocol::GetFactor(u8ResBuff[u8InputStandard]);
        nRetPara = QComProtocol::FloatToInt(nTempValue);
        break;
 
    case 7:
    case 21:
    case 26:
        nRetPara = fParaValue * QComProtocol::GetFactor(u8ResBuff[u8InputStandard]);
        break;
 
    default:
        if(u16DevPara > 50)
        {
            if(u16DevPara % 2)
            {
                nTempValue = fParaValue * QComProtocol::GetFactor(u8ResBuff[u8InputStandard]);
                nRetPara = QComProtocol::FloatToInt(nTempValue);
            }
            else
            {
                nRetPara = fParaValue * QComProtocol::GetFactor(u8ResBuff[u8InputStandard]);
            }
 
        }
        else
        {
            nRetPara = (int)fParaValue;
        }
 
        break;
    }
 
    return nRetPara;
}
 
int QComProtocol::FloatToInt(qint32 nParaValue)
{
    int nRetVal = 0;
    int nTemp = 1;
 
    if(nParaValue < 0)
    {
        nTemp = -1;
        nParaValue = -nParaValue;
    }
 
    if(nParaValue < 10000)
    {
        nRetVal =  nParaValue;
    }
    else if(nParaValue < 100000)
    {
        nRetVal = (nParaValue / 10) + 9000;
    }
    else if(nParaValue < 1000000)
    {
        nRetVal = (nParaValue / 100) + 18000;
    }
    else
    {
        nRetVal = (nParaValue / 1000) + 27000;
    }
 
    return nRetVal * nTemp;
}
 
int QComProtocol::GetFactor(qint8 u8Dpts)
{
    int nRetFactor = 1;
 
    if(u8Dpts == 2) nRetFactor = 100;
    if(u8Dpts == 3) nRetFactor = 1000;
 
    return nRetFactor;
}
 
int QComProtocol::IntToFloat(qint32 n32Value, quint8 u8Value)
{
    int nRetVal = 0;
    int nTemp = 1;
 
    if(n32Value < 0)
    {
        nTemp = -1;
        n32Value = -n32Value;
    }
 
    if(n32Value < 10000)
    {
        nRetVal = n32Value;
    }
    else if(n32Value < 19000)
    {
        nRetVal = (n32Value - 9000) * 10 + u8Value;
    }
    else if(n32Value <28000)
    {
        nRetVal = ((n32Value - 18000) * 10 + u8Value) * 10;
    }
    else
    {
        nRetVal = ((n32Value - 27000) * 10 + u8Value) * 100 ;
    }
 
    return nRetVal * nTemp;
}
 
int QComProtocol::GetSinglePara(qint32 n32Value, quint16 u16DevPara)
{
    int nRetPara = 0;
    int nTempVal = 0;
    int nFactor = 0;
 
    nFactor = QComProtocol::GetFactor(u8ResBuff[u8InputStandard]);
 
    switch(u16DevPara)
    {
    case 0:
        nRetPara = n32Value / 100;
        break;
 
    case 3:
    case 4:
    case 5:
    case 6:
    case 24:
    case 25:
    case 33:
    case 37:
    case 38:
    case 39:
        nTempVal = QComProtocol::IntToFloat(n32Value, 0);
        nRetPara = nTempVal / nFactor;
        break;
 
    case 7:
    case 21:
    case 26:
        nRetPara = n32Value / nFactor;
        break;
 
    default:
        if(u16DevPara > 50)
        {
            if(u16DevPara % 2)
            {
                nTempVal = QComProtocol::IntToFloat(n32Value, 0);
                nRetPara = nTempVal / nFactor;
            }
            else
            {
                nRetPara = nTempVal / 10;
            }
        }
        else
        {
            nRetPara = n32Value;
        }
 
        break;
    }
 
    return nRetPara;
}
 
float QComProtocol::GetPvSv(qint32 n32Value)
{
    float fTemPvSv = 0.0;
    fTemPvSv =  (float)n32Value / QComProtocol::GetFactor(u8ResBuff[u8InputStandard]);
    return fTemPvSv;
 
}
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
#ifndef QCOMPROTOCOL_H
#define QCOMPROTOCOL_H
#include "win_qextserialport.h"
#include "qserialpara.h"
#include "AppFrame.h"
 
 
 
class QComProtocol
{
public:
    QComProtocol();
    ~QComProtocol();
 
    bool myComPortOpen(QSerialParameter &myComPortPara);
 
    bool isOpen();
 
    qint64 ReadData(char *pcReadBuff, qint64 nReadLenth);
    qint64 WriteData(const char *pcWriteBuff, qint64 nWriteLenth);
 
    bool SendFrame(const char *pcFrameBuff, qint64 nFrameSize, int nTimeOut);
    bool ReceiveFrame(char *pcFrameBuff, qint64 nFrameSize, int nTimeOut);
 
    static qint16 Get2Byte(quint8 u8LoByte, quint8 u8HiByte);
 
    //读参数命令接口
    int ReadParam(
            quint8 u8DevAddr,
            quint16 u16DevPara,
            ANS_FRM_T & stAnsFrm);
 
    //写参数命令接口
    int WriteParam(
            quint8 u8DevAddr,
            quint16 u16DevPara,
            quint8 u8LoParam,
            quint8 u8HiParam,
            ANS_FRM_T & stAnsFrm);
 
    int WriteParam(
            quint8 u8DevAddr,
            quint16 u16DevPara,
            quint8 u8LoParam,
            quint8 u8HiParam);
 
    static bool GetSumCheck(ANS_FRM_T stAnsFrm);
    static int GetInputValue(quint16  u16DevPara, float nParaValue);
    static int FloatToInt(qint32 nParaValue);
    static int GetFactor(qint8 u8Dpts);
    static int IntToFloat(qint32 n32Value, quint8 u8Value);
    static float GetPvSv(qint32 n32Value);
 
    int GetSinglePara(qint32 n32Value, quint16 u16DevPara);
 
    bool ReadParam(quint8 u8DevAddr, quint16 u16DevPara, float & fParaValue);
    bool WriteParam(quint8 u8DevAddr, quint16 u16DevPara, float fParaValue);
 
 
private:
 
    Win_QextSerialPort *m_MyComPort;
 
};
 
#endif // QCOMPROTOCOL_H
Выложу тут, пока покавыряюсь, попробую адаптировать под ардуинку.

Добавлено через 2 минуты
Кстати если кто знает, как в Code Blocks отображать китайские комментарии?))

Добавлено через 29 минут
Кому интересно, вот весь файл под Qt : https://yadi.sk/d/Jxgfrwl43RPT6h
0
73 / 86 / 40
Регистрация: 02.11.2017
Сообщений: 379
12.01.2018, 12:44
Первое, что бросается в глаза, это то, что команды чтения и записи у них имеют другие коды.

По поводу коментариев - смотрите настройки кодировки

Добавлено через 38 секунд
Или предварительно исходники прогоните через какой-то промежуточный редактор и поменяйте кодировку в нем.
0
2 / 2 / 0
Регистрация: 12.05.2015
Сообщений: 155
18.01.2018, 12:14  [ТС]
Адаптировал китайский код пож ардуинку, все равно контроллер неотвечает(
Разобрал его, посмотрел, все подключино правильно.
Посмотрите пожалуйста что не так(
Пока пытаюсь добиться от него что он что нибудь читал.
Code
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
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
#include <MsTimer2.h>
#define DIR 8 // переключатель прием\передача
#define RDTYPE                                  (164)
#define WRTYPE                                  (134)
#define ERR_OK          (0)
#define ERR_ERROR       (1)
#define ERR_TIMEOUT       (2)
#define ERR_INVALIED_PARAM                      (3)
 
int totalSek = 0;
 
void to_Timer() {
  totalSek ++;//каждую мл.сек увеличиваем totalSek
}
static uint8_t u8ResBuff[] = {3, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 3, 2, 3, 2, 2, 2};
static uint8_t u8InputStandard = 0;
 
 
struct tag_METERDATA_T
{
  float fAijPV;
  float fAijSV;
  float fAijMv;
  float fAijParam;
  uint8_t u8Alm;
};
 
 
struct tagREQ_FRM_T
{
  uint8_t  u8DevAddr1;
  uint8_t  u8DevAddr2;
  uint8_t  u8ReqType;
  uint8_t  u8DevPara;
  uint8_t  u8LoParam;
  uint8_t u8HiParam;
  uint8_t  u8LoSumCheck;
  uint8_t  u8HiSumCheck;
} ;
 
 
struct tagANS_FRM_T
{
  uint8_t  u8LoPV;
  uint8_t  u8HiPV;
  uint8_t  u8LoSV;
  uint8_t  u8HiSV;
  uint8_t  u8LoMV;
  uint8_t  u8HiMV;
  uint8_t  u8ALm;
  uint8_t  u8LoParam;
  uint8_t  u8HiParam;
  uint8_t  u8SumCheck;
};
 
 
int ReadParam(Stream &p_Serial, uint8_t u8DevAddr, uint16_t u16DevPara, struct tagANS_FRM_T &stAnsFrm)
{
  Serial.println("6");
  struct tagREQ_FRM_T stReqFrm;
  uint32_t n32CheckSum = 0;
  uint8_t u8Temp = 0;
  int nErrCnt = 0;
  int nError = ERR_ERROR;
  u8Temp = u16DevPara % 256;//подозрения
 
  stReqFrm.u8DevAddr1 = 0x80 + u8DevAddr;
  stReqFrm.u8DevAddr2 = 0x80 + u8DevAddr;
  stReqFrm.u8ReqType = RDTYPE + (u16DevPara >> 8);//подозрения
  stReqFrm.u8DevPara = u8Temp;
  stReqFrm.u8LoParam = 0;
  stReqFrm.u8HiParam = 0;
  n32CheckSum = u8DevAddr + (stReqFrm.u8DevPara << 8) + stReqFrm.u8ReqType;
  stReqFrm.u8LoSumCheck = n32CheckSum & 0xff;
  stReqFrm.u8HiSumCheck = ( n32CheckSum >> 8) & 0xff;
 
  while (nErrCnt < 6)
  {
    Serial.println("7");
    if (SendFrame(p_Serial, (const char *)&stReqFrm, sizeof(tagREQ_FRM_T), 200))
    {
      Serial.println("8");
      if (ReceiveFrame(p_Serial, (char *)&stAnsFrm, sizeof(tagANS_FRM_T), 200))
      {
        Serial.println("9");
        if (GetSumCheck(stAnsFrm))
        {
          Serial.println("10");
          if (u16DevPara == 0x16)
          {
            Serial.println("11");
            u8InputStandard = stAnsFrm.u8LoParam;//????что это
          }
          nErrCnt = 10;
          nError = ERR_OK;
        }
      }
    }
    nErrCnt++;
  }
 
  return nError;
}
 
 
bool ReadParam(Stream &p_Serial, uint8_t u8DevAddr, uint16_t u16DevPara, float & fParaValue)//как я понимаю основная функция которой пользуемся
{
  struct tagANS_FRM_T stAnsFrm;
  if (ReadParam(p_Serial, u8DevAddr, u16DevPara, stAnsFrm) == ERR_OK)
  {
    int nTempVal = 0;
    nTempVal = Get2Byte(stAnsFrm.u8LoParam, stAnsFrm.u8HiParam);
    fParaValue = (float)GetSinglePara(nTempVal, u16DevPara);
 
    if (u16DevPara == 0x16)
    {
      u8InputStandard = stAnsFrm.u8LoParam;
    }
    return true;
  }
 
  return false;
}
 
uint16_t Get2Byte(uint8_t u8LoByte, uint8_t u8HiByte)
{
  uint16_t nsValue = 0;
 
  nsValue |= (u8HiByte << 8);
  nsValue &= 0xFF00;
  nsValue |= u8LoByte;
 
  return nsValue;
}
 
int GetSinglePara(uint32_t n32Value, uint16_t u16DevPara)
{
  int nRetPara = 0;
  int nTempVal = 0;
  int nFactor = 0;
 
  nFactor = GetFactor(u8ResBuff[u8InputStandard]);//вот тут
 
  switch (u16DevPara)
  {
    case 0:
      nRetPara = n32Value / 100;
      break;
 
    case 3:
    case 4:
    case 5:
    case 6:
    case 24:
    case 25:
    case 33:
    case 37:
    case 38:
    case 39:
      nTempVal = IntToFloat(n32Value, 0);
      nRetPara = nTempVal / nFactor;
      break;
 
    case 7:
    case 21:
    case 26:
      nRetPara = n32Value / nFactor;
      break;
 
    default:
      if (u16DevPara > 50)
      {
        if (u16DevPara % 2)
        {
          nTempVal = IntToFloat(n32Value, 0);
          nRetPara = nTempVal / nFactor;
        }
        else
        {
          nRetPara = nTempVal / 10;
        }
      }
      else
      {
        nRetPara = n32Value;
      }
 
      break;
  }
 
  return nRetPara;
}
 
int IntToFloat(uint32_t n32Value, uint8_t u8Value)
{
  int nRetVal = 0;
  int nTemp = 1;
 
  if (n32Value < 0)
  {
    nTemp = -1;
    n32Value = -n32Value;
  }
 
  if (n32Value < 10000)
  {
    nRetVal = n32Value;
  }
  else if (n32Value < 19000)
  {
    nRetVal = (n32Value - 9000) * 10 + u8Value;
  }
  else if (n32Value < 28000)
  {
    nRetVal = ((n32Value - 18000) * 10 + u8Value) * 10;
  }
  else
  {
    nRetVal = ((n32Value - 27000) * 10 + u8Value) * 100 ;
  }
 
  return nRetVal * nTemp;
}
 
 
bool GetSumCheck(struct tagANS_FRM_T stAnsFrm)
{
  uint8_t  u8CrcVal = 0;
  uint8_t u8CalCrcVal = 0;
  uint8_t u8TempCheck;
  bool bResult = false;
  Serial.println("20");
  u8TempCheck = stAnsFrm.u8SumCheck % 16;
  u8CrcVal = ((stAnsFrm.u8HiPV + stAnsFrm.u8LoPV + stAnsFrm.u8HiSV + stAnsFrm.u8LoSV +
               stAnsFrm.u8LoMV + stAnsFrm.u8HiMV + stAnsFrm.u8HiParam + stAnsFrm.u8LoParam +
               stAnsFrm.u8ALm + u8TempCheck) % 256) / 16;
 
  u8CalCrcVal = stAnsFrm.u8SumCheck / 16;
 
  if (u8CrcVal == u8CalCrcVal)
  {
    Serial.println("21");
    bResult = true;
  }
  Serial.println("22");
  return bResult;
}
 
int WriteParam(Stream &p_Serial, uint8_t u8DevAddr, uint16_t u16DevPara, uint8_t u8LoParam, uint8_t u8HiParam, struct tagANS_FRM_T &stAnsFrm)
{
  struct tagREQ_FRM_T stReqFrm;
  uint32_t n32CheckSum = 0;
  uint8_t u8Temp = 0;
  int nErrCnt = 0;
  int nError = ERR_ERROR;
  u8Temp = u16DevPara % 256;
 
  stReqFrm.u8DevAddr1 = 0x80 + u8DevAddr;
  stReqFrm.u8DevAddr2 = 0x80 + u8DevAddr;
  stReqFrm.u8ReqType = WRTYPE + (u16DevPara >> 8);
  stReqFrm.u8DevPara = u8Temp;
  stReqFrm.u8LoParam = u8LoParam;
  stReqFrm.u8HiParam = u8HiParam;
  n32CheckSum = u8DevAddr + (stReqFrm.u8DevPara << 8) + stReqFrm.u8ReqType;
  stReqFrm.u8LoSumCheck = n32CheckSum & 0xff;
  stReqFrm.u8HiSumCheck = ( n32CheckSum >> 8) & 0xff;
 
  while (nErrCnt < 6)
  {
    if (SendFrame(p_Serial, (const char *)&stReqFrm, sizeof(struct tagREQ_FRM_T), 200))
    {
      if (ReceiveFrame(p_Serial, (char *)&stAnsFrm, sizeof(struct tagANS_FRM_T), 200))
      {
        if (GetSumCheck(stAnsFrm))
        {
          if (u16DevPara == 0x16)
          {
            u8InputStandard = stAnsFrm.u8LoParam;
          }
 
          nErrCnt = 10;
          nError = ERR_OK;
        }
      }
    }
    nErrCnt++;
  }
 
  return nError;
}
 
bool SendFrame(Stream &p_Serial, const char *pcFrameBuff, uint64_t nFrameSize, int nTimeOut)
{
  /*QTime time;
      time.start();
 
      while((time.elapsed() < nTimeOut) && (nFrameSize > 0))
      {
          qint64 nWriteBytes = WriteData(pcFrameBuff, nFrameSize);
          pcFrameBuff += nWriteBytes;
          nFrameSize -= nWriteBytes;
      }
 
      return (nFrameSize==0);*/
  MsTimer2::set(1, to_Timer); // Здесь задаем период 1 м.секунда
  MsTimer2::start();//Стартуем, теперь таймер запущен
  Serial.println("12");
  while ((totalSek < nTimeOut) && (nFrameSize > 0))
  {
    Serial.println("13");
    uint64_t nWriteBytes = WriteData(p_Serial, pcFrameBuff, nFrameSize);
    pcFrameBuff += nWriteBytes;
    nFrameSize -= nWriteBytes;
    Serial.println((int)nWriteBytes);
    Serial.println((int)pcFrameBuff);
    Serial.println((int)nFrameSize);
 
  }
  totalSek = 0;
  Serial.println("222");
  return (nFrameSize == 0);
}
 
 
bool ReceiveFrame(Stream &p_Serial, char *pcFrameBuff, uint64_t nFrameSize, int nTimeOut)
{
 
  /* QTime Time;
     Time.start();
     qint64 nReadCurCount = 0;
 
     while((Time.elapsed()< nTimeOut) && (nReadCurCount < nFrameSize))
     {
         qint64 nReadBytes = ReadData(pcFrameBuff, nFrameSize);
         pcFrameBuff += nReadBytes;
         nReadCurCount += nReadBytes;
     }
 
     return(nReadCurCount == nFrameSize);
  */
  uint64_t nReadCurCount = 0;
  Serial.println("14");
  MsTimer2::set(1, to_Timer); // Здесь задаем период 1 м.секунда
  MsTimer2::start();//Стартуем, теперь таймер запущен
 
  while ((totalSek  < nTimeOut) && (nReadCurCount < nFrameSize))
  { Serial.println("15");
    uint64_t nReadBytes = ReadData(p_Serial, pcFrameBuff, nFrameSize);
    pcFrameBuff += nReadBytes;
    nReadCurCount += nReadBytes;
  }
  totalSek = 0;
  Serial.println("16");
  return (nReadCurCount == nFrameSize);
}
 
uint64_t WriteData(Stream &p_Serial, const char *pcWriteBuff, uint64_t nWriteLenth)//нужно переписать
{
  digitalWrite(DIR, HIGH); // включаем передачу
  /*qint64 nTempWriteLenth=0;
    if((m_MyComPort != NULL) && (m_MyComPort->isOpen()))
    {
    nTempWriteLenth = m_MyComPort->write(pcWriteBuff, nWriteLenth);
    }
 
    return nTempWriteLenth;//Функция на Qt*/
 
 
  uint64_t nTempWriteLenth = nWriteLenth;
  //if ((m_MyComPort != NULL) && (m_MyComPort->isOpen())) //вот здесь полюбому переписать isOpen
  //{
  Serial.println(11111111);
  p_Serial.write(pcWriteBuff, nWriteLenth);
  // }
 
  return nTempWriteLenth;
}
 
 
uint64_t ReadData(Stream &p_Serial, char *pcReadBuff, uint64_t nReadLenth)//вот эту нужно переписать
{
  digitalWrite(DIR, LOW);
  uint64_t nTempReadLenth = 0;
  Serial.println("88");
  /*if ((m_MyComPort != NULL) && (m_MyComPort->isOpen())) //вот здесь полюбому переписать isOpen
    {
    nTempReadLenth = m_MyComPort->read(pcReadBuff, nReadLenth);//вот с этим не понятно что делать
    }*/
  if (p_Serial.available() > 0) {
  Serial.println("66");
  for (nTempReadLenth = 0; nTempReadLenth <= nReadLenth; nTempReadLenth++) {
    Serial.println("55");
    pcReadBuff[nTempReadLenth] = p_Serial.read();
  }
  }
  return nTempReadLenth;
}
 
//Serial2.write((byte* )&pack, sizeof(pack));
int WriteParam(Stream &p_Serial, uint8_t u8DevAddr, uint16_t u16DevPara, uint8_t u8LoParam, uint8_t u8HiParam)
{
  int nError = ERR_OK;
 
  struct tagANS_FRM_T stAnsFrm;
 
  nError = WriteParam(p_Serial, u8DevAddr, u16DevPara, u8LoParam, u8HiParam, stAnsFrm);
 
  return nError;
}
 
bool WriteParam(Stream &p_Serial, uint8_t u8DevAddr, uint16_t u16DevPara, float fParaValue)//как я понимаю основная функция которой пользуемся
{
  struct tagANS_FRM_T stAnsFrm;
  int nParaValue = 0;
 
  nParaValue = GetInputValue(u16DevPara, fParaValue);
 
 
  if (WriteParam(p_Serial,
                 u8DevAddr, u16DevPara,
                 (nParaValue & 0xFF), ((nParaValue >> 8) & 0xFF),
                 stAnsFrm) == ERR_OK)
  {
    if (u16DevPara == 0x16)
    {
      u8InputStandard = stAnsFrm.u8LoParam;
    }
    return true;
  }
 
  return false;
}
 
int GetInputValue(uint16_t u16DevPara, float fParaValue)
{
  int nRetPara = 1;
  int nTempValue = 0;
 
  switch (u16DevPara)
  {
    case 0:
      nRetPara = fParaValue * 100;
      break;
 
    case 3:
    case 4:
    case 5:
    case 6:
    case 24:
    case 25:
    case 33:
    case 37:
    case 38:
    case 39:
      nTempValue = fParaValue * GetFactor(u8ResBuff[u8InputStandard]);
      nRetPara = FloatToInt(nTempValue);
      break;
 
    case 7:
    case 21:
    case 26:
      nRetPara = fParaValue * GetFactor(u8ResBuff[u8InputStandard]);
      break;
 
    default:
      if (u16DevPara > 50)
      {
        if (u16DevPara % 2)
        {
          nTempValue = fParaValue * GetFactor(u8ResBuff[u8InputStandard]);
          nRetPara = FloatToInt(nTempValue);
        }
        else
        {
          nRetPara = fParaValue * GetFactor(u8ResBuff[u8InputStandard]);
        }
 
      }
      else
      {
        nRetPara = (int)fParaValue;
      }
 
      break;
  }
 
  return nRetPara;
}
 
int GetFactor(uint8_t u8Dpts)
{
  int nRetFactor = 1;
 
  if (u8Dpts == 2) nRetFactor = 100;
  if (u8Dpts == 3) nRetFactor = 1000;
 
  return nRetFactor;
}
 
 
int FloatToInt(uint32_t nParaValue)
{
  int nRetVal = 0;
  int nTemp = 1;
 
  if (nParaValue < 0)
  {
    nTemp = -1;
    nParaValue = -nParaValue;
  }
 
  if (nParaValue < 10000)
  {
    nRetVal =  nParaValue;
  }
  else if (nParaValue < 100000)
  {
    nRetVal = (nParaValue / 10) + 9000;
  }
  else if (nParaValue < 1000000)
  {
    nRetVal = (nParaValue / 100) + 18000;
  }
  else
  {
    nRetVal = (nParaValue / 1000) + 27000;
  }
 
  return nRetVal * nTemp;
}
 
float GetPvSv(uint32_t n32Value)
{
  float fTemPvSv = 0.0;
  fTemPvSv =  (float)n32Value / GetFactor(u8ResBuff[u8InputStandard]);
  return fTemPvSv;
 
}
 
/*Остались одна функция которыя ни где не учавствуют, это настройки порта, мы их зададим в setup:
   bool QComProtocol::myComPortOpen(QSerialParameter &myComPortPara)
  {
    //先判断串口是否存在,如果存在则删除重新创建
    if(m_MyComPort != NULL)
    {
        delete m_MyComPort;
        m_MyComPort = NULL;
    }
 
    m_MyComPort = new Win_QextSerialPort(myComPortPara.m_UartId,QextSerialBase::Polling);
    if( m_MyComPort->open(QIODevice::ReadWrite))
    {
        m_MyComPort->setBaudRate((BaudRateType)myComPortPara.m_UartBaud.toInt());
        m_MyComPort->setDataBits((DataBitsType)myComPortPara.m_UartDataBit.toInt());
        m_MyComPort->setStopBits((StopBitsType)myComPortPara.m_UartStopBit.toInt());
        m_MyComPort->setParity((ParityType)myComPortPara.m_UartParity.toInt());
        m_MyComPort->setFlowControl(FLOW_OFF);
        myComPortPara.isOpen = true;
        return true;
    }
    return false;
 
  }
*/
 
 
void setup() {// дальше я пока не трогал
  Serial.begin(9600);
  Serial2.begin(9600,SERIAL_8N2);
  pinMode(DIR, OUTPUT);
}
 
void loop() {
  tag_METERDATA_T g_stMeterData;
  tagANS_FRM_T stAnsFrm;
  uint16_t u16ParamAddr = 0;
  int nTempVal = 0;
  int nTempPv = 0;
  int nTempSv = 0;
  uint8_t u8Alm = 0;
  if (ReadParam(Serial2, 1, u16ParamAddr, stAnsFrm) == ERR_OK)
  {
#if 1
    Serial.println("2");
    nTempVal = Get2Byte(stAnsFrm.u8LoPV, stAnsFrm.u8HiPV);
    nTempPv = IntToFloat(nTempVal, 0);
    u8Alm = stAnsFrm.u8SumCheck % 16;
    nTempVal = Get2Byte(stAnsFrm.u8LoSV, stAnsFrm.u8HiSV);
 
    nTempSv = IntToFloat(nTempVal, u8Alm);
    nTempPv = nTempSv - nTempPv;
 
    g_stMeterData.fAijPV = GetPvSv(nTempPv);
    g_stMeterData.fAijSV = GetPvSv(nTempSv);
    g_stMeterData.fAijMv = (float)Get2Byte(stAnsFrm.u8LoMV, stAnsFrm.u8HiMV);
    g_stMeterData.u8Alm = stAnsFrm.u8ALm;
#endif
    Serial.println("3");
    nTempVal = Get2Byte(stAnsFrm.u8LoParam, stAnsFrm.u8HiParam);
    g_stMeterData.fAijParam = (float)GetSinglePara(nTempVal, u16ParamAddr);
 
    u16ParamAddr++;
 
    if (u16ParamAddr > 400)
    {
      Serial.println("4");
      u16ParamAddr = 0;
    }
 
  }
  Serial.println("5");
  Serial.println(g_stMeterData.fAijMv);
  delay (200);
}
Добавлено через 1 минуту
Сомнения вызывает вот эта функция:
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
bool ReceiveFrame(Stream &p_Serial, char *pcFrameBuff, uint64_t nFrameSize, int nTimeOut)
{
 
  /* QTime Time;
     Time.start();
     qint64 nReadCurCount = 0;
 
     while((Time.elapsed()< nTimeOut) && (nReadCurCount < nFrameSize))
     {
         qint64 nReadBytes = ReadData(pcFrameBuff, nFrameSize);
         pcFrameBuff += nReadBytes;
         nReadCurCount += nReadBytes;
     }
 
     return(nReadCurCount == nFrameSize);
  */
  uint64_t nReadCurCount = 0;
  Serial.println("14");
  MsTimer2::set(1, to_Timer); // Здесь задаем период 1 м.секунда
  MsTimer2::start();//Стартуем, теперь таймер запущен
 
  while ((totalSek  < nTimeOut) && (nReadCurCount < nFrameSize))
  { Serial.println("15");
    uint64_t nReadBytes = ReadData(p_Serial, pcFrameBuff, nFrameSize);
    pcFrameBuff += nReadBytes;
    nReadCurCount += nReadBytes;
  }
  totalSek = 0;
  Serial.println("16");
  return (nReadCurCount == nFrameSize);
}
Правильно ли я в ней реализовал таймер. Закоментина функция которая у китайцев на Qt для сравнения.
0
73 / 86 / 40
Регистрация: 02.11.2017
Сообщений: 379
18.01.2018, 13:11
А китайцы вам готовую скомпилированную прогу могут дать?
Или может их код скомпилировать получится?

Добавлено через 8 минут
Функцию лучше переписать так:
C++
1
2
3
4
5
6
7
8
....
MsTimer2::set(1, to_Timer); // Здесь задаем период 1 м.секунда
totalSek = 0;
MsTimer2::start();//Стартуем, теперь таймер запущен
....
MsTimer2::stop();
Serial.println("16");
return (nReadCurCount == nFrameSize);
И вызывает большое сомнение отправка сообщений внутри цикла... Может мешать коммуникации. я бы закомментировал.

Весь код не проверял

Добавлено через 3 минуты
Вам бы тему в микроконтроллеры перенести. Там больше вероятность, что подскажут..
0
2 / 2 / 0
Регистрация: 12.05.2015
Сообщений: 155
18.01.2018, 15:50  [ТС]
Я все ни как не куплю свисток на Rs485(, поэтому проверить ее нет возможности. Так то она собирается.
0
2 / 2 / 0
Регистрация: 12.05.2015
Сообщений: 155
22.01.2018, 10:18  [ТС]
Короче пошли пакеты от контроллера, но почему то они не стабильно приходят. Я грешу на таймер. Подскажите реализацию корректную на таймер , а то MsTimer2 че то не хорошо работает.
Тут например:
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
bool ReceiveFrame(Stream &p_Serial, byte *pcFrameBuff, uint64_t nFrameSize, int nTimeOut)
{
 
  /* QTime Time;
     Time.start();
     qint64 nReadCurCount = 0;
 
     while((Time.elapsed()< nTimeOut) && (nReadCurCount < nFrameSize))
     {
         qint64 nReadBytes = ReadData(pcFrameBuff, nFrameSize);
         pcFrameBuff += nReadBytes;
         nReadCurCount += nReadBytes;
     }
 
     return(nReadCurCount == nFrameSize);
  */
 
  uint64_t nReadCurCount = 0;
  Serial.println("14");
  MsTimer2::set(1, to_Timer); // Здесь задаем период 1 м.секунда
  //totalSek = 0;
  MsTimer2::start();//Стартуем, теперь таймер запущен
 
  while ((totalSek  < nTimeOut) && (nReadCurCount < nFrameSize))
  {
    Serial.println(totalSek);
    uint64_t nReadBytes = ReadData(p_Serial, pcFrameBuff, nFrameSize);
    pcFrameBuff += nReadBytes;
    nReadCurCount += nReadBytes;
  }
  MsTimer2::stop();
  totalSek = 0;
  Serial.println("16");
  return (nReadCurCount == nFrameSize);
}
totalSek не обновляется вообще и всегда 0.
0
73 / 86 / 40
Регистрация: 02.11.2017
Сообщений: 379
22.01.2018, 12:48
MsTimer2 - хардварный. Он не может нехорошо работать.

Объявите totalSec как volatile. Должно помочь.
Компиль просто не знает, что переменная обрабатывается в прерывании и упростил код. Этим объявлением мы ему говорим, что переменная может поменяться неизвестным для него способом и нехрен ее упрощать.

C++
1
volatile uint16_t totalSec = 0;
0
2 / 2 / 0
Регистрация: 12.05.2015
Сообщений: 155
22.01.2018, 13:34  [ТС]
Теперь пишет что не объявлена totalSek = 0; в других функциях.....

Добавлено через 3 минуты
Ааа.. все..туплю

Добавлено через 4 минуты
Не хочет все равно(

Добавлено через 1 минуту
MsTimer2::set не вызывает функцию просто(

Добавлено через 19 минут
MsTimer2 не работает с Mega2650. Для Atmega2560 или Teensy надо использовать FlexiTimer2.
Поменял, заработало)) Отлично!
А теперь прошу Вас еще о небольшой помощи) Можете перевести проверку контрольной суммы?
В описании: PV+ SV+MV&alarm status + parameter read/write+check code
В программе :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
bool GetSumCheck(struct tagANS_FRM_T stAnsFrm)
{
  uint8_t  u8CrcVal = 0;
  uint8_t u8CalCrcVal = 0;
  uint8_t u8TempCheck;
  bool bResult = false;
  Serial.println("20");
  u8TempCheck = stAnsFrm.u8SumCheck % 16;
  u8CrcVal = ((stAnsFrm.u8HiPV + stAnsFrm.u8LoPV + stAnsFrm.u8HiSV + stAnsFrm.u8LoSV +
               stAnsFrm.u8LoMV + stAnsFrm.u8HiMV + stAnsFrm.u8HiParam + stAnsFrm.u8LoParam +
               stAnsFrm.u8ALm + u8TempCheck) % 256) / 16;
               
 
  u8CalCrcVal = stAnsFrm.u8SumCheck / 16;
 
  if (u8CrcVal == u8CalCrcVal)
  {
    Serial.println("21");
    bResult = true;
  }
  Serial.println("22");
  return bResult;
}
Что то мне подсказывает, что это не правильно)
0
73 / 86 / 40
Регистрация: 02.11.2017
Сообщений: 379
22.01.2018, 13:58
ну, довольно странно, что сумма 16-битная, а считают они как 8-битную. И в одном месте у них остаток, а в другом деление. Вообще бред какой-то. Но если у них это работает... То возможно в описании что-то не то. Надо тестировать оба варианта. Ваш и их. Какой заведется.
0
2 / 2 / 0
Регистрация: 12.05.2015
Сообщений: 155
22.01.2018, 14:22  [ТС]
Ну их точне не работает, так как на этом месте как раз ни один пакет проверку не проходит....

Добавлено через 1 минуту
Пардон, вот формула проверки : Is the remainder acquired after calculating the formula:
PV+SV+( Alarm status×256+MV)+ parameter read/written + ADDR

Добавлено через 14 минут
Да, я и не заметил, Вы хотите сказать что должно быть так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
struct tagANS_FRM_T
{
  uint8_t  u8LoPV;
  uint8_t  u8HiPV;
  uint8_t  u8LoSV;
  uint8_t  u8HiSV;
  uint8_t  u8MV;
  uint8_t  u8ALm;
  uint8_t  u8LoParam;
  uint8_t  u8HiParam;
  uint8_t  u8LoSumCheck;
  uint8_t  u8HiSumCheck;
};
и исходя из описания:
PV+SV+( Alarm status×256+MV)+ parameter read/written + ADDR
Получается так:
Get2Byte(stAnsFrm.u8HiPV,stAnsFrm.u8LoPV )+Get2Byte(stAnsFrm.u8HiSV,stAnsFrm.u8Lo SV)+(stAnsFrm.u8ALm*256+stAnsFrm.u8MV)+8 2+1
0
73 / 86 / 40
Регистрация: 02.11.2017
Сообщений: 379
22.01.2018, 16:21
Да, похоже на то. Коды команд все-таки те, что в руководстве или китайские?
0
2 / 2 / 0
Регистрация: 12.05.2015
Сообщений: 155
22.01.2018, 16:44  [ТС]
В руководстве, в китайской программе они их почему то на 2 умножили.
0
2 / 2 / 0
Регистрация: 12.05.2015
Сообщений: 155
27.01.2018, 14:05  [ТС]
огромное спасибо за помощь! Все получилось!
Ардуинка принимает и отправляет данные на этот чернов контроллер.
Ноооо....
Возникла проблема, которая очень неприятная.
Раньше у меня другая ардуинка общалась с нано и включала-выключала клапан охлаждения, а нано отправляла температуру охлаждения на мегу. Общалась так же по 485 , находится далеко от компьютера. И все было хорошо, до того момента, как я не обьеденил два скейтча в один(общение с нано и с китайским контроллером). Причем проблемы начались у нано. Т,е, толи Мега после слияния не отправляет данные(но читает, температура с нано приходит), толи нано не читает что ей отправляеют.
Понимаю что код уже стал объемный, выложу как было до и как стало после. Может что увидите, потому что без охлаждения, смысл теряет вся эта конструкция....((((
Скейт на нано, ничего не менялось:
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
#include <SoftwareSerial.h>
#include <OneWire.h>
 
 
#define DIR 4 // переключатель прием\передача
#define ON 1 // вкл. клапан
#define OFF 0 // вкл. клапан
#define PUMP 5 // вкл. клапан
 
 
OneWire ds(10);
 
struct packet_arduino_pomp //пакет Arduino nano
{
  byte start_byte_one;//в коротком пакете равен 212
  byte start_byte_two;//в коротком пакете равен 211
  byte temp_pomp;//температура охлаждения
  byte on_of_pomp;//on-off насоса (1 или 0)
  byte tmp;//пока не трогаем
  byte CRC8;//контрольная сумма
  /*упаковать*/
  void pask()
  {
    CRC8 = (start_byte_one + start_byte_two + temp_pomp + on_of_pomp + tmp) / 10;
  }
  /*проверка упаковки*/
  bool test_pask()
  {
    if (CRC8 == (start_byte_one + start_byte_two + temp_pomp + on_of_pomp + tmp) / 10) return 0; //ОК
    return -1; // ошибка
  }
};
 
 
static packet_arduino_pomp one = {212, 211, 0, 0, 0, 0}; //пакет с данными
byte temp_pomp = 0;//переменная для хранения температуры
 
SoftwareSerial RS485 (2, 3); // RX, TX
 
void setup()
{
  Serial.begin(9600);
  RS485.begin(9600); // SoftwareSerial
 
  pinMode(DIR, OUTPUT);
  pinMode(PUMP, OUTPUT);
}
 
void loop()
{
 
  byte* ptr28 = (byte* )&one;
  digitalWrite(DIR, LOW); // включаем прием
  byte data[2];
  ds.reset();
  ds.write(0xCC);
  ds.write(0x44);
 
  delay(150);
 
  if (RS485.available() >= sizeof(packet_arduino_pomp))
  {
 
    Serial.println("1");
    byte buf_pump = 0;
    for (size_t i = 0; i < sizeof(packet_arduino_pomp); i++)
    {
      Serial.println("2");
      if (i == 0 && (buf_pump = RS485.read()) != 212)
      {
        Serial.println("3");
        i = 0;
        continue;
      }
      if (i == 1 && (buf_pump = RS485.read()) != 211)
      {
        Serial.println("4");
        i = 0;
        continue;
      }
      if (i >= 2)
      {
        Serial.println("5");
        ptr28[i] = RS485.read();
        if (i == sizeof(packet_arduino_pomp) - 1)
        {
          Serial.println("6");
          if (one.test_pask()) //проверяем контрольную сумму
          {
            i = 0;
            continue;
          }
        }
 
      }
    }
    Serial.println("ON");
    for (size_t i = 0; i < sizeof(packet_arduino_pomp); i++)
    {
      Serial.println(ptr28[i]);
    }
    Serial.println("END");
    if (one.on_of_pomp == ON) // включим клапан
    {
      digitalWrite(PUMP, HIGH); //  включим клапан
    }
    else if (one.on_of_pomp == OFF)
      digitalWrite(PUMP, LOW);
  }
  //  delay(50);
  ds.reset();
  ds.write(0xCC);
  ds.write(0xBE);
  data[0] = ds.read();
  data[1] = ds.read();
  int Temp = (data[1] << 8) + data[0];
  Temp = Temp >> 4;
  one.temp_pomp = Temp;//записываем значение температуры охлаждения в пакет на отправку
  one.pask();//формируем контрольную сумму
  digitalWrite(DIR, HIGH); // включаем передачу
  //delay(100);
  RS485.write(ptr28, sizeof(packet_arduino_pomp));
}
Скейт на ардуино до написания общения с китайским контроллером:
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
#include <SoftwareSerial.h>
 
#define DIR 8 // переключатель прием\передача
#define BUT 49
 
bool read_package_nano(Stream &, byte*);
bool read_package_pc(Stream &, byte*);
 
struct packet_big //пакет PC
{
    byte start_byte_one;//в длинном пакете равен 254
    byte start_byte_two;//в длинном пакете равен 232
    byte temp_pomp;//температура охлаждения
    byte on_of_pomp;//on-off насоса (1 или 0)
    byte ex_temp_reactor;//текущая температура в реакторе
    byte current_temp_reactor;//выставленная температура в реакторе
    byte timer_ex;//таймер
    byte tmp;//пока не трогаем
    byte CRC8;//пока не трогаем
    void pask()
    {
        CRC8 = (start_byte_one + start_byte_two + temp_pomp + on_of_pomp + ex_temp_reactor + current_temp_reactor + timer_ex + tmp) / 10;
    }
    /*проверка упаковки*/
    bool test_pask()
    {
        if (CRC8 == ((start_byte_one + start_byte_two + temp_pomp + on_of_pomp + ex_temp_reactor + current_temp_reactor + timer_ex + tmp)) / 10) return 0; //ОК
        return -1; // ошибка
    }
};
 
struct packet_arduino_pomp //пакет Arduino nano
{
 
    byte start_byte_one;//в коротком пакете равен 212
    byte start_byte_two;//в коротком пакете равен 211
    byte temp_pomp;//температура охлаждения
    byte on_of_pomp;//on-off насоса (1 или 0)
    byte tmp;//пока не трогаем
    byte CRC8;//пока не трогаем
    /*упаковать*/
    void pask()
    {
        CRC8 = (start_byte_one + start_byte_two + temp_pomp + on_of_pomp + tmp) / 10;
    }
    /*проверка упаковки*/
    bool test_pask()
    {
        if (CRC8 == (start_byte_one + start_byte_two + temp_pomp + on_of_pomp + tmp) / 10) return 0; //ОК
        return -1; // ошибка
    }
};
 
packet_big one = {254, 232, 0, 0, 0, 0, 0, 0, 0};
packet_arduino_pomp one_pomp = {212, 211, 0, 0, 0, 0};
 
 
byte buttonState = 0;
 
void setup()
{
    Serial.begin(9600);//на PC
    Serial2.begin(9600); // SoftwareSerial на Arduino nano
    pinMode(BUT, INPUT);
    pinMode(DIR, OUTPUT);
}
 
void loop()
{
    digitalWrite(DIR, HIGH); // включаем передачу
    buttonState = digitalRead(BUT); //кнопка
    byte* ptr28 = (byte* )&one;
    byte *ptr_pomp = (byte*)&one_pomp;
    read_package_pc(Serial, ptr28);
    if (buttonState == HIGH) //вкл/выкл от кнопки
    {
        if (one.on_of_pomp == 0) //если выключен , то перезаписываем в пакете (включаем)
            one.on_of_pomp = 1;
        else if (one.on_of_pomp == 1) //если включен, то перезаписываем в пакете (выключаем)
            one.on_of_pomp = 0;
    }
 
    one_pomp.on_of_pomp = one.on_of_pomp;
    one.temp_pomp=one_pomp.temp_pomp;
    one.pask();
    Serial.write(ptr28,sizeof(packet_big)); //передаем на PC
    one_pomp.pask();
    Serial2.write(ptr_pomp, sizeof(packet_arduino_pomp)); //передаем на Arduino nano
    delay(50);
 
    digitalWrite(DIR, LOW); // включаем прием
    //прием с PC данных всех команд, включая информацию о температуре с реактора
 
    //возможно нужно повторно записать стартовый бит.
    //прием с ардуино nano данных о вкл/ вкл насоса и температуры охлаждения
    delay(50);
 
    if (read_package_nano(Serial2, ptr_pomp))
    {
       /*Serial.println("ON");
        for (size_t i = 0; i < sizeof(packet_arduino_pomp); i++)
        {
            Serial.println( ptr_pomp[i]);
        }
        Serial.println("END");*/
    }
}
 
 
 
 
bool read_package_nano(Stream &p_Serial, byte* fptr)
{
    if (p_Serial.available() >= sizeof(packet_arduino_pomp))
    {
 
        byte buf_pump = 0;
        for (size_t i = 0; i < sizeof(packet_arduino_pomp); i++)
        {
            if (i == 0 && (buf_pump = p_Serial.read()) != 212)
            {
                i = 0;
                continue;
            }
            if (i == 1 && (buf_pump = p_Serial.read()) != 211)
            {
                i = 0;
                continue;
            }
            if (i >= 2)
            {
                buf_pump = p_Serial.read();
                fptr[i] = buf_pump;
                if (i == sizeof(packet_arduino_pomp) - 1)
                {
                    if (one_pomp.test_pask()) //проверяем контрольную сумму
                    {
                        i = 0;
                        return 0;
                    }
                    return 1;
                }
 
            }
        }
    }
}
 
 
 
bool read_package_pc(Stream &p_Serial, byte* fptr)
{
    if (p_Serial.available() >= sizeof(packet_big))
    {
 
        byte buf_pump = 0;
        for (size_t i = 0; i < sizeof(packet_big); i++)
        {
            if (i == 0 && (buf_pump = p_Serial.read()) != 254)
            {
                i = 0;
                continue;
            }
            if (i == 1 && (buf_pump = p_Serial.read()) != 232)
            {
                i = 0;
                continue;
            }
            if (i >= 2)
            {
                buf_pump = p_Serial.read();
                fptr[i] = buf_pump;
                if (i == sizeof(packet_big) - 1)
                {
                    if (one.test_pask()) //проверяем контрольную сумму
                    {
                        i = 0;
                        return 0;
                    }
                    return 1;
                }
 
            }
        }
    }
}
0
2 / 2 / 0
Регистрация: 12.05.2015
Сообщений: 155
27.01.2018, 14:07  [ТС]
Скейтч после:
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
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
#include <SoftwareSerial.h>
#include <FlexiTimer2.h>
 
#define DIR2 8 // переключатель прием\передача
#define DIR3 9 // переключатель прием\передача
#define BUT 49
#define RDTYPE                                  (82)
#define WRTYPE                                  (67)
#define ERR_OK          (0)
#define ERR_ERROR       (1)
#define ERR_TIMEOUT       (2)
#define ERR_INVALIED_PARAM                      (3)
 
volatile int totalSec = 0;
uint16_t Val = 0; //значение для записи
void to_Timer() {
  totalSec ++;//каждую мл.сек увеличиваем totalSek
}
static uint8_t u8ResBuff[] = {3, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 3, 2, 3, 2, 2, 2};
static uint8_t u8InputStandard = 0;
 
bool read_package_nano(Stream &, byte*);
bool read_package_pc(Stream &, byte*);
int sensorValue = 0;
 
struct tag_METERDATA_T
{
  float fAijPV;
  float fAijSV;
  float fAijMv;
  float fAijParam;
  uint8_t u8Alm;
};
 
 
struct tagREQ_FRM_T
{
  uint8_t  u8DevAddr1;
  uint8_t  u8DevAddr2;
  uint8_t  u8ReqType;
  uint8_t  u8DevPara;
  uint8_t  u8LoParam;
  uint8_t u8HiParam;
  uint8_t  u8LoSumCheck;
  uint8_t  u8HiSumCheck;
} ;
struct tagANS_FRM_T
{
  uint8_t  u8LoPV;
  uint8_t  u8HiPV;
  uint8_t  u8LoSV;
  uint8_t  u8HiSV;
  uint8_t  u8MV;
  uint8_t  u8ALm;
  uint8_t  u8LoParam;
  uint8_t  u8HiParam;
  uint8_t  u8LoSumCheck;
  uint8_t  u8HiSumCheck;
};
 
struct packet_big //пакет PC
{
  byte start_byte_one;//в длинном пакете равен 254
  byte start_byte_two;//в длинном пакете равен 232
  byte temp_pomp;//температура охлаждения
  byte on_of_pomp;//on-off насоса (1 или 0)
  byte ex_temp_reactor;//текущая температура в реакторе
  byte current_temp_reactor;//выставленная температура в реакторе
  byte timer_ex;//таймер
  byte tmp;//пока не трогаем
  byte CRC8;//пока не трогаем
  void pask()
  {
    CRC8 = (start_byte_one + start_byte_two + temp_pomp + on_of_pomp + ex_temp_reactor + current_temp_reactor + timer_ex + tmp) / 10;
  }
  /*проверка упаковки*/
  bool test_pask()
  {
    if (CRC8 == ((start_byte_one + start_byte_two + temp_pomp + on_of_pomp + ex_temp_reactor + current_temp_reactor + timer_ex + tmp)) / 10) return 0; //ОК
    return -1; // ошибка
  }
};
 
struct packet_arduino_pomp //пакет Arduino nano
{
 
  byte start_byte_one;//в коротком пакете равен 212
  byte start_byte_two;//в коротком пакете равен 211
  byte temp_pomp;//температура охлаждения
  byte on_of_pomp;//on-off насоса (1 или 0)
  byte tmp;//пока не трогаем
  byte CRC8;//пока не трогаем
  /*упаковать*/
  void pask()
  {
    CRC8 = (start_byte_one + start_byte_two + temp_pomp + on_of_pomp + tmp) / 10;
  }
  /*проверка упаковки*/
  bool test_pask()
  {
    if (CRC8 == (start_byte_one + start_byte_two + temp_pomp + on_of_pomp + tmp) / 10) return 0; //ОК
    return -1; // ошибка
  }
};
 
packet_big one = {254, 232, 0, 0, 0, 0, 0, 0, 0};
packet_arduino_pomp one_pomp = {212, 211, 0, 0, 0, 0};
 
 
byte buttonState = 0;
 
void setup()
{
  Serial.begin(9600);//на PC
  Serial2.begin(9600); // SoftwareSerial на Arduino nano
  Serial3.begin(9600, SERIAL_8N2);
  pinMode(BUT, INPUT);
  pinMode(DIR2, OUTPUT);
  pinMode(DIR3, OUTPUT);
  pinMode (A1, INPUT);
}
 
void loop()
{
  tagANS_FRM_T stAnsFrm = {0};
  uint16_t u16ParamAddr = 0;
  int nTempVal = 0;
  int nTempPv = 0;
  int nTempSv = 0;
  uint8_t u8Alm = 0;
  int Val = 0;//значение для записи
  uint8_t loVal = 0; //младший байт для записи
  uint8_t hiVal = 0; //старший байт для записи
 
  sensorValue = analogRead (1);
  
  
  buttonState = digitalRead(BUT); //кнопка
  
  byte* ptr28 = (byte* )&one;//приводим структуру у массиву байт
  byte *ptr_pomp = (byte*)&one_pomp;
 
 
  if (ReadParam(Serial3, 1, u16ParamAddr, stAnsFrm) == ERR_OK)
  {
    nTempVal = Get2Byte(stAnsFrm.u8LoPV, stAnsFrm.u8HiPV);
    nTempPv = IntToFloat(nTempVal, 0);
    u8Alm = Get2Byte(stAnsFrm.u8LoSumCheck, stAnsFrm.u8LoSumCheck) % 16; // stAnsFrm.u8SumCheck % 16;
    nTempVal = Get2Byte(stAnsFrm.u8LoSV, stAnsFrm.u8HiSV);
    nTempSv = IntToFloat(nTempVal, u8Alm);
  }
  delay (10);
 
  read_package_pc(Serial, ptr28);//читаем с COM порта
 
  if ((int)nTempSv / 10 != (int)one.current_temp_reactor) {
    Val = one.current_temp_reactor;
    Val = Val * 10;
    loVal = Val & 0xff;
    hiVal = ( Val >> 8) & 0xff;
 
    WriteParam(Serial3, 1, 0, loVal, hiVal, stAnsFrm);
  }
 
  if (sensorValue >= 739 && sensorValue < 800) //вкл/выкл от кнопки
  {
    if (one.on_of_pomp == 0) //если выключен , то перезаписываем в пакете (включаем)
      one.on_of_pomp = 1;
    else if (one.on_of_pomp == 1) //если включен, то перезаписываем в пакете (выключаем)
      one.on_of_pomp = 0;
  }
 
  one.temp_pomp = one_pomp.temp_pomp;
  one.ex_temp_reactor = (int)nTempPv / 10;
 
  one.pask();
  Serial.write(ptr28, sizeof(packet_big)); //передаем на PC
  one_pomp.pask();
  digitalWrite(DIR2, HIGH); // включаем передачу
  Serial2.write(ptr_pomp, sizeof(packet_arduino_pomp)); //передаем на Arduino nano
  delay(50);
    
  digitalWrite(DIR2, LOW); // включаем прием
  //прием с PC данных всех команд, включая информацию о температуре с реактора
 
  //возможно нужно повторно записать стартовый бит.
  //прием с ардуино nano данных о вкл/ вкл насоса и температуры охлаждения
  read_package_nano(Serial2, ptr_pomp);
}
 
 
 
 
bool read_package_nano(Stream &p_Serial, byte* fptr)
{
  if (p_Serial.available() >= sizeof(packet_arduino_pomp))
  {
 
    byte buf_pump = 0;
    for (size_t i = 0; i < sizeof(packet_arduino_pomp); i++)
    {
      if (i == 0 && (buf_pump = p_Serial.read()) != 212)
      {
        i = 0;
        continue;
      }
      if (i == 1 && (buf_pump = p_Serial.read()) != 211)
      {
        i = 0;
        continue;
      }
      if (i >= 2)
      {
        buf_pump = p_Serial.read();
        fptr[i] = buf_pump;
        if (i == sizeof(packet_arduino_pomp) - 1)
        {
          if (one_pomp.test_pask()) //проверяем контрольную сумму
          {
            i = 0;
            return 0;
          }
          return 1;
        }
 
      }
    }
  }
}
 
 
 
bool read_package_pc(Stream &p_Serial, byte* fptr)
{
  if (p_Serial.available() >= sizeof(packet_big))
  {
 
    byte buf_pump = 0;
    for (size_t i = 0; i < sizeof(packet_big); i++)
    {
      if (i == 0 && (buf_pump = p_Serial.read()) != 254)
      {
        i = 0;
        continue;
      }
      if (i == 1 && (buf_pump = p_Serial.read()) != 232)
      {
        i = 0;
        continue;
      }
      if (i >= 2)
      {
        buf_pump = p_Serial.read();
        fptr[i] = buf_pump;
        if (i == sizeof(packet_big) - 1)
        {
          if (one.test_pask()) //проверяем контрольную сумму
          {
            i = 0;
            return 0;
          }
          return 1;
        }
 
      }
    }
  }
}
 
 
 
//Коннект к контроллеру
 
 
int WriteParam(Stream &p_Serial, uint8_t u8DevAddr, uint16_t u16DevPara, uint8_t u8LoParam, uint8_t u8HiParam, struct tagANS_FRM_T &stAnsFrm)
{
  struct tagREQ_FRM_T stReqFrm;
  uint32_t n32CheckSum = 0;
  uint8_t u8Temp = 0;
  int nErrCnt = 0;
  int nError = ERR_ERROR;
  u8Temp = u16DevPara % 256;
 
  stReqFrm.u8DevAddr1 = 0x80 + u8DevAddr;
  stReqFrm.u8DevAddr2 = 0x80 + u8DevAddr;
  stReqFrm.u8ReqType = WRTYPE;
  stReqFrm.u8DevPara = u8Temp;
  stReqFrm.u8LoParam = u8LoParam;
  stReqFrm.u8HiParam = u8HiParam;
  n32CheckSum = u8DevAddr + (stReqFrm.u8DevPara << 8) + stReqFrm.u8ReqType + Get2Byte(stReqFrm.u8LoParam , stReqFrm.u8HiParam);
  //Parameter code to be written  ?256 + 67+ parameter to be written + ADDR
  stReqFrm.u8LoSumCheck = n32CheckSum & 0xff;
  stReqFrm.u8HiSumCheck = ( n32CheckSum >> 8) & 0xff;
 
  while (nErrCnt < 6)
  {
    if (SendFrame(p_Serial, (const byte *)&stReqFrm, sizeof(struct tagREQ_FRM_T), 200))
    {
      if (ReceiveFrame(p_Serial, (byte *)&stAnsFrm, sizeof(struct tagANS_FRM_T), 200))
      {
        if (GetSumCheck(stAnsFrm))
        {
          if (u16DevPara == 0x16)
          {
            u8InputStandard = stAnsFrm.u8LoParam;
          }
 
          nErrCnt = 10;
          nError = ERR_OK;
        }
      }
    }
    nErrCnt++;
  }
 
  return nError;
}
 
int ReadParam(Stream &p_Serial, uint8_t u8DevAddr, uint16_t u16DevPara, struct tagANS_FRM_T &stAnsFrm)
{
  struct tagREQ_FRM_T stReqFrm;
  uint32_t n32CheckSum = 0;
  uint8_t u8Temp = 0;
  int nErrCnt = 0;
  int nError = ERR_ERROR;
  u8Temp = u16DevPara % 256;//подозрения
 
  stReqFrm.u8DevAddr1 = 0x80 + u8DevAddr;
  stReqFrm.u8DevAddr2 = 0x80 + u8DevAddr;
  stReqFrm.u8ReqType = RDTYPE;
  stReqFrm.u8DevPara = 0;
  stReqFrm.u8LoParam = 0;
  stReqFrm.u8HiParam = 0;
  n32CheckSum = u8DevAddr + (stReqFrm.u8DevPara << 8) + stReqFrm.u8ReqType;
  stReqFrm.u8LoSumCheck = n32CheckSum & 0xff;
  stReqFrm.u8HiSumCheck = ( n32CheckSum >> 8) & 0xff;
 
  while (nErrCnt < 6)
  {
    if (SendFrame(p_Serial, (const byte *)&stReqFrm, sizeof(tagREQ_FRM_T), 200))
    {
      if (ReceiveFrame(p_Serial, (byte *)&stAnsFrm, sizeof(tagANS_FRM_T), 200))
      {
        if (GetSumCheck(stAnsFrm))
        {
          if (u16DevPara == 0x16)
          {
            u8InputStandard = stAnsFrm.u8LoParam;//????что это
          }
          nErrCnt = 10;
          nError = ERR_OK;
        }
      }
    }
    nErrCnt++;
  }
 
  return nError;
}
 
 
bool ReadParam(Stream &p_Serial, uint8_t u8DevAddr, uint16_t u16DevPara, float & fParaValue)//как я понимаю основная функция которой пользуемся
{
  struct tagANS_FRM_T stAnsFrm;
  if (ReadParam(p_Serial, u8DevAddr, u16DevPara, stAnsFrm) == ERR_OK)
  {
    int nTempVal = 0;
    nTempVal = Get2Byte(stAnsFrm.u8LoParam, stAnsFrm.u8HiParam);
    fParaValue = (float)GetSinglePara(nTempVal, u16DevPara);
 
    if (u16DevPara == 0x16)
    {
      u8InputStandard = stAnsFrm.u8LoParam;
    }
    return true;
  }
 
  return false;
}
 
uint16_t Get2Byte(uint8_t u8LoByte, uint8_t u8HiByte)
{
  uint16_t nsValue = 0;
 
  nsValue |= (u8HiByte << 8);
  nsValue &= 0xFF00;
  nsValue |= u8LoByte;
 
  return nsValue;
}
 
int GetSinglePara(uint32_t n32Value, uint16_t u16DevPara)
{
  int nRetPara = 0;
  int nTempVal = 0;
  int nFactor = 0;
 
  nFactor = GetFactor(u8ResBuff[u8InputStandard]);//вот тут
 
  switch (u16DevPara)
  {
    case 0:
      nRetPara = n32Value / 100;
      break;
 
    case 3:
    case 4:
    case 5:
    case 6:
    case 24:
    case 25:
    case 33:
    case 37:
    case 38:
    case 39:
      nTempVal = IntToFloat(n32Value, 0);
      nRetPara = nTempVal / nFactor;
      break;
 
    case 7:
    case 21:
    case 26:
      nRetPara = n32Value / nFactor;
      break;
 
    default:
      if (u16DevPara > 50)
      {
        if (u16DevPara % 2)
        {
          nTempVal = IntToFloat(n32Value, 0);
          nRetPara = nTempVal / nFactor;
        }
        else
        {
          nRetPara = nTempVal / 10;
        }
      }
      else
      {
        nRetPara = n32Value;
      }
 
      break;
  }
 
  return nRetPara;
}
 
int IntToFloat(uint32_t n32Value, uint8_t u8Value)
{
  int nRetVal = 0;
  int nTemp = 1;
 
  if (n32Value < 0)
  {
    nTemp = -1;
    n32Value = -n32Value;
  }
 
  if (n32Value < 10000)
  {
    nRetVal = n32Value;
  }
  else if (n32Value < 19000)
  {
    nRetVal = (n32Value - 9000) * 10 + u8Value;
  }
  else if (n32Value < 28000)
  {
    nRetVal = ((n32Value - 18000) * 10 + u8Value) * 10;
  }
  else
  {
    nRetVal = ((n32Value - 27000) * 10 + u8Value) * 100 ;
  }
 
  return nRetVal * nTemp;
}
 
 
bool GetSumCheck(struct tagANS_FRM_T stAnsFrm)
{
  uint8_t  u8CrcVal = 0;
  uint8_t u8CalCrcVal = 0;
  uint8_t u8TempCheck;
  bool bResult = false;
  u8TempCheck = Get2Byte(stAnsFrm.u8LoSumCheck, stAnsFrm.u8LoSumCheck); //stAnsFrm.u8SumCheck % 16;
  u8CrcVal =         Get2Byte(stAnsFrm.u8LoPV, stAnsFrm.u8HiPV) + Get2Byte(stAnsFrm.u8LoSV, stAnsFrm.u8HiSV) +
                     (stAnsFrm.u8ALm * 256 + stAnsFrm.u8MV) + Get2Byte(stAnsFrm.u8LoParam, stAnsFrm.u8HiParam) + 1;
  u8CalCrcVal = Get2Byte(stAnsFrm.u8LoSumCheck, stAnsFrm.u8LoSumCheck); // stAnsFrm.u8SumCheck / 16;
 
  if (u8CrcVal == u8CalCrcVal)
  {
    bResult = true;
  }
  return bResult;
}
 
 
bool SendFrame(Stream &p_Serial, const byte *pcFrameBuff, uint64_t nFrameSize, int nTimeOut)
{
  FlexiTimer2::set(1, 1000, to_Timer); // Здесь задаем период 1 м.секунда
  totalSec = 0;
  FlexiTimer2::start();//Стартуем, теперь таймер запущен
  while ((totalSec < nTimeOut) && (nFrameSize > 0))
  {
    uint64_t nWriteBytes = WriteData(p_Serial, pcFrameBuff, nFrameSize);
    pcFrameBuff += nWriteBytes;
    nFrameSize -= nWriteBytes;
  }
  totalSec = 0;
  FlexiTimer2::stop();
  return (nFrameSize == 0);
}
 
 
bool ReceiveFrame(Stream &p_Serial, byte *pcFrameBuff, uint64_t nFrameSize, int nTimeOut)
{
  uint64_t nReadCurCount = 0;
  FlexiTimer2::set(1, 1000, to_Timer); // Здесь задаем период 1 м.секунда
  totalSec = 0;
  FlexiTimer2::start();//Стартуем, теперь таймер запущен
 
  while ((totalSec  < nTimeOut) && (nReadCurCount < nFrameSize))
  {
    uint64_t nReadBytes = ReadData(p_Serial, pcFrameBuff, nFrameSize);
    pcFrameBuff += nReadBytes;
    nReadCurCount += nReadBytes;
  }
  totalSec = 0;
  FlexiTimer2::stop();
  return (nReadCurCount == nFrameSize);
}
 
uint64_t WriteData(Stream &p_Serial, const byte *pcWriteBuff, uint64_t nWriteLenth)//нужно переписать
{
  digitalWrite(DIR3, HIGH); // включаем передачу
  uint64_t nTempWriteLenth = nWriteLenth;
  delay(20);
  p_Serial.write(pcWriteBuff, nWriteLenth);
  // }
 
  delay(50);
 
  return nTempWriteLenth;
}
 
 
uint64_t ReadData(Stream &p_Serial, byte *pcReadBuff, uint64_t nReadLenth)//вот эту нужно переписать
{
  digitalWrite(DIR3, LOW);//включить прием
  uint64_t nTempReadLenth = 0;
  delay(50);
  if (p_Serial.available() > 0) {
    for (nTempReadLenth = 0; nTempReadLenth < nReadLenth; nTempReadLenth++) {
      pcReadBuff[nTempReadLenth] = p_Serial.read();
    }
  }
  delay(30);
  return nTempReadLenth;
}
 
int WriteParam(Stream &p_Serial, uint8_t u8DevAddr, uint16_t u16DevPara, uint8_t u8LoParam, uint8_t u8HiParam)
{
  int nError = ERR_OK;
 
  struct tagANS_FRM_T stAnsFrm;
 
  nError = WriteParam(p_Serial, u8DevAddr, u16DevPara, u8LoParam, u8HiParam, stAnsFrm);
 
  return nError;
}
 
bool WriteParam(Stream &p_Serial, uint8_t u8DevAddr, uint16_t u16DevPara, float fParaValue)//как я понимаю основная функция которой пользуемся
{
  struct tagANS_FRM_T stAnsFrm;
  int nParaValue = 0;
 
  nParaValue = GetInputValue(u16DevPara, fParaValue);
 
 
  if (WriteParam(p_Serial,
                 u8DevAddr, u16DevPara,
                 (nParaValue & 0xFF), ((nParaValue >> 8) & 0xFF),
                 stAnsFrm) == ERR_OK)
  {
    if (u16DevPara == 0x16)
    {
      u8InputStandard = stAnsFrm.u8LoParam;
    }
    return true;
  }
 
  return false;
}
 
int GetInputValue(uint16_t u16DevPara, float fParaValue)
{
  int nRetPara = 1;
  int nTempValue = 0;
 
  switch (u16DevPara)
  {
    case 0:
      nRetPara = fParaValue * 100;
      break;
 
    case 3:
    case 4:
    case 5:
    case 6:
    case 24:
    case 25:
    case 33:
    case 37:
    case 38:
    case 39:
      nTempValue = fParaValue * GetFactor(u8ResBuff[u8InputStandard]);
      nRetPara = FloatToInt(nTempValue);
      break;
 
    case 7:
    case 21:
    case 26:
      nRetPara = fParaValue * GetFactor(u8ResBuff[u8InputStandard]);
      break;
 
    default:
      if (u16DevPara > 50)
      {
        if (u16DevPara % 2)
        {
          nTempValue = fParaValue * GetFactor(u8ResBuff[u8InputStandard]);
          nRetPara = FloatToInt(nTempValue);
        }
        else
        {
          nRetPara = fParaValue * GetFactor(u8ResBuff[u8InputStandard]);
        }
 
      }
      else
      {
        nRetPara = (int)fParaValue;
      }
 
      break;
  }
 
  return nRetPara;
}
 
int GetFactor(uint8_t u8Dpts)
{
  int nRetFactor = 1;
 
  if (u8Dpts == 2) nRetFactor = 100;
  if (u8Dpts == 3) nRetFactor = 1000;
 
  return nRetFactor;
}
 
 
int FloatToInt(uint32_t nParaValue)
{
  int nRetVal = 0;
  int nTemp = 1;
 
  if (nParaValue < 0)
  {
    nTemp = -1;
    nParaValue = -nParaValue;
  }
 
  if (nParaValue < 10000)
  {
    nRetVal =  nParaValue;
  }
  else if (nParaValue < 100000)
  {
    nRetVal = (nParaValue / 10) + 9000;
  }
  else if (nParaValue < 1000000)
  {
    nRetVal = (nParaValue / 100) + 18000;
  }
  else
  {
    nRetVal = (nParaValue / 1000) + 27000;
  }
 
  return nRetVal * nTemp;
}
 
float GetPvSv(uint32_t n32Value)
{
  float fTemPvSv = 0.0;
  fTemPvSv =  (float)n32Value / GetFactor(u8ResBuff[u8InputStandard]);
  return fTemPvSv;
 
}
Добавлено через 1 минуту
Я на финишной прямой....решив эту проблему напишу отчет подробный))) но надо ее решить, смысл был в автоматизации охлаждения, а он сейчас не фурычит(((((
0
73 / 86 / 40
Регистрация: 02.11.2017
Сообщений: 379
29.01.2018, 11:45
Цитата Сообщение от MaximusL Посмотреть сообщение
C++
1
bool test_pask() { if (CRC8 == ((start_byte
У вас здесь чему бы не равнялся результат выражения, если он не равен 0, то вернуть 0. Вы уверены, что именно это хотели написать?
К тому же, возвращать -1 или какое-то любое значение, отличное от нуля при ошибке в этой функции нет смысла. она возвращает тип bool.

C++
1
buttonState = digitalRead(BUT); //кнопка
Что у вас там за кнопка? тактовая? какой-нибудь фильтр хардварный на ней висит? Если кнопка просто заведена на ногу ардуины, то гуглить про дребезг контактов и как с ним бороться.

Цитата Сообщение от MaximusL Посмотреть сообщение
u8Temp = u16DevPara % 256;//подозрения
можно просто написть
C++
1
u8Temp = u16DevPara;
Все лишнее и так отпадет. А на что подозрения?
+ не увидел, где вы это используете в конечном варианте

Цитата Сообщение от MaximusL Посмотреть сообщение
u8InputStandard = stAnsFrm.u8LoParam;//????что это
Это ваша объявленная структура
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
struct tagANS_FRM_T
{
  uint8_t  u8LoPV;
  uint8_t  u8HiPV;
  uint8_t  u8LoSV;
  uint8_t  u8HiSV;
  uint8_t  u8MV;
  uint8_t  u8ALm;
  uint8_t  u8LoParam;
  uint8_t  u8HiParam;
  uint8_t  u8LoSumCheck;
  uint8_t  u8HiSumCheck;
};
По коду пробежал вскользь. Если что, пишите
0
2 / 2 / 0
Регистрация: 12.05.2015
Сообщений: 155
31.01.2018, 16:58  [ТС]
По поводу
C++
1
2
3
4
5
6
  /*проверка упаковки*/
  bool test_pask()
  {
    if (CRC8 == ((start_byte_one + start_byte_two + temp_pomp + on_of_pomp + ex_temp_reactor + current_temp_reactor + timer_ex + tmp)) / 10) return 0; //ОК
    return -1; // ошибка
  }
Если CRC8 столько же сколько и вывела формула, то все ок и return 0, если нет то 1; Что не так? Проверка контрольной суммы просто идет так:
C++
1
2
3
4
5
if (one_pomp.test_pask()) //проверяем контрольную сумму
          {
            return 0;
          }
          return 1;
Кнопку я вообще убрал пока и почистил код, тот что от китайцев достался, там вообще половину ненужного)))
Спасибо Вам большое за помощь! Все работает вроде! Очень круто, потому что на работе экономит часа 2-3 времени в день) На Qt программу тоже сделал, тоже все ок. Только я не предвидел что нужно будет отсылась не в byte температуру, а в dyble, чтобы дробное число отображало ( я хочу чтобы на компе рисовался график реакции в реальном времени).
Для этого мне лучше как переделать структуру так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  byte start_byte_one;//в длинном пакете равен 254
  byte start_byte_two;//в длинном пакете равен 232
  byte temp_pomp;//температура охлаждения
  byte on_of_pomp;//on-off насоса (1 или 0)
  byte ex_temp_reactor1;//текущая температура в реакторе
  byte ex_temp_reactor2;//текущая температура в реакторе
  byte ex_temp_reactor3;//текущая температура в реакторе
  byte ex_temp_reactor4;//текущая температура в реакторе
  byte ex_temp_reactor5;//текущая температура в реакторе
  byte ex_temp_reactor6;//текущая температура в реакторе
  byte ex_temp_reactor7;//текущая температура в реакторе
  byte ex_temp_reactor8;//текущая температура в реакторе
  byte current_temp_reactor;//выставленная температура в реакторе
  byte timer_ex;//таймер
  byte tmp;//пока не трогаем
  byte CRC8;//пока не трогаем
Или :
C++
1
2
3
4
5
6
7
8
9
byte start_byte_one;//в длинном пакете равен 254
  byte start_byte_two;//в длинном пакете равен 232
  byte temp_pomp;//температура охлаждения
  byte on_of_pomp;//on-off насоса (1 или 0)
  double  ex_temp_reactor;//текущая температура в реакторе
  byte current_temp_reactor;//выставленная температура в реакторе
  byte timer_ex;//таймер
  byte tmp;//пока не трогаем
  byte CRC8;//пока не трогаем
Во втором случае просто, если мне память не изменяет, не факт что в этом порядке пойдут данные, если я запихну в структуру переменную больше, типо выравнивание и т.д.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
31.01.2018, 16:58

Как в четырехбайтовом числе поменять местами старший и младший байт?
Помогите пожалуйста! Как в четырехбайтовом числе поменять местами старший и младший байт

Как получить младший (старший) байт целого числа (2-байтового)?
Как получить младший (старший) байт целого числа (2-байтового) Есть код в delphi var PG_1, PG_2 : Word; PG: Byte; Block:...

Вывести старший и младший байт заданного целого положительного числа в шестнадцатиричном и двоичном виде
Дано целое положительное число , тип int. Вывести старший и младший байт в 16ом и в 2ом виде.

Для целого числа А выделить старший байт и поставить его на место младшего байта. старший байт при этом обнулить.
Помогите пожалуйста, вообще не могу понять как делать следующее...Еще и в программе CODE BLOCKS препод почему именно эту программу...

Асемблер AVR Stydio. Найти сумму чисел 9701 и 32. Младший байт результата умножить на 4.
7. Найти сумму чисел 9701 и 32. Младший байт результата умножить на 4. Поместить старший байт в порт PORTC. Сбросить младшую тетраду байта...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru