双路串口接收数据
有个客户做测试仪器,是双路的,每路都是独立的电路,都有单片机并且有串口输出,输出的格式如下:
1|测试结果|参数1|参数2#0d#0a
- 其中第一个1表示图片编号,用于显示结果,红灯有问题,绿灯正常
- “测试结果”是一个文字,显示
- 参数1、2 也是一个文字,label显示就可以
- #0d#0a 表示asc码的0d 0a ,也就是\r\n回车换行
需要将两路的串口收到的信息都解析到屏幕上
分析:
- 串口1默认是CMD模式,需要设置成str模式
- 串口2是队列异步模式,需要制作一个只有1步的调用
实施
第一:初始化串口
void b1.onclick()
{ //调试用,启动str模式后,系统将不能串口更新,因此设置一个按钮
setrecvmode(2); //1号串口开启str模式
setcom(1,115200); //打开2号串口
if (que_create(1)) {que_go(1,10);} //2号串口启动通信,开始接收数据
gopage(1)
}
建立第一个页面,放置一个按钮,点击进入第二页,点击这个按钮后,串口更新就已经不起作用了,只能用TF卡更新
第二:建立appbase处理程序
菜单:控件-->编辑全局控件appbase源码 :
int x1=0;
int y1=0;
int x2=319;
int y2=239;
int status=00;
int status2=0x0000;
void create(){}
void draw(){}
void show(){}
void showjm1(int picn,str s1,str s2,str s3){};
void showjm2(int picn,str s1,str s2,str s3){};
void work(int n,str s)
{ //picn|label1|label2|label3
int picn;
str s1;
str s2;
str s3;
picn=explode_num(s,"|",0);
echo("{");echo(picn);echo("}");
s1=explode_str(s,"|",1);
s2=explode_str(s,"|",2);
s3=explode_str(s,"|",3);
if (n==0) {
showjm1(picn,s1,s2,s3);
}
else{
showjm2(picn,s1,s2,s3);
}
}
//--------1号串口接收
void onrecv(){
str s;
s=urecv(0);
echo(s);
if (s=="exit str mode") setrecvmode(0);
work(0,s);
}
//------ 2号串口接收
void que_step(){
str s;
str ss;
int cc=0; //计数
que_do(1,10,10){}//设置关闭回显
then{
s=trim(urecv(1),1);
work(1,s);
}
else que_go(1,10);
}
第三:页面程序
//注: p1是pic控件 l1 -l6 是六个label控件,本代码是示例,具体控件显示属性可自行调整
void app.showjm1(int picn,str s1,str s2,str s3){
p1.picn=picn;p1.show();
l1.text=s1;
l3.text=s2;
l5.text=s3;
};
void app.showjm2(int picn,str s1,str s2,str s3){
p2.picn=picn;
l2.text=s1;
l4.text=s2;
l6.text=s3;
};
在页面中继承这2个事件,就可以在串口收到数据后的刷新到页面。