Аппаратный последовательный порт не работает, 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?

, 👍0

Обсуждение

Пожалуйста, опубликуйте свой код. Пожалуйста, дайте определение "не работает". Какое устройство вы подключили?, @Nick Gammon

@NickGammon Это интерфейс с CASIO fx-9750GII. Я могу получить байт запроса от калькулятора с помощью SoftwareSerial, но не с Serial. Если Arduino получает какие-либо данные, он издает звук., @Dodo

Что, если вы попробуете SoftwareSerial serial(0,1);?, @frarugi87

38000 бит/с не является стандартной скоростью, и аппаратное обеспечение на одном или другом конце может не поддерживать ее, а программному обеспечению может быть все равно. Вы так и не сказали, что означает "не работает", но если это означает искажение символов, используйте стандартную скорость, например 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


2 ответа


1

Причин может быть несколько

  1. Убедитесь, что контакт UC подключается к контактному разъему.
  2. В части установки вы пишете Serial.begin(xxxx);
  3. После запуска последовательного порта не изменяйте функции ввода-вывода (ввод, вывод) этих контактов.

Пожалуйста, проверьте это, если проблема не решится, поделитесь кодом

,

Можете ли вы объяснить, что вы имеете в виду в 1?, @Dodo

Также объясните, что вы подразумеваете под (3)., @Nick Gammon

Я думаю, это означает, что не используйте pinMode на контактах 0 или 1., @Dodo

Я думаю, перевод может быть: 1. Убедитесь, что вы подключаетесь к правильным контактам. 2. Обязательно используйте Serial.begin(baud). 3. Никогда не используйте pinMode() на контактах 0 и 1, если вы используете Serial., @Majenko

В таком случае: проверяй, проверяй и проверяй... Думаю., @Dodo


1

Я бы проверил, поддерживает ли используемая вами Arduino выбранную скорость передачи данных.

38000 — это нестандартная скорость, и вполне может быть, что аппаратное обеспечение не способно работать на ней с необходимой точностью. Программный последовательный порт (и большинство последовательных ключей USB) может использовать любую скорость передачи данных, но не ограниченную аппаратную часть большинства arduino.

,