打印
[STM32F1]

用串口DMA传输不定长度包的方式!

[复制链接]
3440|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
5186|  楼主 | 2014-1-18 20:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


经常看到有人在问用DMA接收不定长包的问题,由于STM32DMA的特殊性,使其对接收不定长的数据不太方便,很多人都在为此伤脑筋,也有不少牛人想了不少的办法,例如用协议或开定时器判别等,其实这些方法都过于复杂。下面是我用的方法:



其实很简单的,发送的包分成两种,比如包A和包B,其中包B是你要发送的数据,包A只是包B的字节数目,而且包A的长度是固定的。每次都首先发送包A告之 接收方包B的长度,然后再发送包B,如此一直下去就可以了。这是用DMA发送和接收不定长包的最好方式。其它的方法都太过复杂,操作性不强。
沙发
wookongbun| | 2014-1-19 12:09 | 只看该作者
包A丢了怎么办

使用特权

评论回复
板凳
5186|  楼主 | 2014-1-19 12:18 | 只看该作者
丢包不在此讨论,丢包还是很好解决的,通信的可靠性也不在此讨论,因为也好解决

使用特权

评论回复
地板
zhangyang86| | 2014-1-21 10:54 | 只看该作者
5186 发表于 2014-1-19 12:18
丢包不在此讨论,丢包还是很好解决的,通信的可靠性也不在此讨论,因为也好解决 ...

这。。。。。。
协议,安全稳定很重要。。。

使用特权

评论回复
5
5186|  楼主 | 2014-1-21 10:59 | 只看该作者
zhangyang86 发表于 2014-1-21 10:54
这。。。。。。
协议,安全稳定很重要。。。

知道协议很重要,加个起始符和结束符而已,使用CRC校验等,随便你使用什么协议或措施保证通信的可靠性,这个使用者自己根据实际情况自己想办法解决。你可能传输不同的数据采用的协议是不相同的。这里只讨论串口DMA如何接收不定长的数据。你照样可以加上你的协议,这没什么问题。

使用特权

评论回复
6
罗菜鸟| | 2014-1-21 12:34 | 只看该作者
头一次见到这么奇葩的方法,奇葩的效果。
直接把DMA当FIFO用有木有?

使用特权

评论回复
7
hqgboy| | 2014-1-21 16:51 | 只看该作者

使用特权

评论回复
8
gaupen1186| | 2014-1-22 19:10 | 只看该作者
发散思维啊!!!

使用特权

评论回复
9
huzi2099| | 2014-1-22 22:47 | 只看该作者
这个并不是什么特别复杂的问题,搂主的做法和数据包前面附加包大小的做法不是一样吗?
数据包的协议定义是和现实应用的复杂度、开销、传送的数据特性有关系的,因此没有什么好不好的差别只有适合与不适合。比如你传送中极少的情况丢包,那么你制定一个开销过于庞大的传送协议就没有必要了。又比如你发包%99都是一个固定的长度那还是把包长固定的好,其它特殊处理就行了。
总之这个问题是要综合考虑的。

使用特权

评论回复
10
5186|  楼主 | 2014-1-22 23:11 | 只看该作者
本帖最后由 5186 于 2014-1-22 23:13 编辑

楼上正解,我只是把协议的思想更简单化了,我这个只要加了CRC检验就可以了,检验不通过,立马通知上位机重发就是的,收发数据很快的

使用特权

评论回复
11
msblast| | 2014-1-23 00:14 | 只看该作者
报文=A+B
A=报文头信息+报文数据长度
B=报文数据+校验数据
这是一个很标准的报文协议

使用特权

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

本版积分规则

11

主题

478

帖子

0

粉丝