问答

汇集网友智慧,解决技术难题

21ic问答首页 - APM32F107串口中断接收丢包

APM32F107串口中断接收丢包

xiaoqilo2025-04-24
回答 +关注 4
4721人浏览 63人回答问题 分享 举报
63 个回答
  • 确认发送端和接收端的波特率设置一致,并且是双方都支持的标准值。
  • 串口通信线路可能受到周围环境中的电磁干扰
  • 本帖最后由 Gfan 于 2025-4-29 10:35 编辑
    xiaoqilo 发表于 2025-4-26 20:24
    解决了,库函数有问题:
    void USART_TxData(USART_T* usart, uint16_t data)
    {

    你好呀,我们尝试复现问题,但使用我们的SDK,并未出现丢包情况,是否方便提供更多信息,以便定位问题呢? 36517681030f5565c5.png


    • 您是怎么判断数据丢失的呢?是少了数据个数,还是数据内容有错误?
    • 出错的概率大概是多少?比如是偶尔出现还是比较频繁?
    • 方便的话,能简单说下您的测试方案吗?

  • 解决了,库函数有问题:
    void USART_TxData(USART_T* usart, uint16_t data)
    {
        usart->DATA_B.DATA = data;
    }
    这个DATA_B.DATA只使用了DATA寄存器的9位没使用保留的部分,换为以下方式就没问题
    void USART_TxData(USART_T* usart, uint16_t data)
    {
        usart->DATA = data;
    }
    猜测,DATA寄存器会有两个,一个是TX的一个是RX的,但为了兼容性在逻辑地址上是一个,当执行写寄存器操作时会映射到TX的DATA寄存器,执行读操作时映射到RX的DATA寄存器,而官方库这种只操作DATA寄存器一部分bit的写法可能会导致逻辑地址与物理地址的映射错乱,也就造成了只有在发送时才会导致接收丢包这种现象,这只是我的猜测,还得官方解释一下。

    不过,这么容易复现的严重问题竟然在官方库出现了,确实不应该啊,而且竟然用ST的库没问题,难道用这个片子的都在用ST的库?
  • 感觉这个bug还有点严重,不过倒是可以通过对数据帧添加校验来workaround掉。

  • 这个真心没有遇到过。不过丢包影响很大么。大数据量丢一两个也是很正常啊,或者你开开奇偶校验事实。
  • Gfan 发表于 2025-4-24 18:00
    这部分代码看不出问题噢,需要更多的代码内容才能分析

    建议先排查两个方面:

    1、没有,后面我代码修改了,没发现过载
    2、波特率是一致的,而且只发送或者只接受都不会有问题

    另外我用STM32F107的例程代码就没问题,APM的例程和STM的例程都已经删除的只剩串口部分了,没有其他代码,HCLK、PCLK时钟也检查了完全一致,串口寄存器值也完全一致。
  • 更神奇的是我用STM32F107的例程代码就没问题,APM的例程和STM的例程都已经删除的只剩串口部分了,没有其他代码,HCLK、PCLK时钟也检查了完全一致,串口寄存器值也完全一致
  • 这个真心没有遇到过。
    我们使用的是应答方式来通讯。直接全双工的方式,还真没有实践过
  • 这部分代码看不出问题噢,需要更多的代码内容才能分析

    建议先排查两个方面:
    • 中断处理函数中清除过载标志在判断接收buff非空之前,是否已经发生过载,但被清除。
    • 检查发送速度和接收速度是否一致,如果发送和接收时的速度不一致,可能导致数据丢失。


您需要登录后才可以回复 登录 | 注册