|
本帖最后由 liuqian 于 2019-1-31 14:00 编辑
现在搞一个通讯协议,里面包含一些特殊的字符串,需要把这些字符串捡出来,比如
数据段1 : 1234567ERROR8474674
数据段2 : 37649944SYSTEMHALT4866289
这里面ERROR和SYSTEMHALT是需要捡出来的
数据流要把匹配字符串去掉,然后转发出去
数据段1变成12345678474674
数据段2变成376499444866289
假设正常的数据流中不会出现ERROR和SYSTEMHALT这样的字符串,但协议本身是未知的,就是说每收到一个字符,就要做匹配,如果能匹配,就先缓冲下来,不转发;不匹配的要马上转发出去。
- const char ERROR[]="ERROR";
- const char WARN[]="WARN";
- const char HALT[]="SYSTEMHALT";
- const struct {char * str; uint8_t len;} MATCHED_STR[3]={
- {ERROR,5},
- {HALT,10},
- {WARN,4}
- };
- // return:
- // 0 - n : 和一个字符串完全匹配了
- // -1 : 部分匹配了字符串,数据被缓冲
- // -2 : 发生了不匹配,需要处理缓冲区数据
- int MatchByte()
- {
- if(matchedLen<MATCHED_BUF_SIZE)
- {
- matchedBuf[matchedLen++]=getch();
- }
- int i;
- for(i=0;i<3;i++)
- {
- if(memcmp(matchedBuf,MATCHED_STR[i].str,matchedLen)==0) //matched first matchedLen bytes
- {
- if(matchedLen==MATCHED_STR[i].len)
- {// all matched
- return i;
- }
- else
- {// partly matched
- return PARTLY_MATCHED;
- }
- }
- }
- // none matched
- // 这里还没有想清楚怎么处理,卡住了
- return NONE_MATCHED;
- }
复制代码
调用
- if(isDataRcvd())
- {
- switch(MatchByte())
- {
- case 0:
- error_handler();
- break;
- case 1:
- halt_handler();
- break;
- case 2:
- warn_handler();
- break;
- case NONE_MATCHED:
- // 这里还没有想清楚怎么处理,卡住了
- break;
- case PARTLY_MATCHED:
- // do nothing
- break;
- }
- }
复制代码 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|