帧头为0xFF ,帧尾为0d 0a
注意
每个页面仅建议在一个定时器中读取串口缓冲区的数据,在多个定时器中读取串口缓冲区的数据容易照成逻辑混乱。
u[1]为AA时代表每次传输灯的状态,每帧9字节
u[1]为AB时代表传输当前温度值,每帧7字节
u[2]代表这帧的长度
//含义:当前传输的是灯的数据,9字节长度,4个灯状态分别为:开、开、开、开
FF AA 09 01 01 01 01 0D 0A
//含义:当前传输的是灯的数据,9字节长度,4个灯状态分别为:关、关、关、关
FF AA 09 00 00 00 00 0D 0A
//含义:当前传输的是灯的数据,9字节长度,4个灯状态分别为:关、开、关、开
FF AA 09 00 01 00 01 0D 0A
//含义:当前传输的是灯的数据,9字节长度,4个灯状态分别为:开、关、开、关
FF AA 09 01 00 01 00 0D 0A
//含义:当前传输的是温度的数据(小端模式),7字节长度,温度值是03E8,转换为10进制是1000
FF AB 07 E8 03 0D 0A
//含义:当前传输的是温度的数据(小端模式),7字节长度,温度值是FFB0,转换为10进制是-80
FF AB 07 B0 FF 0D 0A
program.s中的配置如图所示
//以下代码只在上电时运行一次,一般用于全局变量定义和上电初始化数据
//全局变量定义目前仅支持4字节有符号整形(int),不支持其他类型的全局变量声明,如需使用字符串类型可以在页面中使用变量控件来实现
int sys0=0,sys1=0,sys2=0
//最短一帧的数据
int shortestLength=7
int frameLength,getFrameFlag
bauds=115200 //波特率256000
recmod=1 //打开主动解析
page 0 //上电刷新第0页
解析定时器(tim为50)中的代码如下图所示
while(usize>=shortestLength&&getFrameFlag==0)
{
frameLength=u[2]
if(usize>=frameLength&&u[0]==0xff&&u[frameLength-2]==0x0d&&u[frameLength-1]==0x0a)
{
//找到帧头,退出循环
getFrameFlag=1
printh ae
}else
{
//如果帧头不对,就一直删除1个字节,直到不满足条件退出循环
udelete 1
printh af
}
}
if(getFrameFlag!=0)
{
if(u[1]==0xAA)
{
n1.val=u[3]
n2.val=u[4]
n3.val=u[5]
n4.val=u[6]
}else if(u[1]==0xAB)
{
sys0=0 //必须清零,否则否则高字节有数据时将会错误
ucopy sys0,3,2,0
//判断温度值的正负,大于32767为负数,通过负数补码获取原码
if(sys0>32767)
{
sys0-=65536
}
x0.val=sys0
}
udelete frameLength //删除已经解析过的数据
getFrameFlag=0 //清空标记变量
}
不定长hex-示例2-样例工程下载
演示工程下载链接: