例11:有两种帧头为0x47和0x4E ,帧尾为0x0d,0x0a,每帧长度22字节

注意

每个页面仅建议在一个定时器中读取串口缓冲区的数据,在多个定时器中读取串口缓冲区的数据容易照成逻辑混乱。

新建一个空白工程

在工程中新建一个定时器tmDecode,tim设置为50,en设置为1,用于定时解析串口数据

新建文本字控件msg和t0,用于显示解析出来的数据,变量控件str0设置为字符串类型,用于临时存储解析出来的数据

注意

16进制发送时,可以忽略大小写,ff和FF是一样的,AA和aa是一样的,但是请不要写成Ff,Ab这样大小写混用

//4E开头的指令
4E 20 20 20 20 20 20 20 20 20 30 2E 30 30 30 30 20 67 20 20 0D 0A

//47开头的指令
47 20 20 20 20 20 20 20 20 20 30 2E 30 30 30 30 20 67 20 20 0D 0A

program.s中的配置如图所示

1//以下代码只在上电时运行一次,一般用于全局变量定义和上电初始化数据
2//全局变量定义目前仅支持4字节有符号整形(int),不支持其他类型的全局变量声明,如需使用字符串类型可以在页面中使用变量控件来实现
3int sys0=0,sys1=0,sys2=0
4//frameLength:每帧数据长度
5//getFrameFlag:是否找到帧头或帧尾标记
6int frameLength=22,getFrameFlag
7bauds=115200 //波特率115200
8recmod=1    //打开主动解析
9page 0                       //上电刷新第0页

解析定时器(tim为50)中的代码如下图所示

 1while(usize>=frameLength&&getFrameFlag==0)
 2{
 3  if(u[0]==0x47&&u[20]==0x0d&&u[21]==0x0a)
 4  {
 5    //找到帧头0x47,退出循环
 6    getFrameFlag=1
 7  }else if(u[0]==0x4e&&u[20]==0x0d&&u[21]==0x0a)
 8  {
 9    //找到帧头0x4e,退出循环
10    getFrameFlag=2
11  }else
12  {
13    //如果帧头不对,就一直删除1个字节,直到不满足条件退出循环
14    udelete 1
15  }
16}
17if(getFrameFlag==1)
18{
19  t0.txt=""
20  msg.txt="收到的是47开头的"
21  for(sys0=0;sys0<=21;sys0++)
22  {
23    covx u[sys0],str0.txt,0,2
24    t0.txt+=str0.txt
25    t0.txt+=" "
26  }
27  udelete frameLength //删除已经解析过的数据
28  getFrameFlag=0 //清空标记变量
29}else if(getFrameFlag==2)
30{
31  t0.txt=""
32  msg.txt="收到的是4E开头的"
33  for(sys0=0;sys0<=21;sys0++)
34  {
35    covx u[sys0],str0.txt,0,2
36    t0.txt+=str0.txt
37    t0.txt+=" "
38  }
39  udelete frameLength //删除已经解析过的数据
40  getFrameFlag=0 //清空标记变量
41}

定长hex-示例11-样例工程下载

演示工程下载链接:

《定长hex-示例11》演示工程下载