完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
串口通讯是比较常用的通讯方式,本人以前都是单字节中断接收,再开启一个定时器做空闲判断,和PC端做2ms收发无压力。这样做在高速度通讯过程中MCU会频繁进入接收中断,故而想测试一下DMA+IDLE, 收发都通过DMA,DMA每次接收最大数是64,进入IDLE中断后,从串口缓冲拷贝数据。在27字节收发测试时,PC发送一帧(27字节)的速率10 ms以上时,数据收发正常,而低于10ms后,PC端接收的帧数明显少于发送的帧数,而当发送速率设置为2ms时,PC端就无任何数据接收了。STM32 DEBUG发现串口overrun err,数据溢出,也就是MCU还没来得及拷贝数据,下一帧数据就已经到来了。测试code如下:
//DMA发送 void Usart1SendData_DMA(uint8_t *pdata, uint16_t Length) { HAL_StatusTypeDef res; uint8_t retry=0; //while(UsartType1.dmaSend_flag == USART_DMA_SENDING); //UsartType1.dmaSend_flag = USART_DMA_SENDING; do { UsartType1.dmaSend_flag = USART_DMA_SENDING; res = HAL_UART_Transmit_DMA( huart1, pdata, Length); if(res == HAL_OK) { UsartType1.dmaSend_flag = USART_DMA_SENDOVER; } if(retry++>4) //3次尝试发送 { return; } }while(res != HAL_OK); } //DMA发送完成 void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) { __HAL_DMA_DISABLE(huart->hdmatx);//关闭发送DMA } //串口接收空闲中断,检测到一个byte的高电平触发 void UsartReceive_IDLE(UART_HandleTypeDef *huart) { uint32_t temp; if((__HAL_UART_GET_FLAG(huart,UART_FLAG_IDLE) != RESET)) { __HAL_UART_CLEAR_IDLEFLAG( huart1); HAL_UART_DMAStop( huart1); //temp = huart1.hdmarx->Instance->CNDTR;// 获取DMA中未传输的数据个数 temp = __HAL_DMA_GET_COUNTER(huart1.hdmarx);// 获取DMA中未传输的数据个数 UsartType1.rx_len = RECEIVELEN - temp; DataCpy(UsartType1.usartDMA_rxBuf, UsartType1.rx_len); UsartType1.receive_flag=true; HAL_UART_Receive_DMA( huart1,UsartType1.usartDMA_rxBuf,RECEIVELEN); } } void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { } //主循环检测空闲并发送 while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ if(UsartType1.receive_flag)//如果产生了空闲中断 { UsartType1.receive_flag=false;//清零标记 Usart1SendData_DMA(uu_rxfifo.buffer ,27);//串口打印收到的数据。 } } void USART1_IRQHandler(void) { /* USER CODE BEGIN USART1_IRQn 0 */ UsartReceive_IDLE( huart1); /* USER CODE END USART1_IRQn 0 */ HAL_UART_IRQHandler( huart1); /* USER CODE BEGIN USART1_IRQn 1 */ /* USER CODE END USART1_IRQn 1 */ } |
|
相关推荐
1个回答
|
|
|
出现了过载错误(Overrun Error)是因为串口接收缓冲区的数据还没有来得及处理,新的数据已经到达,导致丢失了部分数据。在高速通信中,MCU的处理速度跟不上数据的到达速度,从而导致数据溢出。
解决这个问题的方法可以有以下几种: 1. 增大串口接收缓冲区的大小:通过修改缓冲区大小,可以增加串口接收数据的容量,从而能够处理更多的数据。 2. 减小串口通信的速率:通过降低通信速率,可以减少数据的到达速度,使得MCU有足够的时间来处理数据。 3. 增加数据处理的速度:优化代码,提高数据处理的速度,使得MCU能够更快地处理接收到的数据,从而增加处理缓冲区的空间。 4. 加入数据丢失检测机制:在串口接收中断中添加数据丢失检测的代码,当发现数据溢出时,通过某种方式进行处理,例如丢弃溢出的数据或者重新发送。 综上所述,要解决串口overrun数据溢出的问题,可以通过调整缓冲区大小、降低通信速率、优化数据处理的速度以及加入数据丢失检测机制等方法来改善。具体的解决方案需要根据实际情况进行调试和优化。 |
|
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
4226 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
3266 浏览 1 评论
2799 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
2232 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
15204 浏览 2 评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
3178浏览 4评论
stm32f4下spi+dma读取数据不对是什么原因导致的?
1948浏览 3评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
2117浏览 3评论
2022浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
2223浏览 3评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-17 12:41 , Processed in 1.090509 second(s), Total 75, Slave 58 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
2318