1.实验目的
通过串口屏实现字符串协议解析。
2.实验工具
- 任意三易串口屏,本例程采用的型号为SANY-WQ-S43-02M-C
- VP开发软件
3.页面设计
3.1page0:
3.2控件功能简介:
控件名称 | 控件类型 | 控件功能 |
datagrid1 | 数据表格 可见 | string数据类型,显示解析后的字符串 |
var3 | 变量 不可见 | string数据类型,缓存接收到的字符串 |
p | 协议解析器 不可见 | 用串口接收字符串并手动解析 |
arr5 | 数组 不可见 | string数据类型,储存解析后的字符串 |
4.逻辑实现
4.1控件功能简介:
使用"stringSub(源字符串,起始位置,检测字符个数)"检测帧头,例如
// 返回字符串“==string,test,test1,test2,test3”中的某段字符,位置从第一个字符开始,向后取2个字符,并由文本控件text2显示,字符串会返回“==”
Text0.txt=stringSub("==string,test,test1,test2,test3",0,2);//如此可检测帧头
//即“==”为帧头
if(stringSub("==string,test,test1,test2,test3",0,2)=="==")//条件为真,进入解析字符串
{
}
4.2 删除帧头
使用“stringTrimStart(源字符串,帧头字符个数)”删除帧头,例如
// 移除字符串的前2个字符,text0.txt变为” string,test,test1,test2,test3”
if(stringSub("==string,test,test1,test2,test3",0,2)=="==")
{
text0.txt=stringTrimStart("==string,test,test1,test2,test3",2);
}
4.3 检测分隔符
使用“stringIndex(源字符串,起始位置,分隔符),如“,”为分隔符,例如
// 在字符串“string,test,test1,test2,test3”中查找“,”的出现位置,并由整数控件num1显示,位置会返回6
if(stringSub("==string,test,test1,test2,test3",0,2)=="==")
{
text0.txt=stringTrimStart("==string,test,test1,test2,test3",2);
num1.val=stringIndex(text0.txt,0,",");
// 备注:如果找到,返回位置;否则返回 -1。
}
4.4 提取字符串
使用stringTrimEnd(源字符串,(源字符串长度-提取的长度))、数组arr[],使用string类型,例如
//“text0.txt ="string,test,test1,test2,test3";
// 移除字符串第一个分隔符“,”及以后的字符,变为“string”储存到字符串数组中,再显示到text3.txt。
if(stringSub("==string,test,test1,test2,test3",0,2)=="==")
{
text0.txt=stringTrimStart("==string,test,test1,test2,test3",2);
num1.val=stringIndex(text0.txt,0,",");
arr2.set(0,stringTrimEnd(text0.txt,stringLength(text0.txt)-num1.val));
text3.txt=arr2.get(0);
text0.txt=stringTrimStart(text0.txt,num1.val+1);//删除已提取的字符串
}
4.5 循环提取
使用协议解析器解析串口数据,使用字符变量储存串口数据,使用字符串数组储存提取后的字符串,使用列表显示提取的字符串。示例代码如下
inti;
intj;
intk;
intm;
ints;
var3.txt=stringDecode(p.rxBuf,0,p.rxLen);
- (stringSub(var3.txt,0,2)=="==")
// ==作为数据格式固定前两个字符,如果接受到前两个字符不一致,那么屏幕认为接收到的数据是非法数据不予解析
{
var3.txt=stringTrimStart(var3.txt,2);//接收到的数据
m=stringLength(var3.txt);//接收到的字符串长度
for(i=0;i<m;i++)//循环分割收到的数据
{
- (stringIndex(var3.txt,0,",")!=-1)//以“,”分割
{
j=stringIndex(var3.txt,0,",");//,位置
arr5.set(k,stringTrimEnd(var3.txt,stringLength(var3.txt)-j));//第一个字符串数据
var3.txt=stringTrimStart(var3.txt,j+1);//剩下的字符串数据
k++;//取出来的字符串数量
}
else
{
arr5.set(k,var3.txt);//最后一个字符串数据赋值
break;
}
}
for(s=0;s<k+1;s++)
{
datagrid1.setCellString(0,0,s,arr5.get(s));//所有取出来的字符串放在表格的同一列
}
}
5.下载验证
点击编译,查看调试。
点击下载,查看串口屏演示。