C++ C/C+中的数组+;因为AVR一直在追加

C++ C/C+中的数组+;因为AVR一直在追加,c++,c,global-variables,avr,C++,C,Global Variables,Avr,在C中,我有一个数组等待从传感器接收字节,保存在缓冲区中,然后像这样打印出来: unsigned char responseFrame[300]; int main(void) { UART_init(); while(1) { receive(responseFrame); myLog(responseFrame, sizeof(responseFrame)); } } 我通过执行以下操作填充阵列: void receive(unsigned

在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]);
    }
}
但是在下一次迭代中,假设接收到{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;
};
void USART0\u TX(uint8\u t myData){
//如果正在传输字节,请等待

虽然(!(UCSR0A&(1我相信你的函数名为“Flush”实际上是一个“Poll”函数,寻找要出现的字符(这是正常用法,等待字符出现)。你使用RXC1的逻辑看起来是相反的。试着看看这个看起来相当专业的AVR驱动程序(它和你正在做的一样有一个Poll选项):


另一个评论很好的民意调查驱动程序(很小,有很多评论):

我对AVR了解不多,但可能USART1_RX
背后的数据是缓冲的,不会自动刷新。这意味着在刷新之前,您只需再次读取相同的数据,并附加任何新数据。正如smocking指出的,情况很可能是这样。另外,如果您使用现代编译器,volatile关键字不需要,因为编译器很可能会忽略它,关键字寄存器也是如此。为什么要编写
&responseFrame[0]
responseFrame
也可以,可以阅读。你从哪里得到关于USART1_RX的文档?从我看来,这是一个中断向量,不是你应该轮询的东西,除非你在幕后做了一些奇怪的事情。@Justin USART1_RX只是一个自定义函数,我正在调用ge我已经编辑了这个问题,把它包括在上面。
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 flush, clears USART1 buffer
void USART1_Flush( void )
{
    unsigned char dummy;
    while ( UCSR1A & (1<<RXC1) ) dummy = UDR1;
}