要解决这种问题,有以下方法。
第一种方法便是串口空闲中断,这种方法结束判断是由硬件完成的,CPU只需中断中处理,基本上是最简单的一种。
第二种方法是延时判断技术,这种方法我在51单片机上实现的,因为51单片机没有串口空闲中断,所以说我在接收串口数据的时候通常会使用一个变量来计算串口收到的数据量,主程序延时判断这个数字是否与上一次一样,如果延时一定时间判断,数据量和上次一样的话那么就认为数据接收完毕。
第三种方法是约定一定的通讯协议,在通信协议中加入长度字段,比如说OneNet平台的EDP协议,该协议在第二字节中就指出了剩余消息长度,解析的时候可以直接读第二字节,然后定长接收,超过长度的部分视为非法数据。
第四种方法是增大缓冲区,例如PC机的缓冲区就有多达kb级别的串口缓冲区,可以考虑在硬件电路上做出改变,增加uart串口缓冲区,但是这种想法对于本人而言,也只是一个想法,还没有实践过。