多个STM32相连的冲突问题:为什么上次没处理的数据会影响下次

2019-07-14 18:23发布

我刚接触STM32不久,对DMA和中断的用法不是很熟,不知道为什么上次没处理的数据会影响下次,或者是我没有完全关闭DMA的接收或是没清缓存?请大牛指点我的问题所在,谢谢!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
14条回答
旧巷幽草香
1楼-- · 2019-07-15 08:46
keji730 发表于 2018-8-24 08:27
如果你将PC和两个单片机连到一条总线上,那么单片机A发的“AAA”是能够被单片机B收到的。在这种情况下,单片机的程序是需要做些处理,来判断它所收到的“AAA”是另一个单片机发的,还是PC发的。如果处理不了这个,通信是无法正常进行的。 ...

您好,感谢您的回复

我本意是单片机会处理,比如会识别ID,AAAA如果正常处理肯定过不了ID那一关,就扔掉了。但是现在好像是在单片机B忙的时候来了AAAA,这样就没法正常触发中断处理了,而是被存在了缓存中?没扔?这是我猜的,然后和下一个正常数据合并了?
ctwewer
2楼-- · 2019-07-15 10:23
 精彩回答 2  元偷偷看……
旧巷幽草香
3楼-- · 2019-07-15 10:58
ctwewer 发表于 2018-8-24 09:23
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端口,我看不见,它会接收垃圾信息和我这次的有用信息合并,然后当我读操作时,会一并读到缓存里,从而我看到的数据就错了?
ctwewer
4楼-- · 2019-07-15 11:29
旧巷幽草香 发表于 2018-8-24 09:31
感谢您的回复,

您说的我理解了,不过是这样,诸如您说的那个自己写的缓存我也有,我每次也都会清空。错误是发生在用指令从硬件把数据读到缓存时,数据就已经不对了。

让ReceiveBuff[xx]=0x00其实这个USART接收不用DMA好像更容易数据处理
旧巷幽草香
5楼-- · 2019-07-15 13:51
ctwewer 发表于 2018-8-24 09:42
让ReceiveBuff[xx]=0x00其实这个USART接收不用DMA好像更容易数据处理

谢谢回复,

我里面也有这样一段:

/*        清空接收缓存匿        */
                for(int i = 0; i < Rx_len ; i++)
                                ReceiveBuff=0;

用来清这个缓存。
但如我说的,第二次的数据来的时候,进ReceiveBuff后就不对了,进之前我可以肯定里面是全0的。

确实也许不用DMA会简单很多,但我目前这个不太方便改了,而且感觉是一些新手错误,毕竟我刚接触这个。可能我描述的不够清楚,您有任何质疑我都很乐意详述,谢谢。
ctwewer
6楼-- · 2019-07-15 14:10
旧巷幽草香 发表于 2018-8-24 09:58
谢谢回复,

我里面也有这样一段:

数组!数组!数组!!
ReceiveBuff[i++]=0;而非ReceiveBuff=0;

一周热门 更多>