STM32
直播中

caosurround

11年用户 799经验值
私信 关注
[问答]

用stm8S103接收串口数据时,任何大小的数据包末尾的数据总是会重复接收到最后一个字节,怎么解决?

大家好,我最近用stm8S103接收串口数据时,任何大小的数据包末尾的数据总是会重复接收到最后一个字节,比如我发送 01 02 03,单片机会接收到01 02 03 03,我发送01 02 03 04 05 06,单片机会接收到01 02 03 04 05 06 06。请问有没有遇到过类似问题的?
我的程序关键部分如下:
时钟部分:
CLK_SYSCLKConfig(CLK_PRESCALER_HSIDIV2);
串口初始化部分:
UART1_DeInit();
UART1_Init((u32)9600, UART1_WORDLENGTH_8D, UART1_STOPBITS_1,
     UART1_PARITY_NO, UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_RX_ENABLE);
    UART1_ITConfig(UART1_IT_RXNE_OR, ENABLE);



串口中断部分:
u8         x, ch;
UART1_ClearITPendingBit(UART1_IT_RXNE);
x         =  UART1->SR;

  ch         =  UART1->DR;
    //test_counter++;

    GPIO_WriteReverse(GPIOA, GPIO_PIN_3);
    if (RxCounter == 0)
    {
        if (ch == 0x55)
        {
            RxBuffer[0] = ch;
            RxCounter = 1;
        }
        else
        {
            RxCounter = 0;
        }
    }
    else


    .
    .
    .

回帖(1)

胖子的逆袭

2024-5-15 16:41:19
您好!根据您的描述,您在使用STM8S103单片机接收串口数据时遇到了数据包末尾数据重复接收的问题。这个问题可能是由于接收缓冲区溢出或者接收中断处理不当导致的。以下是一些建议和解决方案:

1. 检查接收缓冲区大小:确保您的接收缓冲区足够大,可以容纳接收到的数据。如果缓冲区太小,可能会导致数据溢出,从而导致重复接收。

2. 使用环形缓冲区:考虑使用环形缓冲区来存储接收到的数据。环形缓冲区可以有效地避免缓冲区溢出的问题。

3. 检查接收中断:确保您的接收中断处理程序正确地处理了接收到的数据。在接收到一个字节后,应立即从硬件接收缓冲区中读取该字节,并将其存储到软件缓冲区中。同时,确保在接收到一个字节后,清除硬件接收缓冲区的接收标志。

4. 优化接收中断处理程序:在接收中断处理程序中,您可以使用一个标志变量来跟踪是否已经接收到完整的数据包。当接收到完整的数据包后,可以禁用接收中断,以防止接收到额外的数据。

5. 检查串口配置:确保您的串口配置正确,包括波特率、数据位、停止位和奇偶校验位等。错误的串口配置可能导致数据接收不准确。

6. 使用软件流控制:如果可能,可以考虑使用软件流控制(如XON/XOFF)来控制数据的发送和接收,以避免数据包的丢失和重复。

7. 检查硬件连接:确保您的硬件连接正确,包括串口TX和RX引脚的连接。错误的硬件连接可能导致数据接收问题。

8. 更新固件:检查是否有可用的固件更新,以解决可能的已知问题。

9. 使用调试工具:使用调试工具(如ST-LINK)来监视串口接收过程,以便更好地了解问题所在。

10. 参考示例代码:查阅STM8S103的官方文档和示例代码,以确保您的实现与推荐的实现一致。

希望这些建议能帮助您解决数据包末尾数据重复接收的问题。如果问题仍然存在,请提供更多关于您的程序和硬件连接的详细信息,以便进一步分析和解决。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分