完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
前提:有一个项目一直使用DMA+串口空闲中断接收数据,最近发现串口数据丢包。
经过检查发现串口发送机在发送数据过程中本来应该是连续发送,但是中间有某一个字节与下一个字节之间的间距大于一个字节,MCU端会认为产生了一个空闲中断,便触发,这时候如果软件直接读取数据,很有可能后面的数据就直接丢失,并且原程序设计时候在处理过程中是关闭DMA的,这就会导致串口数据堵塞后面的数据也进不了,表现为串口接不到数据。 为了解决这个问题:修改程序逻辑,将DMA的两个中断(接收完成中断,和接收一半中断使能),在超过一半时即开始接收数据,存入另一个缓冲区,然后DMA继续运行,不影响后续数据接收。 之所以设定接收一半中断是为了加快数据流转,避免占用过多资源。下面看代码。 //定义一个fifo循环里面不断查询是否有数据,并处理 经过试验即使发送端发生数据发送中断,后续数据正常发送时也能保证数据被完整的接收,不会出现丢包现象。 typedef struct { uint8_t f_cnt; uint8_t r_cnt; uint8_t msgcnt; uint8_t pock; uint8_t usartbuff[USART2_MSG_MAX]; }ST_UartBuffFIFO; //数据包进入队列 uint8_t Sdk_Usart_BuffQueueInsertData(ST_UartBuffFIFO *pDataQueue , uint8_t *pDatabuff,uint32_t datasize) { if(pDataQueue->msgcnt { pDataQueue->pock = 1; pDataQueue->msgcnt+= datasize; memcpy(&pDataQueue->usartbuff[pDataQueue->r_cnt],pDatabuff,datasize); if(pDataQueue->r_cnt >= (USART2_MSG_MAX -1)) { pDataQueue->r_cnt = 0; } else { pDataQueue->r_cnt+=datasize ; } pDataQueue->pock = 0; return 1; } return 0; } //数据包移除队列 uint8_t Sdk_Usart_BuffQueueDeleteData(ST_UartBuffFIFO *pDataQueue, uint8_t *pData ) { if (pDataQueue->pock == 0) { if(pDataQueue->msgcnt >0) { pDataQueue->msgcnt--; *pData = pDataQueue->usartbuff[pDataQueue->f_cnt]; if(pDataQueue->f_cnt >= (USART2_MSG_MAX -1)) { pDataQueue->f_cnt = 0; } else { pDataQueue->f_cnt++; } return 1; } else { //pDataQueue->f_cnt = pDataQueue->r_cnt; pDataQueue->f_cnt = 0; pDataQueue->r_cnt = 0; return 0; } return 0; } |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1609 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1540 浏览 1 评论
970 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
681 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1587 浏览 2 评论
1861浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
643浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
515浏览 3评论
528浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
503浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-20 21:16 , Processed in 0.675486 second(s), Total 45, Slave 39 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号