Serial не работает на Меге. Сериалы 1-3 работают. Код один и тот же

Экран Nextion подключен. Есть для удобства такая конструкция:

#define SerialNexion Serial

void setup() {
  SerialNexion.begin(9600);  // и далее все функции serial так же
}

Если указывать в дефайне Serial1 или Serial2 или Serial3 все работает.
Если так, как указано в коде выше, то нет.
Конечно, я менял провода местами.

Кто знает, что не так?

P.S. Сам код размером в полбесконечности. Вряд ли нужно его приводить полностью.

патамучто на Serial весит мост USB-UART, который используется для загрузки кода и мешает работе дисплея.

Но на Уно не мешает. Мало того, я пробовал на голой Atmege128a - результат аналогичен.
Он мешает только загружать не вытыкая провода.

с Nextion видны данные в мониторе порта?

В мониторе ничего нет.

P.S. Простой код (вывод данных с датчика) совершенно свободно работает в Serial …

Допустим, вы запустили Некстион на Serial. Использование этого же Сериала для связи с компом планируется или нет?

Только не одновременно и только для загрузки скетча.

В общем, наверное тему приходится закрывать. Подожду еще день на всякий.
На англоязычном форуме нашел такие же проблемы и все сводится либо к железу, либо к коду.
Поскольку технически различий нет, не нашел я и в даташите на контроллер никаких особенностей.
Поскольку у меня железа нет никакого в данном случае, видимо где-то код позволяет компилятору проявлять неоднозначность.

без кода шансов нет

А при прошивке скорость перенастраивается на 115200

Если уж " на всякий" то попробуйте “вручную” инициализировать , и , если сможете , что- нибудь передать
Проверил в Proteus ))

Спойлер
void USART0_9600_8n1_Init() {
  UBRR0H = (unsigned char)(103u >> 8);
  UBRR0L = (unsigned char)103;
  UCSR0B = (1 << RXEN0) | (1 << TXEN0);
  UCSR0C = (1 << UCSZ00) | (1 << UCSZ01);
}

void TxUchar(unsigned char Data)
{
  while ( !( UCSR0A & (1 << UDRE0)));
  UDR0 = Data;
}

void setup() {
  USART0_9600_8n1_Init ();
}

void loop() {
  static unsigned char UChar = '0';
  TxUchar(UChar);
  UChar++;
  if (UChar > '9')
    UChar = '0';
    delay(500);
}
1 лайк

так может тогда экран запустить на 115200?

SerialNexion.begin(115200);
*****
bauds=115200

Serial на 115200 не работает, остальные работают.

Спасибо.
Небольшой тестовый код работает без проблем с Serial.

Инициализацию добавил в свой, без изменений, к сожалению.
Вставлял Serial_8N1 тот же эффект, точнее без оного.

Возможно, в коде используете много прерываний, и прерывания от USART0 не успевают вовремя. Попробуйте снизить скорость .

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

1 лайк

На некоторых Мегах, перепутаны подписи ног первого сериала. Если у Вас так, то просто поменяйте местами Rx и Tx

На всех моих мегах перепутаны, я не смотрю даже на надписи.
По моей классификации синий ниже желтого, это всегда 100%
К тому же этот блок для сериалов 1-3, они-то работают без нареканий на любых скоростях.
Проблема с главным Serial который 0

Вообще без прерываний, блин.
Ладно, большое спасибо за участие.

Это видимо выше сил человеческих.
Я тут обойдусь костылями, а потом как время будет, перепишу и после каждой итерации буду заливать смотреть - в какой момент пропадет.

На сколько я знаю - такого не может быть. Как минимум миллис/микрос точно должны работать, а работают они на прерываниях.

Ну конечно.
Я понял этот вопрос как о собственно написанных.
Миллисов у меня минимальный минимум там.

Вот, последнее, что могу…))
Два варианта инита, функцию желательно вызывать в предпоследней строчке сетапа, а в последней delay(300);

Спойлер
void USART0_INTERRUPT_RXC_UDRE_9600_8n1_Init() {
  UCSR0A = 0x20;
  UBRR0H = (unsigned char)(103u >> 8);
  UBRR0L = (unsigned char)103;
  UCSR0B = 0xB8;
  UCSR0C = 0x06;
}
Спойлер
void USART0_INTERRUPT_RXC_TXC_UDRE_9600_8n1_Init() {
  UCSR0A = 0x20;
  UBRR0H = (unsigned char)(103u >> 8);
  UBRR0L = (unsigned char)103;
  UCSR0B = 0xD8;//0x18;
  UCSR0C = 0x06;
}
1 лайк