你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

浅谈不定长接收和缓冲区

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

STM32串口环形队列.rar

下载

1.19 MB, 下载次数: 53, 下载积分: ST金币 -1

free Modbus 移植程序2014-1-4.rar

下载

3.84 MB, 下载次数: 46, 下载积分: ST金币 -1

收藏 4 评论12 发布时间:2015-1-8 14:56

举报

12个回答
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
l楼主好牛的样子
KingQueenWong 回答时间:2015-1-8 15:29:44
一直用环形缓冲区,你还真低调呀,聪聪
一休休 回答时间:2015-1-8 15:47:52
顶一个
jcrorxp 回答时间:2015-1-8 16:09:45
oipk 发表于 2015-1-8 15:08
帧头解决是很不科学的,万一数据出错出现帧头数据,你的串口接收就完了。完整的是应该要加校验的,这样能 ...

那是不是代表,帧头+CRC,数据就会相对稳定?
oipk 回答时间:2015-1-8 16:18:40
jcrorxp 发表于 2015-1-8 16:09
那是不是代表,帧头+CRC,数据就会相对稳定?

不是相对稳定,是很稳定。只是加了crc可以验证你的数据是安全的。
KingQueenWong 回答时间:2015-1-8 16:18:49
◾Very efficient implementation where memory is reusable.
◾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).
oipk 回答时间:2015-1-8 22:43:29
451506709 发表于 2015-1-8 15:29
一直用环形缓冲区,你还真低调呀,聪聪

也是需要,不需要还真没必要趟这浑水。

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版