上位机遥控器端蓝牙串口做为master,下位机蓝牙串口做slave。串口参数:
- 波特率:9600
- 停止位:1
- 校验方式:偶校验
- 帧长度:2 byte
每一帧数据有3 byte,分为 起始帧,指令帧,数据帧,如图:
其中一帧数据分为控制位和数据位,控制位占一帧数据的前4bit,数据位占一帧数据的后12bit。
数据位为%3.1f
类型的浮点数乘以10之后强制转换成uint16_t
的数据,大小为0~999
控制位指示数据位的类型,占4bit
Value | Note |
---|---|
0x01 | 数据位为温度设定值 |
0x02 | 数据位为温度当前值 |
0x04 | 重置温度最低值 |
typedef struct
{
/* 帧头 */
uint8_t frameheader;
/* 高位和低位 */
uint8_t hbit;
uint8_t lbit;
}UartDataFrame_t;
UartDataFrame_t UartDataFrame = {0xa5, 0x00, 0x00};
合成发送数据帧:
float tempf;
uint8_t tempi= (int16_t)(tempf * 10);
uint8_t construction;
// 合成两个uint8_t数据
UartDataFrame.hbit = (uint8_t)(construction << 4 | tempi >> 8);
UartDataFrame.lbit = (uint8_t)(tempi & 0x00ff);
void BT_Uart_Send(UartDataFrame_t udf)
{
ES = 0;
uart_send(udf.frameheader);
uart_send(udf.hbit);
uart_send(udf.lbit);
ES = 1;
}
还原接收数据帧:
uint16_t tempi = ((uint16_t)Hbit << 8 | (uint16_t)Lbit);
uint8_t construction = Hbit >> 4;