Задать вопрос
IlyaSpirit
@IlyaSpirit
Рзаработчик JS, PHP, Python, Arduino

Как правильно настроить аппаратный UART между Arduino DUE и Mega?

Приветствую. Подскажите как правильно настроить передачу данных по UART с arduino DUE на arduino MEGA?

DUE принимает по usb порту данные в реальном времени, постоянно. 35 байт. На основе принятых данных включаются те или иные светодиоды, вращаются сервоприводы. (Параллельно работает как hid устройство по второму порту) - короче симулятор приборной панели))) привет ETS.

И вот к ней появилась необходимость добавить дисплей, чтобы отображать часть приходящих данных (например время, статус круиз контроля, уровень повреждений, и тд.)
Дисплей с разрешением 480x320 на чипе 9488 удалось завести, но spi очень медленный и отрисовка блочила ход программы. Изза этого большая задержка на светодиодах и сервы ведут себя непредсказуемо и тд.

Было принято решение дисплей поменять на вот такой: вот такой воткнуть в мегу, а по UART отдать часть приходящих данных. (около 15 байт)

И вот тут понадобилась помощь. Данные пока тестовые, но проблема есть - данные доходят но меняются местами все время. Привожу примеры скетчей.

Подключение: DUE TX1 -> MEGA RX1 ну и земли замкнуты.

Как ограничить количество байт и вообще правильно все построить?!

DUE - отправитель
#define PACKET_SYNC 0xFF
void setup() {   
  Serial.begin(255000); // это usb с компа 
  Serial1.begin(9600);
}

void loop() {
  //1
  Serial1.write(PACKET_SYNC);
  //2
  Serial1.write(120);
  //3
  Serial1.write(66);
  //4
  Serial1.write(200);
}


MEGA - приниматель
#define PACKET_SYNC 0xFF
int serial_byte;

void setup() {
  Serial.begin(9600); //вместо дисплея пока на тестах гляжу просто в монитор порта
  Serial1.begin(9600);
  Serial.println("reset");
}

void loop() {
  //1
  serial_byte = Serial1.read();
  //if (serial_byte != PACKET_SYNC) return;
 //проверка пока закрыта, она конечно частично решает вопрос но отправка все равно скачет и иногда вообще 
 //заканчивается
  Serial.println(serial_byte);  
  //2
  serial_byte = Serial1.read();
  Serial.println(serial_byte);
  //3
  serial_byte = Serial1.read();
  Serial.println(serial_byte);
  //4
  serial_byte = Serial1.read();
  Serial.println(serial_byte);
  Serial.println("------------");
  delay(200);
}
  • Вопрос задан
  • 112 просмотров
Подписаться 1 Средний 2 комментария
Пригласить эксперта
Ответы на вопрос 3
@kalapanga
Первое, что стоит сделать, это взять в качестве образца пример получения данных из serial, идущий в комплекте с Arduino IDE. По результату уже смотреть далее.
Данные на Мегу приходят абсолютно в произвольный момент относительно выполнения её кода. Сейчас, например, могут впустую выполниться два первых Serial1.read() не прочитав ничего, а данные в буфере появятся, только к третьему чтению. Вот всё и съехало.
Ответ написан
@mordo445
почему вы не отправляете все данные одним пакетом? У вас же 15 байт, всё влезат в буфер. Нет смысла отправлять отдельные байты, лучше отправить структуру и парсить ее в структуру
Ответ написан
Комментировать
nava2002
@nava2002
Инженер
Во первых там нужно согласовать порты. DUO 3.3v MEGA 5v Но это мелочи.
В данном случае можно взять готовый экран (не дешевый) но уже со встроенным контроллером и работающем по СОМ порту.
И второй вариант: Оставить DUO но использовать многозадачность, за счет этого она будет успевать и экран обработать и данные получить.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы