完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
我刚接触STM32不久,对DMA和中断的用法不是很熟,不知道为什么上次没处理的数据会影响下次,或者是我没有完全关闭DMA的接收或是没清缓存?请大牛指点我的问题所在,谢谢!
|
|
相关推荐
15个回答
|
|
|
那个AAAA应该是从机给主机的应答,我不明白“第二台从机收到“AAAA”后好像发生了异常。”是怎么回事? 你应该每次发送完就清空从机的接收缓冲区,以免把上次的信息当成本次的信息 |
|
|
|
|
|
RS485通讯进程由主机调度,主机必须等某台从机完全发送完数据后才能请求另一台丛机发送数据。你应该在每台从机发送完数据后给主机一个结束标志应答信号,主机接收到应答信号后才能请求另外从机发送。
|
|
|
|
|
ctwewer 发表于 2018-8-24 07:48 您好,感谢您的回复 如我文中提到,我将每台从机设计成了接收数据后返回应答指令“AAAA”,主机收到这个后才会对第二个从机进行操作。 但是现在的问题是,第二台从机收到“AAAA”后好像发生了异常。看上去似乎是将“AAAA”收进了缓冲区,在正常命令到来时,和“AAAA”拼在了一起处理。 上面只是我的猜测,请您根据我的代码帮忙看看有没有可能是这样的。 谢谢 |
|
|
|
|
|
你的电路是怎么接的,UART的串口发送输出引脚是输出模式,是不是发送端口的冲突了!
|
|
|
|
|
|
如果你将PC和两个单片机连到一条总线上,那么单片机A发的“AAA”是能够被单片机B收到的。在这种情况下,单片机的程序是需要做些处理,来判断它所收到的“AAA”是另一个单片机发的,还是PC发的。如果处理不了这个,通信是无法正常进行的。 |
|
|
|
|
ctwewer 发表于 2018-8-24 07:39 首先,感谢您的回复 对对!就是这个!我也觉得问题出在我没清从机,但我刚接触不知道怎么清,能赐教么?谢谢 我使用DMA接收,虽然中断里我关了DMA,但好像还是会从UART缓存进来垃圾,从而被当做第二次的数据。 请问我是不是该在中断里也关闭UART呢?还是只要清UART缓存就行了,请问函数是什么呢? |
|
|
|
|
|
我的电路是每个STM32模块外都串了RS485模块,是自动流控制的。用示波器量出错的单片机的UART端,数据都对,感觉就像有人说的,我没清缓存? |
|
|
|
|
keji730 发表于 2018-8-24 08:27 您好,感谢您的回复 我本意是单片机会处理,比如会识别ID,AAAA如果正常处理肯定过不了ID那一关,就扔掉了。但是现在好像是在单片机B忙的时候来了AAAA,这样就没法正常触发中断处理了,而是被存在了缓存中?没扔?这是我猜的,然后和下一个正常数据合并了? |
|
|
|
|
|
uart不应该关闭,假设接收缓冲区是:Rx_buf[100], for(i=0;i<100;i++)Rx_Buf=0; 这个谁都会清空,对吧? |
|
|
|
|
|
感谢您的回复, 您说的我理解了,不过是这样,诸如您说的那个自己写的缓存我也有,我每次也都会清空。错误是发生在用指令从硬件把数据读到缓存时,数据就已经不对了。 HAL_UART_Receive_DMA(&huart1,pR,BUFFERSIZE); 我用的DMA,所以这句里的pR就是我指向缓存的指针。 #define BUFFERSIZE 80 uint32_t ReceiveBuff[BUFFERSIZE]; //接收缓冲匿 uint8_t *pR=(uint8_t *)&ReceiveBuff[0]; (这里的8位32位的原因是因为我用CRC32,所以就转了一下) 也就是说当数据到ReceiveBuff的时候数据就已经错了,我其实是有个疑问:是不是有个硬件缓存在UART端口,我看不见,它会接收垃圾信息和我这次的有用信息合并,然后当我读操作时,会一并读到缓存里,从而我看到的数据就错了? |
|
|
|
|
旧巷幽草香 发表于 2018-8-24 09:31 让ReceiveBuff[xx]=0x00其实这个USART接收不用DMA好像更容易数据处理 |
|
|
|
|
|
谢谢回复, 我里面也有这样一段: /* 清空接收缓存匿 */ for(int i = 0; i < Rx_len ; i++) ReceiveBuff=0; 用来清这个缓存。 但如我说的,第二次的数据来的时候,进ReceiveBuff后就不对了,进之前我可以肯定里面是全0的。 确实也许不用DMA会简单很多,但我目前这个不太方便改了,而且感觉是一些新手错误,毕竟我刚接触这个。可能我描述的不够清楚,您有任何质疑我都很乐意详述,谢谢。 |
|
|
|
|
|
数组!数组!数组!! ReceiveBuff[i++]=0;而非ReceiveBuff=0; |
|
|
|
|
|
|
|
|
|
|
|
示波器看线上的数据对的,那么基本就是软件的问题了,检查一下你的数据解析部分,还有是否有指针操作
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
STM32F405驱动DS1302时钟模块,输出时间错乱该怎么排查?
2810 浏览 2 评论
stm32f405rgt6驱动DS1302ZN出现时间错乱问题
2420 浏览 1 评论
stm32用fsmc读取ad7606采集数据,数据不变,只有开发版复位才更新数据
2288 浏览 0 评论
2404 浏览 1 评论
1643 浏览 1 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 05:48 , Processed in 0.933475 second(s), Total 100, Slave 83 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
3581