Последовательная связь 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


1 ответ


Лучший ответ:

1

Оказалось, проблема была в моем Makefile. В avr-gcc отсутствовал флаг -mmcu=atmega328p. Как только я его добавил и изменил F_CPU на 16000000UL, все заработало.

,