例12:帧头为55 aa,定长hex-点灯2
注意
每个页面仅建议在一个定时器中读取串口缓冲区的数据,在多个定时器中读取串口缓冲区的数据容易照成逻辑混乱。
新建一个空白工程
在工程中新建一个定时器tmDecode,tim设置为50,en设置为1,用于定时解析串口数据
图片控件p0和p1用来显示两个灯的状态
注意
16进制发送时,可以忽略大小写,ff和FF是一样的,AA和aa是一样的,但是请不要写成Ff,Ab这样大小写混用
55 aa 01 01 02 00 //左边图片变红,右边图片变黑(id为1的控件使用id为1的图片,id为2的控件使用id为0的图片)
55 aa 01 02 02 03 //左边图片变黄,右边图片变蓝(id为1的控件使用id为2的图片,id为2的控件使用id为3的图片)
55 aa 01 01 02 01 //左边图片变红右边图片变红
55 aa 01 00 02 04 //左边图片变黑右边图片变绿
program.s中的配置如图所示
1//以下代码只在上电时运行一次,一般用于全局变量定义和上电初始化数据
2//全局变量定义目前仅支持4字节有符号整形(int),不支持其他类型的全局变量声明,如需使用字符串类型可以在页面中使用变量控件来实现
3int sys0=0,sys1=0,sys2=0
4//frameLength:每帧数据长度
5//getFrameFlag:是否找到帧头或帧尾标记
6int frameLength=6,getFrameFlag
7bauds=115200 //波特率115200
8recmod=1 //打开主动解析
9page 0 //上电刷新第0页
解析定时器(tim为50)中的代码如下图所示
while(usize>=frameLength&&getFrameFlag==0)
{
if(u[0]==0x55&&u[1]==0xaa)//包头为0x55aa
{
//找到帧头,退出循环
getFrameFlag=1
}else
{
//如果帧头不对,就一直删除1个字节,直到不满足条件退出循环
udelete 1
}
}
if(getFrameFlag==1)
{
b[u[2]].pic=u[3]
b[u[4]].pic=u[5]
//下面将串口缓冲区的各个数据写到屏幕的控件中方便观看
sys2=0
for(sys1=n0.id;sys1<=n5.id;sys1++)
{
b[sys1].val=u[sys2]
sys2++
}
udelete frameLength //删除已经解析过的数据
getFrameFlag=0 //清空标记变量
}
定长hex-点灯2-样例工程下载
演示工程下载链接: