1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
上一篇博客发现串口DMA中断在接受一次数据时,会进入两次中断,经过一天的调试还是没有找到原因,后来又发现一个问题:当使用ADC1DMA时,串口DMA只能进入两次中断,之后上位机再发送数据,也不会进入串口DMA接收中断;而ADC1DMA和串口1DMA分别使用都是可以的。百度后发现有人遇到过同样的问题,解决方法就是在DMA接收中断函数内,再次开启DMA接收中断,这样每次收到数据就会进入DMA接收中断了,经调试发现仍然存在丢失数据的现象,比如上位机发送的是123456,6个字节,收到的只有12,后面全是0.
改为串口中断接收方式,发现也只能进入一次接收中断函数,把开启中断函数放入接收中断函数内,可以连续进入接收中断函数了,但是数据丢失的问题仍然存在,又经过一番调试发现将处理数据函数从接收中断函数中取出,问题就解决了。 然而采用串口DMA方式时,将处理函数从中断函数中取出,读取的数据还是错误的。 唉,现在可以收到正确的数据了,不打算进一步找错误了,感觉HAL库的小问题有点多。 为了严谨,判断是接到数据之后进入中断后,再从缓冲区将数据读出,在中断处理函数中加入flag_rx void USART1_IRQHandler(void) { flag_rx=1;//进入中断的标志位 HAL_UART_IRQHandler(&huart1); HAL_UART_Receive_IT(&huart1,teledata_rx,length); } 在while (1)里当flag_rx==1时,对数据进行处理。 while (1) { Get_adc_average_data(0); printf("flag_rx "); printf("%drn",flag_rx); if(flag_rx==1) { telecontroller_data();//上位机数据处理 flag_rx=0; } printf("pressrn"); printf("%drn",press_data[0].back); printf("%drn",position_data[0].back); delay(); } 在处理函数内一定要将缓冲区的数据完全读出来,串口的数据寄存器才会更新。 void telecontroller_data(void) { uint8_t test_d[6]; uint8_t i; for(i=0;i<6;i++) { test_d=teledata_rx; } printf("%drn",test_d[0]); printf("%drn",test_d[1]); printf("%drn",test_d[2]); printf("%drn",test_d[3]); printf("%drn",test_d[4]); printf("%drn",test_d[5]); } |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1771 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1619 浏览 1 评论
1070 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
724 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1673 浏览 2 评论
1935浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
728浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
567浏览 3评论
593浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
551浏览 3评论
小黑屋| 手机版| Archiver| 德赢Vwin官网 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 02:51 , Processed in 0.615825 second(s), Total 44, Slave 38 queries .
Powered by 德赢Vwin官网 网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号