实验23 字符串协议解析实验
1. 实验目的
通过串口屏实现字符串协议解析。
2. 实验工具
(1) 任意三易串口屏,本例程采用的型号为SANY-WQ-S43-02M-C
(2) VP开发软件
3. 页面设计
3.1 page0:
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 循环提取
使用协议解析器解析串口数据,使用字符变量储存串口数据,使用字符串数组储存提取后的字符串,使用列表显示提取的字符串。示例代码如下
int i;
int j;
int k;
int m;
int s;
var3.txt=stringDecode(p.rxBuf,0,p.rxLen);
if(stringSub(var3.txt,0,2)=="==")
// ==作为数据格式固定前两个字符,如果接受到前两个字符不一致,那么屏幕认为接收到的数据是非法数据不予解析
{
var3.txt=stringTrimStart(var3.txt,2);//接收到的数据
m=stringLength(var3.txt);//接收到的字符串长度
for(i=0;i<m;i++)//循环分割收到的数据
{
if (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. 下载验证
点击编译,查看调试。
点击下载,查看串口屏演示。