发新帖我要提问
123
返回列表
[C语言]

一种高效的串口数据包接收方式

[复制链接]
楼主: 科技猎人
手机看帖
扫描二维码
随时随地手机跟帖
chenbb8| | 2014-1-16 20:12 | 显示全部楼层
mohanwei 发表于 2014-1-16 16:09
你研究一个具体的环形缓冲区API代码就知道了,一方只管写,另一方只管读,只要保证环形缓冲区对象变量是 ...

嗯,队列使用tail和hand指针的话,的确是一个读 一个写~
我以前喜欢用hand和len(有效数据数量)来实现队列,这样的话因为 前后台都会操作len,
导致需要关闭中断,现在虽然不用这种方法了,但还是保留着这种需要关中断的印象:L

使用特权

评论回复
chenbb8| | 2014-1-16 20:15 | 显示全部楼层
mohanwei 发表于 2014-1-16 16:14
一般收和发是各自使用一个单独的环形缓冲区的:
收环形缓冲区:中断只写,应用程序只读
发环形缓冲区:应 ...

UCOS的定长内存分配时间应该是固定的(**中是用栈来管理定长内存块的)~
也不会因为内存分配光而导致问题(这点我记得不太清楚,就算会影响别的模块,那就模仿这种内存分配机制写一个专门的模块就好了),就是内存使用效率低下而已。

使用特权

评论回复
chenbb8| | 2014-1-16 22:01 | 显示全部楼层
我的上一个项目中,就是先在上层做一个二维数组,然后将第一维下标都丢进一个称为空闲队列的数据结构中,用户从空闲队列中获取数组的下标,
往数组(内存块)中填充数据后,并添加都一个结构体中后,发送到通讯的底层队列中,底层用完内存块后,
再通过一个被上层继承修改后的函数指针,将这个数组下标扔回上层的空闲队列中。

其实这就是模仿定长内存分配。

虽然我的应用,没有LZ那种需要将A口数据发到B口的需求,但之所以没有简化成,底层提供以一个 包括数据包在内的结构体 为最小元素的队列,
原因是:我经常需要发送一些常量式的数据包,如果数据需要复制到底层队列中的话,那就太麻烦了~当前的办法只需要将这个常量数据包的指针丢进结构体就行了。

发送最小单位是包,而不是字节的原因是,通讯协议要求的~~

使用特权

评论回复
科技猎人|  楼主 | 2014-1-16 22:13 | 显示全部楼层
其实没有那种方法是最好的,但对于具体的应用需求肯定有一种是最合适的。期待更多高手分享你们独特的串口接收方法。。。

使用特权

评论回复
yuanquan12345| | 2014-1-17 09:41 | 显示全部楼层
学习。

使用特权

评论回复
罗菜鸟| | 2014-1-17 17:45 | 显示全部楼层
pangencao 发表于 2014-1-15 09:10
采用循环队列通用性应更好一些。

习惯循环队列,而且循环队列也可以超时

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
科技猎人 + 2 赞一个!
技美电子| | 2014-1-18 15:24 | 显示全部楼层
谢谢分享

使用特权

评论回复
chenbb8| | 2014-1-20 21:19 | 显示全部楼层
bmbm546 发表于 2014-1-20 14:56
那用缓冲队列

内存受限呢,32位机的RAM占用特别猛,我用的片子只有4Kram,现在已经有3600+的RAM被使用了……

使用特权

评论回复
maztower| | 2014-1-23 19:26 | 显示全部楼层
为什么要用定制器?一般mcu的串口中断本身不就有一个超时中断吗?比如lpc2378的RDA中断

使用特权

评论回复
hqgboy| | 2014-1-24 17:15 | 显示全部楼层
环形队列+中断+状态。。。。

使用特权

评论回复
落叶行健ywm| | 2014-10-7 09:58 | 显示全部楼层
好帖子,之前做网络通信包就跟楼主这一样,现在手上项目一个串口协议用的是循环队列模式,开始没看懂,然后就在21上搜索了下,才知道是这种模式的。版块内的回复很有用,等我分析了项目遗留源码后再来谈谈吧。

使用特权

评论回复
arefeng| | 2014-10-7 10:50 | 显示全部楼层
你这个方法不错,但还有待完善:比如,数据包头尾的识别方面,这个也是协议转换,透明转发的重点。

使用特权

评论回复
329547875| | 2015-5-19 16:31 | 显示全部楼层

单片机比懂:数据采集与通信控制,你就可以出师了!

使用特权

评论回复
seanwaye| | 2015-6-9 15:59 | 显示全部楼层
mark

使用特权

评论回复
科技猎人|  楼主 | 2016-3-4 12:03 | 显示全部楼层
maztower 发表于 2014-1-23 19:26
为什么要用定制器?一般mcu的串口中断本身不就有一个超时中断吗?比如lpc2378的RDA中断 ...

这是从通用性考虑的,串口有超时中断的单片机型号较少啊

使用特权

评论回复
一般首席| | 2016-12-19 21:42 | 显示全部楼层
不错不错

使用特权

评论回复
疾风剑好| | 2017-11-8 09:58 | 显示全部楼层
chenbb8 发表于 2014-1-15 10:17
我的做法是不用申请另外一块内存,用的是双缓冲,
超时后,当前缓冲就给后台处理,并使用另外一块缓冲存接 ...

近来怎样,半年多没联系了,竟然把我QQ拉黑

使用特权

评论回复
疾风剑好| | 2017-11-8 09:59 | 显示全部楼层
chenbb8 发表于 2014-1-15 10:17
我的做法是不用申请另外一块内存,用的是双缓冲,
超时后,当前缓冲就给后台处理,并使用另外一块缓冲存接 ...

????近来怎样

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则