Пример SoftwareSerial не работает должным образом

Недавно я купил Arduino UNO для чтения данных, выводимых моим интеллектуальным счетчиком. Измеритель использует последовательную связь, и я хотел бы видеть значения, выводимые на экран моего ноутбука. Я подумал, что мне нужно будет использовать библиотеку SoftwareSerial для чтения входящих данных и печати этих данных на моем экране с использованием аппаратного последовательного интерфейса и последовательного монитора в IDE Arduino. Чтобы ознакомиться с (программным) последовательным соединением на Arduino, я просмотрел документацию библиотеки SoftwareSerial. Проблема в том, что я не могу заставить работать самый простой пример, и я застрял в нем довольно долго. Пример кода приведен ниже, пример можно найти здесь

#include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 11); // RX, TX

void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(57600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }


  Serial.println("Goodnight moon!");

  // set the data rate for the SoftwareSerial port
  mySerial.begin(4800);
  mySerial.println("Hello, world?");
}

void loop() { // run over and over
  if (mySerial.available()) {
    Serial.write(mySerial.read());
  }
  if (Serial.available()) {
    mySerial.write(Serial.read());
  }
}

Насколько я понимаю, должно произойти следующее: - Введите текст в окне Serial Monitor. - Serial.read() читает эти данные и записывает их в серийный номер программного обеспечения. - Software Serial считывает эти данные и записывает их обратно в Serial. - То, что было написано, появляется на экране.

Но что бы я ни старался, ничего не происходит. Среди прочего я попытался: - изменить скорость передачи данных для программного и аппаратного обеспечения (например, 9600). - Попробовал другую библиотеку SoftwareSerial (AltSoftSerial). - Пробовал разные выводы RX и TX для Software Serial. - Вместо Serial.write(mySerial.read());, сохранить результат в char первый.

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

редактировать

У меня не было проводки, потому что в примере указано "Нет схемы для этого примера". Я перепробовал все три варианта, предложенные @slash-dev, но ни один из них не имел ожидаемого поведения:

SoftwareSerial с проводами, соединяющими контакт 1 с контактом 10 и контакт 0 с контактом 11. Он печатает странные символы:

Goodnight moon!
Ùniÿhtÿmoÿn!ÿ
nihtmoÿttt

AltSoftSerial с проводами, соединяющими 1-8 и 0-9. Первые отпечатки Goodnight moon! а затем он продолжает печатать Ô당¥�¡Ñ�moon!,

NeoSWSerial с проводами, соединяющими 1-10 и 0-11. Такой же как AltSoftSerial но продолжает печатать Ôë‹–+ë¡Ñ�j½½¹…j,

2 ответа

Скорость передачи данных должна быть одинаковой на Serial а также mySerial,

И вы не описываете соединения, поэтому я должен спросить: вы подключили провод от контакта 1 (Serial передать) на контакт 10 (mySerial получить) и еще один провод от контакта 0 (Serial получить) на контакт 11 (mySerial передачи)? Обратите внимание, как они пересекаются.

AltSoftSerial действительно лучший выбор, но он работает только с контактами 8 (RX) и 9 (TX), что потребует подключения 8 к 1 и 9 к 0. SoftwareSerial очень неэффективен, потому что он отключает прерывания на длительные периоды времени. Это может помешать другим частям вашего эскиза или другим библиотекам.

Моя библиотека NeoSWSerial - еще одна альтернатива. Это почти так же эффективно, как AltSoftSerial, но он работает на любых двух выводах. Он может передавать и получать одновременно (в отличие от SoftwareSerial), но работает только на бодах 9600, 19200 и 38400.

РЕДАКТИРОВАТЬ:

Я думаю, что вы пытались, вероятно, работает нормально. Все программные последовательные библиотеки используют прерывания для обработки отдельных битов вместо одного прерывания на символ. Когда в системе есть другие прерывания (millis() TIMER0 или Serial), бит "расчеты" может быть затронут. Это проявляется как получение неправильного байта. Ваш тест обратной петли делает его особенно восприимчивым, потому что отправка и прием синхронизированы (первоначальное прерывание приема происходит, когда прерывание передачи запускает следующий символ).

Если вы просто подключите 0 к 1, я думаю, что это сработает, потому что UART может отправлять и получать одновременно, и он имеет дело с полными символами, а не битами. Символьные прерывания не мешают отправке или приему битов.

Разрабатывая библиотеку NeoSWSerial, я видел это так же. Мне пришлось использовать два Arduinos для полного асинхронного тестирования (то есть, не синхронизированы). В вашем случае использование AltSoftSerial для SmartMeter должно работать нормально, и вы можете выбирать различные скорости передачи данных. Если вы повторяете символы SmartMeter в Serial убедитесь, что у вас более высокая скорость передачи Serial,

Скорее всего, это не связано с проблемами 5-летней давности, но в моем случае я использовал Arduino IDE 2.0.0-rc5, которая по неизвестным причинам не записывалась в программный серийный номер. Я перешел на Arduino IDE 1.8.19, и тот же серийный скетч заработал.

Другие вопросы по тегам