使用数据协议,并包含数据校验。
帧头用特定的n个8位字符告诉stm32数据开始了,并确认总共有多少帧。举个例子,如果收到3个连续的0x55就确认数据帧头 ,数据长度在协议里预先制定,比如60帧。于是,收完60帧就可以判断上位机发送完成。
那么,怎么判断数据有效呢?
包尾最后一帧设计校验位,可以是把前面所有帧的字节累加起来,检验位的数据与累加结果一致,表示数据有效。
如果校验没通过,丢弃,然后也可以回复上位机重发。然后继续等帧头的特征码。
一般有两种方式,
1通过特定数据判断一帧,比如字符串后面加回车换行,还有数据加帧头帧尾
2可以通过超时检测,当你发送字符间隔大于一定时间就认为一帧结束,常用于485通讯
光串口通信本身是没有这样的机制的,需要自行定义数据通信协议,比如规定连续3组char字符为"-_"即”-_-_-_"表示一次数据已经传输完毕对应的还要定义数据开始标记。
其实串口仅仅提供数据传输的物理通道,具体怎么用是上层通信协议的事情啦。
可以分为定长和不定长两种:
定长:规定通讯协议,每次发送接收数据的长度是一定的,以分包的形式传输数据。这种方式适合数据量不多,长度较为统一的场合。
不定长:又分为有通讯协议,无通讯协议:有通讯协议:比如规定结尾用回车"\r\n"结尾,当收到“\r”时判断下一帧是否“\n”,如果是,则为结束标志,这种方式适合主要为文本传输场合;无通讯协议:一般波特率是固定的,传输数据又是连续的,所以当超过一定时长没有接收到数据,则可判断为数据完成一次传输,这种方式稍微会延迟,适合对实时性要求不高的应用。