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