项目需求
这是我们的五月项目,我负责的是LoRa_Node 和 LoRa_AP部分
1.我要利用各种传感器采集相关消防节点数据,
2.然后我要利用STM8通过LoRa接受传感器节点的数据,
3.最后我要把节点数据通过串口发出去给IoT网关。
涉及到发送、接收数据,无论是用串口还是socket发送,一定都会要考虑到数据格式。数据格式有个人自定义的,也有市面上通用的、规定好的。郭工给我们说了一种比较好用的格式:TLV格式。
Prefix(1B) Tag(1B) Length(1B) Value(依赖L) CRC16
Prefix: 0xFE
Tag: 0x01: 温度 0x02: 温湿度 0x03: 门开关
如果是温度: length: 2B
如果是温湿度: Length: 4B(2B温度+2B相对湿度)
如果是门开关: Length: 1B
CRC16: 校验 Prefix~Value
TLV格式
TLV是一种可变格式,意思为:Tag--类型, Lenght--长度,Value--值
Tag和Length的长度固定,一般那是2、4个字节(这里统一采用4个字节);
Value的长度由Length指定;
我采集的数据种类有1.温度 2.湿度 3.气压 4.水位 5...,这属于tag,一般为0x01 0x02 0x03 ..
假设:采集到的一组温度数据为34.12°C,温度传感器量程为:-55~125℃我要将这组数据用字节流发送出去,应该怎么规定呢?
T:采集温度类型的数据:0x01
L: 温度的值为两个字节:0x02
V:(1)温度有±,所以留出最高位为符号位,(0表示正温度,1表示负温度),即 (_ XXX XXXX)b 所以温度范围为-2^7---+2^7
即:-127~+127°C;(2)整数部分:34——32+2=>(0010 0010)=>0X22 ;小数部分:12——0x0C;
综上所述,这个TLV格式的温度数据为: 0x01 0x02 0X22 0x0C
为了防止数据丢失后全部乱套,一般采用添加加帧头数据0XFE,和最后的校验位CRC的方法。
即完整的一帧报文为:0XFE 0x01 0x02 0X22 0x0C CRC
我们获取数据可能的结果如下:
1.完美数据:0XFE 0x01 0x02 0X22 0x0C CRC
2.垃圾数据+完美数据:0x33 0XFE 0x01 0x02 0X22 0x0C CRC
3.继续接收是完美的数据(含TLV)中任意3个字节:0XFE 0x01 0x02 0X22
那么我们怎么确定呢?读buf[]