Аппаратный последовательный порт не работает, SoftwareSerial - работает
На моем Uno-эквивалентном Arduino соединение SoftwareSerial (на RX, TX = 8, 9) работает*, в то время как аппаратное последовательное соединение с тем же устройством настроено таким же образом (но на контактах RX, TX = 0, 1) не работает. Почему аппаратная настройка последовательного порта не работает?
*Под работой я подразумеваю получение байта от внешнего устройства
Изменить: в качестве простого примера:
void setup() {
Serial.begin(38000);
pinMode(7, OUTPUT);
}
void draw() {
if (Serial.available() > 0) {
Serial.read();
tone(7, 440, 1000);
}
}
Вышеприведенное с использованием Serial
не работает, тогда как
#include <SoftwareSerial.h>
SoftwareSerial serial(8, 9);
void setup() {
serial.begin(38000);
pinMode(7, OUTPUT);
}
void draw() {
if (serial.available() > 0) {
serial.read();
tone(7, 440, 1000);
}
}
работает.
Не знаю, поможет ли это, но подключение RX/TX через светодиод к земле дало мне следующее, используя Serial on (0, 1) и SoftwareSerial on (8, 9):
Серийный
RX: яркий
TX: яркий
softwareSerial
RX: тусклый (но все еще горит)
TX: яркий
Имеет ли значение тот факт, что RX тусклый при использовании SoftwareSerial?
@Dodo, 👍0
Обсуждение2 ответа
Причин может быть несколько
- Убедитесь, что контакт UC подключается к контактному разъему.
- В части установки вы пишете Serial.begin(xxxx);
- После запуска последовательного порта не изменяйте функции ввода-вывода (ввод, вывод) этих контактов.
Пожалуйста, проверьте это, если проблема не решится, поделитесь кодом
Можете ли вы объяснить, что вы имеете в виду в 1?, @Dodo
Также объясните, что вы подразумеваете под (3)., @Nick Gammon
Я думаю, это означает, что не используйте pinMode на контактах 0 или 1., @Dodo
Я думаю, перевод может быть: 1. Убедитесь, что вы подключаетесь к правильным контактам. 2. Обязательно используйте Serial.begin(baud). 3. Никогда не используйте pinMode() на контактах 0 и 1, если вы используете Serial., @Majenko
В таком случае: проверяй, проверяй и проверяй... Думаю., @Dodo
Я бы проверил, поддерживает ли используемая вами Arduino выбранную скорость передачи данных.
38000 — это нестандартная скорость, и вполне может быть, что аппаратное обеспечение не способно работать на ней с необходимой точностью. Программный последовательный порт (и большинство последовательных ключей USB) может использовать любую скорость передачи данных, но не ограниченную аппаратную часть большинства arduino.
- Как разделить входящую строку?
- Как вывести несколько переменных в строке?
- В чем разница между Serial.write и Serial.print? И когда они используются?
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Программы построения последовательных данных
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Очистить существующий массив при получении новой последовательной команды
Пожалуйста, опубликуйте свой код. Пожалуйста, дайте определение "не работает". Какое устройство вы подключили?, @Nick Gammon
@NickGammon Это интерфейс с CASIO fx-9750GII. Я могу получить байт запроса от калькулятора с помощью SoftwareSerial, но не с Serial. Если Arduino получает какие-либо данные, он издает звук., @Dodo
Что, если вы попробуете
SoftwareSerial serial(0,1);
?, @frarugi8738000 бит/с не является стандартной скоростью, и аппаратное обеспечение на одном или другом конце может не поддерживать ее, а программному обеспечению может быть все равно. Вы так и не сказали, что означает "не работает", но если это означает искажение символов, используйте стандартную скорость, например 38400 бит/с., @James Waldby - jwpat7
@ jwpat7 jwpat7 «Не работает» означает, что байт не получен. Внешнее устройство поддерживает только 38000 бит/с, и Arduino может использовать его через аппаратный последовательный порт (как было протестировано при подключении к компьютеру со скетчем обработки). Тот факт, что он одновременно подключен к компьютеру через порт USB, не кажется проблемой, потому что он демонстрирует такое же поведение при питании от зарядного устройства телефона (если зарядное устройство тоже чему-то мешает?)., @Dodo
@ frarugi87 Я не думаю, что
SoftwareSerial serial(0, 1);
тоже не работает., @DodoЧто вы подразумеваете под словом "думать"? Вы проверили это?, @frarugi87
@ frarugi87 Сейчас снова протестировано; нет успеха., @Dodo
Просто глупый вопрос, а вы пробовали поменять местами RX и TX? В любом случае, если SoftwareSerial на контактах 0,1 не работает, это аппаратная проблема..., @frarugi87
@ frarugi87 Да, я пробовал поменять местами — раз десять. Возможно, мой ESP8266 будет работать с
Serial
; Я попробую. Вы знаете, поддерживает ли он SoftwareSerial?, @DodoЯ так думаю.. Или, по крайней мере, может; если библиотеки полагаются на прерывания, вам придется их переписать., @frarugi87
Серийный работает на ESP8266;
SoftwareSerial
не компилируется (хотя я думаю, что он доступен как внешняя библиотека). Я тестировал это для проекта ESP8266, поэтому он будет работать. Я бы сказал, что это аппаратная проблема на UC., @Dodo