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());
}
@kassim , 👍0
Обсуждение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
Не все контакты 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).
- AT-команда не отвечает на последовательный монитор
- Как отправить команду AT на sim800l с помощью SoftwareSerial
- Ардуино для чтения с преобразователя RS232 в последовательный модуль TTL
- Чтение SMS с помощью Arduino Uno и SIM800L и печать на LCD (16x2 буквенно-цифровых) с использованием последовательного соединения
- Как связаться с ESP8266 ESP01, отправив данные через программный сериал на Arduino Uno?
- Последовательная связь от Arduino до ESP8266 NodeMCU работает, но от NodeMCU до Arduino не работает
- SoftwareSerial данные недоступны
- последовательная передача данных на GPS-экране duinopeak
К каким устройствам подключены ваши последовательные порты? Можете ли вы добавить четкое фото вашей проводки и устройств., @Squats
В настоящее время я использую proteus 8 professional для моделирования проекта, где я использовал arduino UNO и виртуальный терминал для последовательной передачи и приема. аппаратный последовательный порт подключен к контактам 0 и 1, а программный последовательный порт подключен к контактам 2 и 3, а также я попробовал контакты 10 и 11, как в примере. аппаратный последовательный порт не имеет проблем, и программное обеспечение передается без проблем, но проблема заключается в получении байтов, myserial.available() всегда возвращает нулевые байты. это означает, что в буфере приема ничего не обнаружено, @kassim