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 + 协议中温度位置);