接收报文
1、接收报文
以读取机芯温度报文为例:AA 04 01 7C 00 2B EB AA
AA:命令头
04:从命令字0到校验的字节数;
01:命令字0;
7C:命令字1;
00:操作符;
2B:校验;
EB AA:命令尾
2、总结
1)上面报文中的粗体部分为固定不变的部分,操作符00代表读,01代表写;
2)接收报文重点关注命令字1和操作符;
3、示例代码
luCMD = uartCMDBuf[3];
luOperateCode = uartCMDBuf[4];
switch (luCMD)
{
case IR_FEATURE_NUC_Avr_TIF:
{
if(luOperateCode == IR_OPERATE_READ)
{
lu8tmp = UserParameter->NUC_Avr_TIF;
oparetSend(IR_FEATURE_NUC_Avr_TIF, &lu8tmp, 1);
}
else
{
UserParameter->NUC_Avr_TIF = uartCMDBuf[5];
writeAvr_TIF(UserParameter->NUC_Avr_TIF);
sndBuf_WrOpOk(IR_FEATURE_NUC_Avr_TIF);
}
break;
}
}
返回报文
1、以返回机芯温度报文为例:55 06 7C 33 C6 0B 03 DE EB AA
55:命令头;
06:从命令字0到校验的字节数;
7C:命令字0;
33:操作符;
DE:校验;
EB AA:命令尾;
2、总结
1)上面报文中的粗体部分为固定不变的部分,需要特别注意的是
a) 返回报文没有命令字1,只有命令字0,命令字0为接收报文中的命令字1;
b) 返回报文中操作符固定为33;
2)返回报文重点关注命令字0和数据域;
3、示例代码
举例1
功能:通用返回报文;
特点:全部字节都是可以确定的(命令字只需要提取接收报文中的命令,然后填入返回报文就可以);
void sndBuf_WrOpOk(IR_FEATURE irFeather)
{
u8 tmp[10];
tmp[0] = FRAME_START_ACK;
tmp[1] = 0x04;
tmp[2] = irFeather;
tmp[3] = 0x33;
tmp[4] = CMD_CORRECT;
tmp[5] = Get_DRC(tmp,tmp[1]);
tmp[6] = 0xeb;
tmp[7] = 0xaa;
sndBufWr(tmp,(tmp[1]+4));
if(uart_num==1)
{
uart_send_string((tmp[1]+4),sndBuf);
}
else
{
uart2_send_stringlens((tmp[1]+4),sndBuf);
}
}
举例2
功能:返回机芯温度及温区;
特点:前4个字节是确定的(命令字只需要提取接收报文中的命令,然后填入返回报文就可以),后3个字节是确定的;
static void sndBuf_WrENVTemp(void)
{
u16 ls16Temperature = 0;
u8 tmp[10];
if(UserParameter->WenChuan_type==0)
{
ls16Temperature=tmp116_function()*100;
}
else
{
ls16Temperature=M117_Read()*100;
}
tmp[0] = FRAME_START_ACK;
tmp[1] = 6;
tmp[2] = IR_FEATURE_NS_TEMP_ENV;
tmp[3] = 0x33;
tmp[4] = ls16Temperature;
tmp[5] = (ls16Temperature>>8);
tmp[6] = get_temperature_range();
tmp[7] = Get_DRC(tmp,6);
tmp[8] = 0xeb;
tmp[9] = 0xaa;
sndBufWr(tmp,10);
if(uart_num==1)
{
uart_send_string(10,sndBuf);
}
else
{
uart2_send_stringlens(10,sndBuf);
}
}