Я довольно новичок в программировании на 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 */
}
}
}