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

查看: 1911|回复: 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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版