Последовательная связь Arduino и AVR через USB
У меня есть Arduino Uno Rev3, и я хотел бы использовать набор инструментов разработки AVR для написания программы, которая выполняет последовательную связь через USB.
Сделать это с помощью Arduino IDE довольно просто:
void setup() {
Serial.begin(9600);
}
void loop() {
int i;
while(1) {
Serial.write("hello\n");
delay(5000);
}
}
Затем из Linux я могу просто прочитать из /dev/ttyACM0
и каждые 5 секунд получать "hello\n".
Я нашел запись в блоге под названием Простые последовательные коммуникации с AVR libc, в которой объясняется, как выполнять последовательную коммуникацию с использованием набора инструментов разработки AVR. Упрощенная версия приведенного выше эскиза Arduino приведена ниже.
#ifndef F_CPU
#define F_CPU 8000000UL
#endif
#ifndef BAUD
#define BAUD 9600
#endif
#include <stdio.h>
#include <avr/io.h>
#include <util/delay.h>
#include <util/setbaud.h>
void uart_init() {
// Старший и младший байты вычисленного значения предварительного делителя для бод.
UBRR0H = UBRRH_VALUE;
UBRR0L = UBRRL_VALUE;
// Настройте размер кадра данных на 8 бит.
UCSR0C = _BV(UCSZ01) | _BV(UCSZ00);
// Настройте для включения передатчика.
UCSR0B = _BV(TXEN0);
}
void uart_putchar(char c) {
// Подождать, пока освободится регистр для записи.
loop_until_bit_is_set(UCSR0A, UDRE0);
// Записываем байт в регистр.
UDR0 = c;
}
void uart_putstr(char *data) {
// Цикл до конца строки, записывая символ за символом.
while(*data){
uart_putchar(*data++);
}
}
int main() {
uart_init();
while(1) {
uart_putstr("hello\n");
_delay_ms(5000);
}
return 0;
}
Проблема в том, что это на самом деле не работает. Я могу собрать и прошить ATmega328p, но он вечно считывает данные в блок /dev/ttyACM0
. Я подозреваю, что последовательная связь происходит на некоторых контактах, а не через USB, но я в этом не уверен.
Есть ли у кого-нибудь идеи, как можно эмулировать Serial.write
с помощью набора инструментов разработки AVR и записать вывод через USB?
1 ответ
Лучший ответ:
Оказалось, проблема была в моем Makefile
. В avr-gcc
отсутствовал флаг -mmcu=atmega328p
. Как только я его добавил и изменил F_CPU
на 16000000UL
, все заработало.
- Последовательная связь ESP8266 с ATMega328P
- Arduino Uno не загружает код и перегревается
- Заменить предохранители Arduino Uno (может ли Arduino Uno заменить свои собственные предохранители?)
- ATmega328P-PU: программатор не отвечает
- Arduino Uno R3 не распознается Arduino IDE в Ubuntu 21.04
- 16-герцовая плата Uno R3 против платы Arduino Uno R3
- SoftwareSerial не будет читать всю напечатанную строку при вызове readString()
- Arduino UARTS Автоматическая адресация ведомых устройств