【问题标题】:array in C/C++ for AVR keeps appending用于 AVR 的 C/C++ 中的数组不断追加
【发布时间】:2012-07-26 15:42:46
【问题描述】:

在 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;
}

【问题讨论】:

  • 我对 AVR 了解不多,但可能USART1_RX 后面的数据是缓冲的,不会自动刷新。这意味着您只是再次读取相同的数据并附加任何新数据,直到您刷新它。
  • 正如 smocking 所指出的,很可能就是这种情况。另请注意,如果您使用现代编译器,则不需要 volatile 关键字,因为编译器很可能会忽略它,关键字寄存器也是如此。
  • 为什么写&amp;responseFrame[0]responseFrame 也可以正常工作,并且可以阅读。
  • 您从哪里获得有关 USART1_RX 的文档?据我所知,这是一个中断向量,除非你在幕后做一些奇怪的事情,否则你不应该轮询。
  • @Justin USART1_RX 只是一个自定义函数,我调用它来从寄存器中获取数据。我已经编辑了问题以将其包含在上面。

标签: c++ c global-variables avr


【解决方案1】:

我相信你的“Flush”函数实际上是一个“轮询”函数,寻找出现的字符(这是正常用法,等待字符出现)。使用 RXC1 的逻辑出现反转。试试看这个看起来很专业的 AVR 驱动程序(就像你正在做的那样有一个投票选项):

usart.c

另一位好评如潮的投票司机(而且很小,有很多 cmets):avr uart driver

【讨论】:

    猜你喜欢
    • 2019-04-29
    • 2014-05-16
    • 1970-01-01
    • 1970-01-01
    • 2015-02-10
    • 2021-08-20
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    相关资源
    最近更新 更多