oipk 发表于 2015-1-8 14:56:35

浅谈不定长接收和缓冲区

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

oipk 发表于 2015-1-8 15:08:24

qwe775208732 发表于 2015-1-8 15:05
队列缓冲,可以用帧头结构解决。接收半帧丢数据问题

帧头解决是很不科学的,万一数据出错出现帧头数据,你的串口接收就完了。完整的是应该要加校验的,这样能保证数据的安全性。

oipk 发表于 2015-1-8 15:01:50

自己给自己顶一个

lovewyufeng 发表于 2015-1-8 14:59:13

沙发 围观 一下

qwe775208732 发表于 2015-1-8 15:05:53

队列缓冲,可以用帧头结构解决。接收半帧丢数据问题

qwe775208732 发表于 2015-1-8 15:10:20

通信本来就要有CRC的,帧头一般是二个保证。嘿嘿

alittleyatou 发表于 2015-1-8 15:25:20

{:3_57:}{:3_57:}l楼主好牛的样子

451506709 发表于 2015-1-8 15:29:44

一直用环形缓冲区,你还真低调呀,聪聪

一休休 发表于 2015-1-8 15:47:52

顶一个:lol

jcrorxp 发表于 2015-1-8 16:09:45

oipk 发表于 2015-1-8 15:08
帧头解决是很不科学的,万一数据出错出现帧头数据,你的串口接收就完了。完整的是应该要加校验的,这样能 ...

那是不是代表,帧头+CRC,数据就会相对稳定?
页: [1] 2
查看完整版本: 浅谈不定长接收和缓冲区