0

我遇到了两个设备(计算机和 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 的数据样本

在此处输入图像描述

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

提前致谢

4

1 回答 1

0

功能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--;
        }
    }
于 2020-09-24T11:16:33.293 回答