不定长-帧头为0x55 ,帧尾为3个0xff

注意

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

假设串口屏获取4个led灯的开关状态,串口屏需要解析的参数为灯的状态(开或关)

并且还要解析一个值为-32768到32767范围的温度值

u[1]为AA时代表每次传输灯的状态,每帧9字节

u[2]为AB时代表传输当前温度值,每帧7字节

//含义:当前传输的是灯的数据,4个灯状态分别为:开、开、开、开
55 AA 01 01 01 01 ff ff ff

//含义:当前传输的是灯的数据,4个灯状态分别为:关、关、关、关
55 AA 00 00 00 00 ff ff ff

//含义:当前传输的是灯的数据,4个灯状态分别为:关、开、关、开
55 AA 00 01 00 01 ff ff ff

//含义:当前传输的是灯的数据,4个灯状态分别为:开、关、开、关
55 AA 01 00 01 00 ff ff ff

//含义:当前传输的是温度的数据(小端模式),温度值是03E8,转换为10进制是1000
55 AB E8 03 FF FF FF

//含义:当前传输的是温度的数据(小端模式),温度值是FFB0,转换为10进制是-80
55 AB B0 FF FF FF FF

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)
{
  if(usize>=9&&u[0]==0x55&&u[1]==0xAA&&u[6]==0xFF&&u[7]==0xFF&&u[8]==0xFF)
  {
    //找到帧头,退出循环
    getFrameFlag=1
    frameLength=9
  }else if(usize>=7&&u[0]==0x55&&u[1]==0xAB&&u[4]==0xFF&&u[5]==0xFF&&u[6]==0xFF)
  {
    //找到帧头,退出循环
    getFrameFlag=2
    frameLength=7
  }else
  {
    //如果帧头不对,就一直删除1个字节,直到不满足条件退出循环
    udelete 1
  }
}
if(getFrameFlag!=0)
{
  if(getFrameFlag==1)
  {
    n1.val=u[2]
    n2.val=u[3]
    n3.val=u[4]
    n4.val=u[5]
  }else if(getFrameFlag==2)
  {
    sys0=0  //必须清零,否则否则高字节有数据时将会错误
    ucopy sys0,2,2,0
    //判断温度值的正负,大于32767为负数,通过负数补码获取原码
    if(sys0>32767)
    {
      sys0-=65536
    }
    x0.val=sys0 //x0是一个虚拟浮点数控件
  }
  udelete frameLength //删除已经解析过的数据
  getFrameFlag=0 //清空标记变量
}

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

演示工程下载链接:

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