Переадресация / прохождение UART из одного порта в другой - PullRequest
1 голос
/ 06 апреля 2020

Я довольно новичок в программировании на C, но привыкаю к ​​регистрам и способам связи в C. Поскольку UART с использованием официального Arduino read() / write() создает большую задержку при прохождении команд, я попытался перевести этот эскиз Arduino в чистый C. (и потому что у меня есть время поиграть, хаха)

Контроллер и дисплей моего ebike обмениваются данными через UART. Я пытался читать команды и реагировать на изменения скорости или сигналы торможения, но прежде всего мне нужно избавиться от этой огромной задержки при обновлении дисплея.

Я использую Robodyn Mega 2560 PRO (Embed) , который имеет 4x аппаратных последовательных порта. На первом этапе я попытался прочитать, что поступает, и перенаправить его на другой порт. Не должно быть трудно реализовать в C, верно?

void setup() {
  Serial1.begin(1200);  // BBSHD controller  @RX18 TX19
  Serial2.begin(1200);  // Display DP-C18    @TX16 RX17
}

void loop() {
  if (Serial2.available()) {
    Serial1.write(Serial2.read());
  }
  if (Serial1.available()) {
    Serial2.write(Serial1.read());
  }
}

Это то, что я программировал в Atmel Studio 7 до сих пор. Я использовал C пример из ATmega640 / 1280/1281/2560/2561 - Полная таблица данных (Поиск USART_Receive и USART_Transmit) и это руководство Простая последовательная связь с AVR lib c

В настоящее время я могу скомпилировать и набрать sh в 2560, но сообщение не пересылается. Я не знаю настройки по умолчанию, которые использует Arduino с Serial. Какой режим, количество стоп-битов ... Что-то очевидно, что я пропускаю?

#define F_CPU 16000000UL
#define BAUD 1200

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

void uart_init(void) {
    /* Serial1 controller */
    UBRR1H = UBRRH_VALUE;
    UBRR1L = UBRRL_VALUE;
    /* Serial2 display */
    UBRR2H = UBRRH_VALUE;
    UBRR2L = UBRRL_VALUE;

    /* 8-bit data, 1stop bit*/
    UCSR1C = (1<<UCSZ11) | (1<<UCSZ10);
    UCSR2C = (1<<UCSZ21) | (1<<UCSZ20);

    /* Enable RX and TX */
    UCSR1B = (1<<RXEN1) | (1<<TXEN1);
    UCSR2B = (1<<RXEN2) | (1<<TXEN2);
}

int main(void) {

    uart_init();

    while(1) {
        if (!(UCSR1A & (1<<RXC1))) {        /* Only if data is received */
            while (!(UCSR1A & (1<<UDRE1))); /* Wait for empty transmit buffer */
            UDR2 = UDR1;                    /* Put data into buffer, sends the data */
        }

        if (!(UCSR2A & (1<<RXC2))) {        /* Only if data is received */
            while (!(UCSR2A & (1<<UDRE2))); /* Wait for empty transmit buffer */
            UDR1 = UDR2;                    /* Put data into buffer, sends the data */
        }
    }
}
...