Почему порты UART не работают на коммутационной плате Portenta?

Я использую коммутационную плату Portenta Arduino, подключенную к Portenta H7 для проекта, над которым я работаю. Проект требует от меня использования трех датчиков Adafruit Ultimate GPS и подключения каждого к собственным портам UART на Portenta. секционная доска. Я использую только UART0, UART1 и UART2 (соответственно Serial, Serial1 и Serial2).

Чтобы получить данные, я использовал этот пример кода из Arduino IDE:

// Тестовый код для Ultimate GPS с использованием аппаратного последовательного порта
// (например, GPS для Леонардо, Флоры или FeatherWing)
//
// Этот код показывает, как проверить сквозное соединение между USB и последовательным интерфейсом оборудования.
//
// Протестировано и отлично работает с Adafruit GPS FeatherWing.
// ------> https://www.adafruit.com/products/3133
// или Флора GPS
// ------> https://www.adafruit.com/products/1059
// но также работает со щитом, прорывом
// ------> https://www.adafruit.com/products/1272
// ------> https://www.adafruit.com/products/746
//
// Купите его сегодня в магазине электроники Adafruit.
// и помогаем поддерживать оборудование с открытым исходным кодом & программное обеспечение! -ада

// как называется аппаратный последовательный порт?
#define GPSSerial Serial1

void setup() {
  // делаем эту скорость передачи данных достаточно быстрой, чтобы мы ее не ждали
  Serial.begin(115200);

  // ждем появления серийного номера оборудования
  while (!Serial) delay(10);

  // 9600 бод — скорость по умолчанию для Ultimate GPS
  GPSSerial.begin(9600);
}


void loop() {
  if (Serial.available()) {
    char c = Serial.read();
    GPSSerial.write(c);
  }
  if (GPSSerial.available()) {
    char c = GPSSerial.read();
    Serial.write(c);
  }
}

Этот код работает для Serial1, и я получаю данные, когда подключаю GPS к порту UART1 коммутационной платы. Когда я вызываю Serial или Serial2, меняя #define GPSSerial Serial1 на #define GPSSerial Serial или #define GPSSerial Serial2, код будет загружен с помощью ошибок нет, но я не получаю никаких данных от GPS, когда он подключен к соответствующему порту UART (UART0 и UART2).

Я проверил, поступают ли данные автоматически только с порта UART1, но ничего не отображается, когда я вызываю Serial или Serial2, чего и следовало ожидать.

Кто-нибудь знает, как решить эту проблему? Могут ли порты UART0 и UART2 не передавать данные на плату Portenta H7, поэтому я не вижу никаких данных?

Пожалуйста, дайте мне знать, если мне нужно что-то уточнить.

, 👍2


1 ответ


2

Я только что потратил день на поиск этой проблемы. Причина в том, что Arduino нарушил правила именования этих портов UART. Пожалуйста, смотрите таблицу ниже. Я создал эту таблицу на основе схемы Portenta и Схема коммутационной платы.

Схема разводки П. Схема @ J1,J2 П. Схема @ Micro Микроконтакт (tx,rx) pins_arduino.h
UART0 Серийный2 UART4 (PA0,PI9) не определено
UART1 Серийный1 LPUart (PA9,PA10) Может быть, Серия 1?
UART2 Серийный номер3 UART6 (PG14,PG9) не определено
UART3 Последовательный4 UART8 (PJ8,PJ9) Серия 3

К сожалению, как вы можете видеть, встроенные определения последовательных портов в pins_arduino.h не будут работать для коммутационной платы. (если вы не используете Serial 1 или Serial 3)

Если вы хотите использовать другие последовательные порты, вам необходимо определить свои собственные последовательные порты, что на самом деле не так уж и сложно. Вам просто нужно вручную указать контакты, и все готово.

#include "Serial.h"
UART UART0Breakout = UART(PA_0, PI_9);
UART UART2Breakout = UART(PG_14, PG_9);
void setup()
{
    UART0Breakout.begin(115200);
    UART2Breakout.begin(115200);
}

Надеюсь, это вам поможет! Это, конечно, на какое-то время свело меня с ума. К сожалению, схема, которую я использовал для коммутационной платы, не была так хорошо аннотирована, как та, которую я привел здесь (я нашел ее, когда писал этот ответ).

,