读取2个字节长的UART问题

问题描述

两个设备(计算机和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

我正在将ST Visual Develop与Cosmic编译器一起使用。

预先感谢

解决方法

函数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--;
        }
    }