首先,在这里先感谢阿莫某楼主发的串口循环缓冲区的帖子,也感谢阿莫某楼主发的移植freeModbus移植的帖子,小弟并非在这给阿莫打广告,只是因为有这些想法还是因为这两位的程序给我的启发。 刚刚开始做单片机的时候,单片机能发送出数据或者能接收数据就觉得很高兴。那个时候师兄总是教我,发送数据的时候加结束符,接收的数据加起始符。这一年一直自己做一个项目,从选择modbus,读懂modbus大部分代码,到后来用modbus结构做了自己的数据格式,到现在觉得modbus(free modbus)的一些不足之处,慢慢成长,直到看懂项目的需求以及结构本身的适用性。 牢骚发完了,下面正式讲我们的主题。 首先,我们先讲一讲接收不定长数据的几种方式(单片机)。 1.定时器超时中断 2.DMA+串口空闲中断 3.高效FIFO串口双机通信(楼主所学有限,只知道这三种) 这是我们的硬件方面接收不定长数据的方式,用纯硬件就能实现不定长数据的接收,发送就不用说了,你想发多上发多少,20cm都没问题。 然后我们来讲一下缓冲区。缓冲区是啥,就是个自己声明的定长的数组加几个判断函数以及对外服务的接口。那么缓冲区一般有哪几种呢?下面列举一下。 1.队列缓冲区 2.乒乓缓冲区 3.循环缓冲区(楼主学的还是有限,目前就知道这三种) 说到现在,基本大家也清楚了,接收机和缓冲区并没有什么实质的联系,当然他们还是搞在一起的。这个东西怎么说呢,无论你是用哪种接收方式,都摆脱不了pucfarme=recvByte;那么,缓冲区是干嘛的呢?我们来大致比较一下三种缓冲区的特性。 队列缓冲,无论你怎么折腾,模式都不能摆脱 接收一帧数据---->处理这帧数据---->返回给主机 如果主机发数据的速度比你处理数据的速度快,对不起,你完了,很有可能中间某帧数据被干掉了。 乒乓缓冲,这个就有点意思了,俩数组,两个接收缓冲区,我在处理一帧数据的时候,另外的那个数组在接收,这样的话,等于提高的缓存能力,大大的提高了缓冲区的能力啊。 循环缓冲,这个就非常有意思。为啥?第一,用了队列缓冲大的缓冲区内存,扩展了比乒乓缓冲更多的空间,更加灵活也更加智能。下面上传队列缓冲(modbus接收部分),循环缓冲(内有DMA接收不定长帧数据的例程),乒乓缓冲楼主暂时没有,大家拍砖吧。 |
帧头解决是很不科学的,万一数据出错出现帧头数据,你的串口接收就完了。完整的是应该要加校验的,这样能保证数据的安全性。
那是不是代表,帧头+CRC,数据就会相对稳定?
不是相对稳定,是很稳定。只是加了crc可以验证你的数据是安全的。
◾Array that wraps around – meaning it is possible to overwrite old data in the buffer if the microcontroller processing speed is unable to momentarily keep up with the incoming data rate.
◾FIFO (first-in-first-out).
也是需要,不需要还真没必要趟这浑水。