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

查看: 1780|回复: 12

浅谈不定长接收和缓冲区

[复制链接]

8

主题

49

回帖

0

蝴蝶豆

中级会员

最后登录
2020-1-17
发表于 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接收不定长帧数据的例程),乒乓缓冲楼主暂时没有,大家拍砖吧。

STM32串口环形队列.rar

下载

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

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

下载

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

回复

使用道具 举报

8

主题

49

回帖

0

蝴蝶豆

中级会员

最后登录
2020-1-17
 楼主| 发表于 2015-1-8 15:08:24 | 显示全部楼层
qwe775208732 发表于 2015-1-8 15:05
队列缓冲,可以用帧头结构解决。接收半帧丢数据问题

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

使用道具 举报

8

主题

49

回帖

0

蝴蝶豆

中级会员

最后登录
2020-1-17
 楼主| 发表于 2015-1-8 15:01:50 | 显示全部楼层
自己给自己顶一个
回复 支持 1 反对 0

使用道具 举报

8

主题

87

回帖

3

蝴蝶豆

金牌会员

最后登录
1970-1-1
发表于 2015-1-8 14:59:13 | 显示全部楼层
沙发 围观 一下
回复 支持 反对

使用道具 举报

0

主题

24

回帖

0

蝴蝶豆

初级会员

最后登录
2017-12-21
发表于 2015-1-8 15:05:53 | 显示全部楼层
队列缓冲,可以用帧头结构解决。接收半帧丢数据问题
回复 支持 反对

使用道具 举报

0

主题

24

回帖

0

蝴蝶豆

初级会员

最后登录
2017-12-21
发表于 2015-1-8 15:10:20 | 显示全部楼层
通信本来就要有CRC的,帧头一般是二个保证。嘿嘿
回复 支持 反对

使用道具 举报

0

主题

3

回帖

0

蝴蝶豆

新手上路

最后登录
2015-1-8
发表于 2015-1-8 15:25:20 | 显示全部楼层
l楼主好牛的样子
回复 支持 反对

使用道具 举报

0

主题

11

回帖

0

蝴蝶豆

中级会员

最后登录
2020-11-29
发表于 2015-1-8 15:29:44 | 显示全部楼层
一直用环形缓冲区,你还真低调呀,聪聪
回复 支持 反对

使用道具 举报

0

主题

1

回帖

0

蝴蝶豆

新手上路

最后登录
2016-5-24
发表于 2015-1-8 15:47:52 | 显示全部楼层
顶一个
回复 支持 反对

使用道具 举报

4

主题

57

回帖

0

蝴蝶豆

初级会员

最后登录
1970-1-1
发表于 2015-1-8 16:09:45 | 显示全部楼层
oipk 发表于 2015-1-8 15:08
帧头解决是很不科学的,万一数据出错出现帧头数据,你的串口接收就完了。完整的是应该要加校验的,这样能 ...

那是不是代表,帧头+CRC,数据就会相对稳定?
回复 支持 反对

使用道具 举报

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