【问题标题】:UART issue for reading 2 bytes length读取 2 个字节长度的 UART 问题
【发布时间】:2021-01-10 11:14:21
【问题描述】:

两个设备(计算机和 STM8S2 板)之间的 UART1 通信出现问题。

我在计算机中实现了将两个字节长度的数据写入 STM8 的软件

• 用作标识符的第一个字节;

•第二个字节是我要写入VLS内存的数据,

但是,在 STM8 上,只读取了第一个字节,并且两次, 例如,我发送了标识符 0xb7 和数据 0x90,但只有字节 0xb7 以 (0xb7, 0xb7) 的形式存储在缓冲区中。

现在我正在通过 UART 中断每次读取 1 字节长度来实现它,但我担心它会使固件更容易出现错误,如果数据具有相同的标识符字节值。

我认为最好的解决方案是将其作为两个字节的数据发送。但是我该如何实现它,或者为什么只有第一个字节被重复读取?

以下是STM8中接收和写入数据的函数:

void UART1_ReceiveBytes(uint8_t * buf, uint8_t numberOfBytes)
{
    while (numberOfBytes > 0){
        *(buf++) = UART1_ReceiveData8();
        numberOfBytes--;
    }
}


void UART1_SendBytes(uint8_t *data, unsigned int numberOfBytes)
{
    while (numberOfBytes > 0) {
        UART1_SendData8(*data++);
        numberOfBytes--;
        while(UART1_GetFlagStatus(UART1_FLAG_TXE) == RESET);
    }
}

UART 设置:

void UART1_setup(void)
{
    UART1_DeInit();
    UART1_Init( 9600, 
                UART1_WORDLENGTH_8D,
                UART1_STOPBITS_1,
                UART1_PARITY_NO,
                UART1_SYNCMODE_CLOCK_DISABLE,
                UART1_MODE_TXRX_ENABLE);
    
    UART1_ITConfig(UART1_IT_RXNE_OR, ENABLE);
    enableInterrupts();
    
    UART1_Cmd(ENABLE);
}

发送到 STM8 的数据样本

enter image description here

我正在使用带有 Cosmic 编译器的 ST Visual Develop。

提前致谢

【问题讨论】:

    标签: uart stm8


    【解决方案1】:

    函数UART1_ReceiveBytes 错误。它不会等待新角色的到来。它应该是这样的:

    void UART1_ReceiveBytes(uint8_t * buf, uint8_t numberOfBytes)
        {
            while (numberOfBytes > 0)
            {
                while (!(UART1->SR & (UART1_SR_RXNE)))
                {
                    //timeout considerations, you can just leave it empty
                }
                *(buf++) = UART1_ReceiveData8();
                numberOfBytes--;
            }
        }
    

    【讨论】:

    • 在第二个循环之后,它被卡在这里 - while (!(UART1->SR & (UART1_SR_RXNE)))-。我正在逐行调试,但我无法弄清楚原因
    • 啊是的,因为你只发送 2 个字节,它会等待第三个字节。我会尽快改正的
    • @GustavodaSilvaGhedim 但无论如何,如果您设置 numberOfBytes=2,为什么外部 while 应该进入第三个循环?你确定要正确设置 numberOfBytes 吗?
    • 你的意思是 0) > 但它只进入循环两次,第三次条件不再满足
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多