实验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. 下载验证

  1. 点击编译,查看调试。

  2. 点击下载,查看串口屏演示。