VC大大们,帮帮小弟啊该怎么处理
VC大大们,帮帮小弟啊
我在工作中遇到一个问题,大大们帮帮忙啊~~~
在串口通讯中,我发送一个指令,如:CC 01 04 04 01 00 FF E0 BA DD(十六进制命令帧),对面就会返回一个数值,如:CC 01 04 0C 00 14 21 90 21 4A 01 4B 46 5D 01 00 00 2A D8 DD (应答帧,同上),通过下面的一个协议,我怎么将返回的应答帧翻译成具体的数据(温湿度),就是我怎样得到应答帧中的5D 01 然后通过计算公式将它转换成温(湿)度?是要写一个算法或者函数么?有人能帮我写个函数么~~~~谢谢了!!!
1.PLC读取数据命令帧格式
帧头 1
采集器地址 1
命令 1
起始寄存器地址 2(L-H)
读取数据长度 2(L-H)
CRC 2(L-H)
帧尾 1
单位:字节
注意:双字节数据均为低位字节?谇?,高位字节在后.
帧头: CCH
采集器地址: 1—1FH
<命令>---为04H.
起始寄存器地址: 0100H,0104H
建议: 此地址最好为偶数值,以保证读取完整的数据.如0100H,0104H
读取数据长度: FF00H(读取所有数据)
若读取数据长度超过采集器的最大数据区长度,则采集器返回其实际长度的数据.
CRC: CRC16格式, 包括:采集器地址+命令+起始寄存器地址+长度
帧尾: DDH
允许命令格式:
1.CC-XX-04-00-01-04-00-XX-XX-DD (起始寄存器:0100H, 数据长度:0004H) 读配置
2.CC-XX-04-00-01-00-FF-XX-XX-DD (起始寄存器:0100H, 数据长度:FF00H) 读配置+数据
3.CC-XX-04-04-01-00-FF-XX-XX-DD (起始寄存器:0104H, 数据长度:FF00H) 读数据
1A.采集器应答帧:
帧头 CCH
采集器地址 1-1FH
命令 04H
数据长度 XXXXH
数据 XXH
CRC XXXXH
帧尾 DDH
其中<长度>为实际数据长度, 2字节。
CRC: CRC16格式, 包括:采集器地址+命令+数据长度+数据
------解决方案--------------------
CC 01 04 0C 00 14 21 90 21 4A 01 4B 46 5D 01 00 00 2A D8 DD
在上面的响应帧中数据长度为0x0C,12个数据,其中5D 01是这12个数据中的第9和第10个
这个命令的响应帧中数据长度固定?而且温度数据的位置也固定?
------解决方案--------------------
根据双方约定的温度格式,比如:
1.温度是一个字节,那么:
5D 01就代表两个温度值,这是没有偏移量和倍率
2.温度是两个字节,低在前高在后,那么:
温度=0x015d=359
如果有倍率和偏移量,比如:温度=接收数据*/10-40;
那么实际温度=359/10-40=-4.1
由双方定义温度如何转换
------解决方案--------------------
接收的缓冲区为buffer.
温度 = *(short *)(buffer + 协议中温度位置);
------解决方案--------------------
上面我默认温度为2个字节了
一个字节就是
*(char *)(buffer + 协议中温度位置);
四个字节就是
*(int *)(buffer + 协议中温度位置);
温度都是带符号的
------解决方案--------------------
接收的缓冲区为buffer.
温度 = *(short *)(buffer + 协议中温度位置);
我在工作中遇到一个问题,大大们帮帮忙啊~~~
在串口通讯中,我发送一个指令,如:CC 01 04 04 01 00 FF E0 BA DD(十六进制命令帧),对面就会返回一个数值,如:CC 01 04 0C 00 14 21 90 21 4A 01 4B 46 5D 01 00 00 2A D8 DD (应答帧,同上),通过下面的一个协议,我怎么将返回的应答帧翻译成具体的数据(温湿度),就是我怎样得到应答帧中的5D 01 然后通过计算公式将它转换成温(湿)度?是要写一个算法或者函数么?有人能帮我写个函数么~~~~谢谢了!!!
1.PLC读取数据命令帧格式
帧头 1
采集器地址 1
命令 1
起始寄存器地址 2(L-H)
读取数据长度 2(L-H)
CRC 2(L-H)
帧尾 1
单位:字节
注意:双字节数据均为低位字节?谇?,高位字节在后.
帧头: CCH
采集器地址: 1—1FH
<命令>---为04H.
起始寄存器地址: 0100H,0104H
建议: 此地址最好为偶数值,以保证读取完整的数据.如0100H,0104H
读取数据长度: FF00H(读取所有数据)
若读取数据长度超过采集器的最大数据区长度,则采集器返回其实际长度的数据.
CRC: CRC16格式, 包括:采集器地址+命令+起始寄存器地址+长度
帧尾: DDH
允许命令格式:
1.CC-XX-04-00-01-04-00-XX-XX-DD (起始寄存器:0100H, 数据长度:0004H) 读配置
2.CC-XX-04-00-01-00-FF-XX-XX-DD (起始寄存器:0100H, 数据长度:FF00H) 读配置+数据
3.CC-XX-04-04-01-00-FF-XX-XX-DD (起始寄存器:0104H, 数据长度:FF00H) 读数据
1A.采集器应答帧:
帧头 CCH
采集器地址 1-1FH
命令 04H
数据长度 XXXXH
数据 XXH
CRC XXXXH
帧尾 DDH
其中<长度>为实际数据长度, 2字节。
CRC: CRC16格式, 包括:采集器地址+命令+数据长度+数据
------解决方案--------------------
CC 01 04 0C 00 14 21 90 21 4A 01 4B 46 5D 01 00 00 2A D8 DD
在上面的响应帧中数据长度为0x0C,12个数据,其中5D 01是这12个数据中的第9和第10个
这个命令的响应帧中数据长度固定?而且温度数据的位置也固定?
------解决方案--------------------
根据双方约定的温度格式,比如:
1.温度是一个字节,那么:
5D 01就代表两个温度值,这是没有偏移量和倍率
2.温度是两个字节,低在前高在后,那么:
温度=0x015d=359
如果有倍率和偏移量,比如:温度=接收数据*/10-40;
那么实际温度=359/10-40=-4.1
由双方定义温度如何转换
------解决方案--------------------
接收的缓冲区为buffer.
温度 = *(short *)(buffer + 协议中温度位置);
------解决方案--------------------
上面我默认温度为2个字节了
一个字节就是
*(char *)(buffer + 协议中温度位置);
四个字节就是
*(int *)(buffer + 协议中温度位置);
温度都是带符号的
------解决方案--------------------
接收的缓冲区为buffer.
温度 = *(short *)(buffer + 协议中温度位置);