打印

求助。有个问题搞了几天了,没搞定。

[复制链接]
1841|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
diweo|  楼主 | 2013-11-11 21:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
有4个从设备,不停地的通过串口发送数据,4路数据发送到74hc153(4选1多路复用器),主机循环选择其中1路,通过串口接收数据。
主机开启串口接收DMA,另外配置一个二维数组buffer[channel][32],其中channel=0,1,2,3,对应4个从设备。设定每30ms,重新配置DMA的DMA_MemoryBaseAddr。
设想是第1个30ms,选通74hc153的A路,从设备1发送数据,主机DMA自动把数据全部存到buffer[0][ ]里面;下一个30ms内,从设备2的数据全部存到buffer[1][ ]里面;以此类推。
实践的结果是大部分数据都可以正确接收,就是大约有1/10的数据总是漏掉,接收不到。
有没有朋友做过类似的项目?谢谢了。
沙发
香水城主| | 2013-11-11 22:23 | 只看该作者
你怎么保证发送与接收的同步?

不能保证同步,丢就免不了。

使用特权

评论回复
板凳
戈卫东| | 2013-11-11 23:50 | 只看该作者
同步有问题的吧?
如果每次从设备收到主设备的指令才发出数据,可能才会可靠些.

使用特权

评论回复
地板
pattywu| | 2013-11-12 00:13 | 只看该作者
    通信不是这么搞的。
    第一、数据都是发给主CPU的,主CPU的处理数据,决定了整个系统的速度;各从CPU数据发得再快,也没什么用。
    第二、凡是通信,基本上都是主从结构。而主从结构,肯定要做成一应一答的,即【请求/应答】方式。
    第三、多机通信,一般做成总线方式,比如RS-485、CAN等,这样,连接方式简单,布线方便。当然,RS-232也是能做成总线方式的,只不过是主机的TX连接到所有从机的RX,主机的RX连接到所有从机的TX。
    第四、如果主机的处理速度慢(不管是数据处理速度慢,还是通信速度慢),都必须采用分布式结构,即从机要分担一部分数据计算处理能力。换句话说,好的系统设计中,必然是把通信的数据压制到最低的。凡是是有数据流的,数据流的速度,必然是瓶劲之一。
    第五、凡是通信,不可能做到100%不丢数据的。所以,做通信的关键,不是去保证在通信过程中不丢数据,而是要考虑:在丢了数据之后,如何把丢了数据找回来。常用的方法是:检查数据的完整性,重发数据。

使用特权

评论回复
5
diweo|  楼主 | 2013-11-12 07:24 | 只看该作者
本帖最后由 diweo 于 2013-11-12 08:09 编辑

谢谢大家的回复。
我补充说明一下。
原来现成的系统是4个从设备+4个接收板+主机,都采用51芯片。从设备总是不停地发数据,肯定是可以的,应该不是主从式的。
我现在是想把接收板的CPU去掉,直接从设备发数据到STM32主机,使用DMA处理。

关于同步问题,是这样子的。
从机发送数据不是很复杂。以0XAC做标识,后接3个字符,不停循环。正常来说我的采集时间可以有650ms左右。我30ms切换一次通道,这样4个通道都最起码扫描到5遍。
我把DMA缓冲区长度设为32了,从机的有效数据是一直重复的。在1个30ms之内,有效数据应该重复7次左右,填满DMA缓冲区。
我调试的时候在适当的时候暂停,发现DMA缓冲区的前几个字符确实会乱,但后面的就正常了。
我所指的丢失数据是:缓冲数据应该是.,.,.,.,.,0xAC 0x05 0x35 0x30 0xAC 0x05 0x35 0x30 .....,可实际上是.,.,.,.,.,0xAC 0x00 0x00 0x00 0xAC  0x00 0x00 0x00  .....,

使用特权

评论回复
6
gegezaixiao| | 2013-11-12 13:16 | 只看该作者
直接上有4个串口的MCU

使用特权

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

本版积分规则

4

主题

1220

帖子

4

粉丝