Пример 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, и тот же серийный скетч заработал.