AVR的C/C++中的数组不断追加

array in C/C++ for AVR keeps appending

本文关键字:追加 数组 C++ AVR      更新时间:2023-10-16

在C中,我有一个数组等待从传感器接收字节,保存在缓冲区中,然后像这样打印出来:

unsigned char responseFrame[300];
int main(void) {
   UART_init();
   while(1) {
       receive(responseFrame);
       myLog(responseFrame, sizeof(responseFrame));
   }
}

我通过以下操作填充数组:

void receive(unsigned char *rcv_buff) {
    uint8_t recv_data;
    for (int i=0; i<300; i++){
            USART1_Flush();
        rcv_buff[i] = USART1_RX();
    }
}

然后我用以下方法打印出缓冲区中的内容:

// Logs this output to the serial port; used for debugging
void myLog(unsigned char *msg, int size) {
    for (int i=0; i<size; i++) {
        USART0_TX(msg[i]);
    }
}

这会打印出数组,但当接收到另一次字节迭代时,所有内容都会被附加,所以假设我首先接收{0xFF,0xFF},第一次迭代的输出是:

0xFF 0xFF, 0x00, 0x00 ... 0x00

但在下一次迭代中,假设接收到{0x0A,0x0A},在输出中,我看到的是:

0xFF, 0xFF, 0x0A, 0x0A, 0x00, 0x00 ... 0x00

注意:省略号只是说有更多的0x00被打印出来,直到我们基本上达到数组的大小。

为什么要从数组的开头进行追加而不是覆盖?

这是我的USART0_TX和USART1_RX函数:

void USART0_TX(uint8_t myData) {
    // Wait if a byte is being transmitted
    while( !(UCSR0A & (1<<UDRE0)) );
    // Transmit data
    UDR0 = myData;
};
uint8_t USART1_RX(void) {
    // Wait until recv buffer is full
    while( !(UCSR1A & (1<<RXC1)) );
    // Return recvd data
    return UDR1;
};

这是我用来刷新USART1 RX:的代码

//USART1 flush, clears USART1 buffer
void USART1_Flush( void )
{
    unsigned char dummy;
    while ( UCSR1A & (1<<RXC1) ) dummy = UDR1;
}

我相信名为"Flush"的函数实际上是一个"Poll"函数,用于查找要出现的字符(这是正常用法,请等待字符出现)。使用RXC1的逻辑显示为反转。试着看看这个看起来很专业的AVR驱动程序(就像你正在做的那样,它有一个民意调查选项):

usart.c

另一个评论良好的受访驱动程序(有很多评论的小驱动程序):avr-uart驱动程序