我正在尝试对 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
任何提示将不胜感激。谢谢。
我在这篇文章中找到了答案:
将我的 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