本篇笔记用来记录HAL_UART_Receive_IT(串口中断接收)和HAL_UART_Transmit(串口发送)共同使用时,出现中断无法再次进入的情况,以及对应的解决过程和方案。 在我预留了一个问题: 4 N+ U# I1 s' I1 \
3 g/ v2 O9 [* Z5 M2 F# G( i 那么,这个问题究竟如何解决呢?通过在社区中的求助。得到了一个解决方案。通过运行__HAL_UART_ENABLE_IT方法,来恢复中断的触发。代码比较简单: while(d5list_length()>0)- m9 D+ w: s, x9 |7 ]- E { struct __d5pack * p = d5list_pop();& f3 A! D w, A7 X9 J3 V uint8_t cmd = p->cmd; uint8_t back[128]="";: L$ H- Y& M* { sprintf((char *)back,"got package %d",cmd); // 拼合字符串: Z) [. B* p0 E HAL_UART_Transmit(&huart2,back,13,0xffff); // 发送字符串 __HAL_UART_ENABLE_IT(&huart2, UART_IT_RXNE); } 如上述代码所示,在一次发送完成之后。通过调用__HAL_UART_ENABLE_IT方法,即可使中断恢复运行,不再出现如笔记五中所述的,发送一次数据后,就无法再次进入中断的问题。 但是进一步测试发现,如果在一次循环中,连续调用两次HAL_UART_Transmit依然会造成串口锁死,无法触发中断。当然,连续两次调用这种写法本身就不够好。应该把要发送的数据合成在一起,统一发送一次。而不是分开发送多次,增加系统消耗。 因此,到目前为止。我们已经实现了可“维持”的数据包接受和发送。当然还不是最终的解决方案。当发包过于频繁的时候,还是会出现锁死的情况。我猜想是对HAL库不够熟悉的原因。作为一个遗留问题暂且保留。下一篇笔记开始,将回到WIFI模块,开始尝试通过无线连接来收发数据。 |
基于STM32L476+64M QSPI接口PSRAM(IPS6404L)开源分享(含源码)
基于STM32L4R9 的QuadSPI Flash 通讯速率不理想经验分享
STM32L4超低功耗功能概述
基于STM32L431RC Standby和RTC中断唤醒经验分享
基于STM32L431的睡眠模式经验分享
STM32L4R9 的 QuadSPI Flash 通讯速率不理想
STM32L4、STM32L4+和STM32G4系列 微控制器上的专利代码读取保护
STM32L433在STOP模式USART不能工作的解决办法
【实测教程】基于STM32L4系列的实测教程分享合集
STM32L4系列MCU的五种振荡器和使用说明