Проблема с Software Serial: нет ответа

Я использую плату Arduino Uno с IDE 1.6.7.

Я попытался реализовать измененную версию базового примера (пример SoftwareSerial) из библиотеки Software Serial. Код прилагается.

Он должен мигать и печатать сообщение на последовательном мониторе. Но я ничего не получаю.

На самом деле, я тоже пробовал пример как есть. Это тоже не сработало.

#include <SoftwareSerial.h>

SoftwareSerial mySerial(8, 9); // прием, передача

void setup() {
    pinMode(13,OUTPUT);
    // Открытие последовательной связи и ожидание открытия порта:
    Serial.begin(9600);
    while (!Serial) {
        ; // ждем подключения последовательного порта. Требуется только для родного порта USB
    }
    Serial.println("Goodnight moon!");
    // устанавливаем скорость передачи данных для порта SoftwareSerial
    mySerial.begin(9600);
    delay(1000);
}

void loop() { // повторяем снова и снова
    mySerial.println("hell");
    if (mySerial.available() > 0) {
        digitalWrite(13,HIGH);
        Serial.write("working..");
        delay(3000);
        digitalWrite(13,LOW);
        delay(2000);
    }
}

, 👍1

Обсуждение

Вы неправильно понимаете, что делает «доступный». Он не говорит вам, сколько вы отправили, он говорит вам, сколько байтов находится в буфере приема., @Nick Gammon

Я проверяю, есть ли в буфере какие-то данные, а не квант. Если это условие положительное, светодиод с контактом 13 должен мигать. Одновременно должно быть отправлено сообщение на последовательный терминал. Пожалуйста, дайте мне знать, если логика неверна., @rohit

Вы просто говорите «Это не работает», но вы могли бы, по крайней мере, предоставить следы того, что вы видите на «обычной» последовательной консоли и что вы видите на другой последовательной консоли, что вы вводите в качестве ввода, как вы подключили TX/ RX на ваш терминал. Без этой информации может быть дюжина причин, по которым ваша установка не работает., @jfpoilpret

Можем ли мы увидеть схему вашей проводки, если у вас есть провода?, @Roberto Lo Giacco

Было бы очень полезно, если бы вы могли описать свою настройку, например, вашу проводку и то, как вы отправляете сообщения...., @Mero55

Итак, что подключено к программному последовательному Rx (контакт 8)? Просто соедините контакты 8 и 9, чтобы данные, которые вы отправили через контакт 9, были получены в Rx и удовлетворяли условию if. Если это работает, проблема связана с вашим устройством, подключенным к программному Rx., @Sanu - Open Maker

У тебя правильно подключено? Проводка следующая: Tx одного устройства идет на Rx другого. Tx НЕ идет к Tx. Rx НЕ переходит к Rx. Вы должны пересечь их., @Gabriel Staples


3 ответа


0
if(mySerial.available()>0)

mySerial.available() возвращает количество байтов, доступных в буфере последовательного приема. Если вы не отправляете команды через последовательный порт на контактах 8 и 9, это останется 0, и вы никогда не введете оператор if.

Кроме того, здесь у вас есть два объявления для серийного номера:

  1. Serial.begin() инициализировал встроенный USB-модуль UART. Здесь вы сможете отправлять/получать команды с помощью такой программы, как Putty.

  2. SoftwareSerial mySerial(8, 9); // прием, mySerial.begin() инициализирует последовательную связь с контактами 8 и 9 на плате Arduino. Это было бы, если бы вы хотели отправлять/получать команды с цифровым вводом-выводом вместо или в дополнение к USB-модулю UART.

,

Спасибо за быстрый ответ . Однако я отправляю байты в порт mySerial с помощью следующей команды в цикле: mySerial.println("hell"); Не следует ли инициализировать mySerial ?, @rohit

Тот факт, что вы отправляете что-то на TX, не означает, что это будет отражено обратно на RX, все зависит от того, как вы соединили TX и RX и как вы настроили свой последовательный терминал (если вы его используете)., @jfpoilpret

Последовательная порция инициализирована, но в буфере приема ничего нет, если только вы не отправляете данные на Arduino с компьютера через шпатлевку или telnet и т. д., @Anthony Meyer

Просто удалите оператор if, и код должен заставить светодиод хотя бы мигать., @Anthony Meyer


2

SoftwareSerial не может передавать и получать одновременно. Таким образом, даже если вы соедините контакт 8 с 9 проводом, ваш скетч не получит то, что было передано. Это предположение без вашей электрической схемы.

NeoSWSerial может одновременно передавать и получать. Это замена SoftwareSerial.

Однако AltSoftSerial еще лучше и работает только на контактах 8 и amp; 9. Используйте это вместо этого!

В этом ответе сравниваются все 4 типа серийных номеров, включая HardwareSerial.

,

1

Я сделал два скетча для тестирования. Один для Arduino Nano №1, другой для Arduino Nano №2. Они проверены и работают, а не только написаны на этой странице.

No2 отправляет "привет" и No1 слушает и отправляет его на ПК через Serial. Скорость (1200 бит/с) низкая, но так легче увидеть, что происходит.

Подключите контакт 10 разъема №1 к контакту 11 разъема №2 и заземление к заземлению. Подключите Nanos к USB-портам ПК и установите программу-монитор (1200, 8N1) на прослушивание №1.

Похоже, это хороший способ протестировать команды Serial.print, Serial.println и Serial.write. Вы будете удивлены.

/*№1:/

#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // прием, передача
void setup() {
  Serial.begin(1200);
  Serial.println("Testing");
  mySerial.begin(1200);
}
void loop() { // повторяем снова и снова
 if (mySerial.available()) //Если это отсутствует, вы получите быстро повторяющуюся страницу
{
    Serial.write(mySerial.read());
    Serial.print(".");
 }
}

/*№2:/

#include <SoftwareSerial.h>
 SoftwareSerial mySerial(10, 11); // прием, передача
 void setup(){
  mySerial.begin(1200);
}
void loop(){
    mySerial.print("Hello");
}
,