关于串口接收转义字符状态机:
S1——S2——S3——S4——S5
S1空闲状态,收到第一个开始前导符,跳转到S2;
S2收到第一个开始前导符状态,收到开始第二个前导符,跳到S3;收到其他数据,跳转到S1;
S3收到第二个开始前导符状态,收到其他数据进行接收,跳转到S3;收到第一个结束前导符,跳转到S4;
S4收到第一个结束符状态,收到其他数据进行接收,跳转到S3;收到第二个结束符,跳转到S5;
S5结束状态,关闭接收,重置状态,标识接收结束。
这里设计了一个串口接收数据用的状态机。
根据数据的前导符和结束符,以及转义字符,进行数据接收。
在本状态图中,整体实现了在接收过程中,去掉数据的前导符,结束符以及转义字符。但是留下了一个可能造成状态图死机或者将前导字符接收到缓冲区的bug。
如果这里Start Char == End Char,Second Start Char != Second End Char,当进入RecvPreambleEnd后,如果接收到Start Char将导致接收错误。因为对于数据而言如果发生这样的事情,说明是新的一帧到了。
同时在实现段代码的时候同样,出现了一个隐藏的Bug,当接收到Second Char后,要进行退出前的清理操作,应该是在当前接收时间内进行。但实现时,将其放在了下一次接收到来时处理,这就发生了异步数据处理的现象。虽然表面上正常,数据有交互,实际上对于使用这段代码的接收方,只处理了一半的数据。剩下的一半数据,被接收端丢弃了。
这些前一个是设计上的缺陷,后一个是编码上的缺陷。