通信队列控制语句
void que_do(int un,int step,int timeout){
//在此书写通信发送代码
}then{
//在此书写接收数据处理代码
//要区分通信结果正常和异常并分别处理
}else{
//在此书写超时处理代码
}
//un:串口号 0或者1,
//step:步骤号,只允许编号向后逐渐加大
//timeout: 超时时间,单位秒;0-表示不处理超时;
示例
que_do(1,310,1){
usend(1,"AT+CWJAP=\""+ssid+"\",\""+pwd+"\"\r\n");
}then{
s=trim(urecv(1),1);
if (s=="WIFI CONNECTED") {emsg=s;onwifi(5,0);}
if (s=="FAIL"){
emsg="连接失败";
que_close(1);
}
if (s=="OK") {que_next(1);}
}else{
emsg="连接超时......";
que_close(1);
}
注意
- un=0 表示1号串口(rx1 tx1) un=1 表示2号串口(rx2 tx2)
- 目前只开放串口2,也就是un必须=1;
- 实际使用,请参见实战案例的wifi通信
- que_do,只允许写在appbase控件中的que_step方法中,作为通信协议专属方法,其中的步骤号必须依次增大;
- 考虑到步骤中可能会添加新的步骤进入,建议每个步骤以10递增;而大功能块以100递增;这样方便插入新步骤
- send代码执行完后,会内部执行函数的return;退出队列处理函数que_step,等待有串口通信数据传来
- 串口数据收到后,系统会按照0d 0a拆分,如果有多条,会调用多次then{}后面的代码段,有几组数据调用几次,请在最后一段数据收到后,调用下步,比如ESP8266很多都是以OK为结束符的,因此我们在收到OK后嗲用que_next跳转到下一步;
- 超时处理语句只会在超时的时候调用一次,一般出错,并调用que_close终止队列执行;并退回初始状态
- que_do的前置条件,if(que_create(1)) { que_go(1,10);;}