myserial.available() возвращает нулевой байт

Я написал программу для Arduino, которая требует двух портов для последовательной связи. Я намеревался использовать как аппаратный, так и программный последовательный порт, но проблема заключается в получении данных из приемного буфера программного последовательного порта: он всегда возвращает нулевой байт из myserial.available().

Для ясности я использовал пример SoftwareSerial в Arduino IDE ver. 1.8.4. Я попытался изменить скорость передачи данных, но проблема осталась. Я где-то читал, что они внесли некоторые изменения в код в файлах .cpp и .h библиотеки SoftwareSerial. Пытался найти сайт безуспешно. И мой компьютер, на котором я установил эти библиотеки, был украден. До этого он работал нормально.

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

#include <SoftwareSerial.h>

SoftwareSerial mySerial(2, 3); // прием, передача

void setup() {
  Serial.begin(57600);
  while (!Serial) {
    ; // ждем подключения последовательного порта. Нужен только для Леонардо
  }
  Serial.println("Goodnight moon!");
  // устанавливаем скорость передачи данных для порта SoftwareSerial
  mySerial.begin(4800);
  mySerial.println("Hello, world?");
}

void loop() {
  if (mySerial.available())
    Serial.write(mySerial.read());
  if (Serial.available())
    mySerial.write(Serial.read());
}

, 👍0

Обсуждение

К каким устройствам подключены ваши последовательные порты? Можете ли вы добавить четкое фото вашей проводки и устройств., @Squats

В настоящее время я использую proteus 8 professional для моделирования проекта, где я использовал arduino UNO и виртуальный терминал для последовательной передачи и приема. аппаратный последовательный порт подключен к контактам 0 и 1, а программный последовательный порт подключен к контактам 2 и 3, а также я попробовал контакты 10 и 11, как в примере. аппаратный последовательный порт не имеет проблем, и программное обеспечение передается без проблем, но проблема заключается в получении байтов, myserial.available() всегда возвращает нулевые байты. это означает, что в буфере приема ничего не обнаружено, @kassim


2 ответа


2

Пример кода SoftwareSerial https://www.arduino.cc/en/Reference/SoftwareSerialAvailable показывает, что контакты, используемые как tx и rx для SoftwareSerial, должны быть определены с помощью pinMode() в качестве цифрового ввода и вывода.

Пример

// подключаем библиотеку SoftwareSerial, чтобы можно было использовать ее функции:
#include <SoftwareSerial.h>

#define rxPin 10
#define txPin 11

// устанавливаем новый последовательный порт
SoftwareSerial mySerial =  SoftwareSerial(rxPin, txPin);

void setup()  {
  // определяем режимы выводов для tx, rx:
  pinMode(rxPin, INPUT);
  pinMode(txPin, OUTPUT);
  // устанавливаем скорость передачи данных для порта SoftwareSerial
  mySerial.begin(9600);
}

void loop() {
  if (mySerial.available()>0){
    mySerial.read();
  }
}
,

Конструктор устанавливает pinMode(): https://github.com/arduino/Arduino/blob/1.8.4/hardware/arduino/avr/libraries/SoftwareSerial/src/SoftwareSerial.cpp#L257-L284. Примеры скетчей, включенные в библиотеку, а также большая часть другого примера кода в справочнике, не устанавливают режим вывода. Однако было высказано предположение (https://github.com/arduino/Arduino/issues/3041), что делать это так рано в конструкторе плохо, поэтому необходимость установки режима вывода в setup() будет зависеть от реализация init(). Это не должно повредить (кроме пустой траты памяти), и стоит попробовать., @per1234

Пытаясь решить свою проблему, я встретил этот пример, который я также попытался скопировать и сделать пробную версию, но проблема не исчезла. В прошлые дни я читал решение той же проблемы на Github и это решило мою проблему, но к тому моменту, когда я был новичком, я фактически не догнал решение, которое они сделали в файлах библиотеки, были некоторые поправки по некоторым коды, и это решило проблему, но сейчас компьютер, на котором я установил файлы, был украден, а сайты, которые я видел, решение не открывается, это заканчивается ошибкой, что сайт не найден., @kassim


1

Не все контакты Mega и Mega 2560 поддерживают прерывания изменения, поэтому для RX можно использовать только следующие: 10, 11, 12, 13, 14, 15, 50, 51, 52, 53, A8 (62) , А9 (63), А10 (64), А11 (65), А12 (66), А13 (67), А14 (68), А15 (69). Не все контакты Leonardo и Micro поддерживают прерывания изменения, поэтому для RX можно использовать только следующие: 8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI).

,