传输不定长的字符串

注意

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

帧头为0xFF

u[1]为00时代表传输给t0,u[1]为01时代表传输给t1

u[2]代表字符串的长度

//含义:给t0文本赋值为“淘晶驰电子”,文本长度10,1汉字占2字节
FF 00 0A CC D4 BE A7 B3 DB B5 E7 D7 D3

//含义:给t1文本赋值为“TJC”,文本长度3
FF 01 03 54 4A 43

program.s中的配置如图所示

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

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

 1while(usize>=shortestLength&&getFrameFlag==0)
 2{
 3  strLength=u[2]
 4  frameLength=strLength+3
 5  if(u[0]==0xFF&&usize>=frameLength)
 6  {
 7    //找到帧头,退出循环
 8    getFrameFlag=1
 9  }else
10  {
11    //如果帧头不对,就一直删除1个字节,直到不满足条件退出循环
12    udelete 1
13  }
14}
15if(getFrameFlag==1)
16{
17  if(u[1]==0x00)
18  {
19    ucopy t0.txt,3,strLength,0
20  }else if(u[1]==0x01)
21  {
22    ucopy t1.txt,3,strLength,0
23  }
24  udelete frameLength //删除已经解析过的数据
25  getFrameFlag=0 //清空标记变量
26}

不定长hex-示例3-样例工程下载

演示工程下载链接:

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