【问题标题】:AVR USART transmitting only 2 charsAVR USART 仅传输 2 个字符
【发布时间】:2017-05-05 04:12:41
【问题描述】:

下面是在 ATmega328P 上运行的代码。它应该每秒向我的计算机发送“abcdef”。但是,它每秒只给我发送“ab”。这里有什么问题?

#include <avr/io.h>
#include <util/delay.h>

void USART_transmit(unsigned char data);
void print(const unsigned char *buffer, size_t n);
void print(const char* str);

int main(void) {
    // Serial.begin(115200)
    UCSR0B |= (1<<TXEN0);
    UBRR0L = 8;

    while(1){
        // Serial.write(i)
        print("abcdef");

        _delay_ms(1000);
    }
}

void USART_transmit(const uint8_t data) {
    /* wait for empty transmit buffer */
    while (!UCSR0A & (1<<UDRE0));
    UDR0 = data;
}

void print(const uint8_t *buffer, size_t n) {
    while(n--){
        USART_transmit(*buffer++); //**
    }
}

void print(const char *str) {
    if(strlen(str) != 0) print((const uint8_t *) str, strlen(str));
}

代码导致:

ababababababababababab...

USART_transmit(*buffer++); 更改为USART_transmit(n + 48);(+48 转换为字符)导致:

5454545454545454545454545454...

所以我猜循环不应该停止?

【问题讨论】:

    标签: arduino avr atmega usart


    【解决方案1】:

    “数据寄存器为空”检查错误。

    while (!UCSR0A & (1<<UDRE0));
    

    应该是

    while (!(UCSR0A & (1 << UDRE0)));
    

    在您的情况下,直到缓冲区为空,检查才会阻塞。我认为一个字节缓冲在 USART 输出缓冲区中,一个字节在 UDR 中待处理。然后丢弃每个额外的字节,这就是为什么您只能看到“ab”。

    【讨论】:

      猜你喜欢
      • 2013-10-29
      • 1970-01-01
      • 2020-03-17
      • 2016-06-13
      • 2017-03-16
      • 1970-01-01
      • 2017-11-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多