无法在 ATMEGA328P Arduino Uno 上使用 AVR-c 正确打印到串行 UART

问题描述 投票:0回答:1

我正在尝试对 ATMEGA328P Arduino Uno“裸机”进行编程,以通过 USB 连接到我的计算机进行串行打印,但是在使用

screen /dev/ttyACM0 9600
和使用 Arduino 时,我只看到打印替换字符 (�) IDE串行监视器。我尝试了不同的波特率,但没有成功,尽管波特率应该是 9600。TX LED 定期闪烁,并且 � 以与预期相同的速率出现。

我正在遵循指南的串行打印部分:https://archive.md/wqcw6。使用同一指南中的 make 指令根本不会导致任何传输,因此我使用了不同的 make(如下所示),这导致了传输,但只是收到了 � 。我怀疑某个地方引起了波特率问题。

这是我的代码:

#include <avr/io.h>
#include <stdio.h>

#ifndef F_CPU
#define F_CPU 16000000UL
#endif

#include <util/delay.h>

#define BAUD 9600

#include <util/setbaud.h>

int uart_putchar(char, FILE*);
void uart_init();

FILE output = FDEV_SETUP_STREAM(uart_putchar, NULL, _FDEV_SETUP_WRITE);

void uart_init(void) {
    UBRR0H = UBRRH_VALUE;
    UBRR0L = UBRRL_VALUE;
    UCSR0C = (1<<UCSZ01) | (1<<UCSZ00); // 8-bit data
    UCSR0B = (1<<TXEN0); // enable TX
}

int uart_putchar(char c, FILE *stream) {
    if (c == '\n') {
        uart_putchar('\r', stream);
    }
    loop_until_bit_is_set(UCSR0A, UDRE0);
    UDR0 = c;
    return 0;
}

int main(void) {
    uart_init();
    stdout = &output;

    while(1) {
        printf("Hello World!\n");
        _delay_ms(500);
    }
    return 0;
}

这是我的 Makefile:

default:
    avr-gcc -Os -DF_CPU=16000000UL -mmcu=atmega328p -c -o serial-print.o serial-print.c 
    avr-gcc -o serial-print.bin serial-print.o
    avr-objcopy -O ihex -R .eeprom serial-print.bin serial-print.hex
    sudo avrdude -F -V -c arduino -p ATMEGA328P -P /dev/ttyACM0 -b 115200 -U flash:w:serial-print.hex

任何提示将不胜感激。谢谢。

c arduino microcontroller avr uart
1个回答
0
投票

我在这篇文章中找到了答案:

ATmega328P USART 发送字符重复打印

将我的 Makefile 更改为以下内容解决了我的问题:

avr-gcc -Os -DF_CPU=16000000UL -mmcu=atmega328p serial-print.c -o serial-print.bin
avr-objcopy -O ihex -R .eeprom serial-print.bin serial-print.hex
sudo avrdude -F -V -c arduino -p ATMEGA328P -P /dev/ttyACM0 -b 115200 -U flash:w:serial-print.hex
© www.soinside.com 2019 - 2024. All rights reserved.