各位大神们!
小弟用STM32 UART4接收(用DMA方式)串口WIFI模块数据时 UART4 有时会出现过载错误
现象描述:
WIFI模块是接收/发送 实时音频传输的数据,8K采样率,每采集500个字节对方发送一次
UART4 DMA方式接收 波特率:230400
接收方法:当UART4总结空闲标志置1了,才去读取DMA接收到的数据
串口WIFI模块的数据量:
网络良好时: 每隔40ms有会500Byte数据
网络较差时:每隔40ms左右会有500个Byte,但500Byte可能会被分成十多次从WIFI模块串口发送出来,每次发送的间隔有几毫秒甚至底于1毫秒
(过载错误时基本上是在这个情况下出现的)
网络很差时:有时连续几百毫秒都没数据,突然3000左右字节连接发送过来
注:以上情况是用示波器观察到的
代码如下:
- /*****************************************************
- ** 查询DMA接收数据的状态
- ** buff: 存储接收到的数据
- ** 返回:没有接收数据返回0
- 否则返回接收到数据的个数
- *****************************************************/
- unsigned short Receive_UART4(unsigned char *buff)
- {
- unsigned short remaining,i,num;
- static unsigned short count = UART4_RX_SIZE;
- if(USART_GetFlagStatus(UART4,USART_FLAG_IDLE))
- {
- //思想:Receive_UART4函数每隔2ms调度1次,
- //若两次调度期间接收到的数据的数量没有发送变化。
- //则串口处于空闲状态;即可复制DMA传输的数据
- remaining = DMA_GetCurrDataCounter(DMA2_Channel3);
- if((remaining == UART4_RX_SIZE) || (count != remaining))
- count = remaining;
- else
- {
- num = (UART4_RX_SIZE - remaining);
- //再次判断总线是否空闲
- if(!USART_GetFlagStatus(UART4,USART_FLAG_IDLE))
- return 0;
- DMA2_Channel3->CCR &= ~(1 << 0); //停止DMA
- for(i = 0; i < num; i++)
- {
- buff[i] = UART4_RxBuff[i];
- }
- DMA2_Channel3->CNDTR = UART4_RX_SIZE; //设置DMA传输大小
- DMA2_Channel3->CMAR = (unsigned long)UART4_RxBuff; //设置DMA缓存
- DMA2_Channel3->CCR |= (1 << 0); //启动DMA
- return num;
- }
- }
- return 0;
- }
复制代码请教各位,这种环境下如何避免UART的数据过载现象?
另外,DMA停止后启动时间大概多长?貌似手册上没有说明
邮箱:baoj.zhang@gmail.com
一周热门 更多>