Почему SoftwareSerial не работает как надо на Arduino Pro Mini 3v3?

Я загрузил обычный сквозной код для Serial и SoftwareSerial для связи с моим модулем на основе AT-команд.

Кажется, запись в SoftwareSerial работает, а чтение нет. Когда я пишу «AT», модуль возвращает мне «-5», что должно быть «ОК».

Когда я пишу "asdad", модуль возвращает что-то похожее на "недопустимый синтаксис", но очень беспорядочно.

#include <SoftwareSerial.h>
SoftwareSerial ss(rx, tx);

void setup() {
  Serial.begin(9600);
  ss.begin(9600);
}

void loop() {
  while (Serial.available()) ss.write(Serial.read());
  while (ss.available()) Serial.write(ss.read());
}

, 👍0

Обсуждение

эскиз в порядке. что-то еще не так. у вас в Serial Monitor установлено значение 9600 бод? и обе строки заканчиваются? проводка хорошая?, @Juraj

Какие контакты вы используете для «tx» и «rx»?, @jose can u c

@ALK, я думаю, мы все здесь делаем предположения. Пожалуйста, проясните некоторые вещи, ответив, является ли это Arduino, который отправляет «AT», или это Arduino, который получает «AT» и отправляет обратно неправильные символы., @st2000


2 ответа


Лучший ответ:

0

С SoftwareSerial 9600 бод — это максимальная скорость, с которой вы можете надежно работать при использовании Arduino 5V 16MHz. Вы используете 8 МГц при напряжении 3,3 В, поэтому можно ожидать, что ограничение скорости будет уменьшено вдвое.

Не используйте SoftwareSerial. Всегда. Полная остановка. Нет призыва когда-либо использовать его. Если на вашей плате недостаточно реальных портов UART, значит, вы используете не ту плату. Не используйте плату только потому, что ею пользуются все. Посмотрите, что вы хотите сделать, а затем выберите подходящую плату, которая соответствует вашим потребностям. Доступно множество плат на 3,3 В с несколькими (или даже одним запасным) UART — например, Fubarino Mini, Teensy 3.x, любое количество плат на основе ESP32 — все с размером, аналогичным Pro Mini, и с гораздо больше энергии для загрузки.

,

Спасибо. Можете ли вы порекомендовать мне какую-нибудь плату, такую как pro mini 3v3, но с большим количеством последовательных портов, включая спящий режим с пробуждением от внешнего прерывания и пробуждением по времени., @A. L. K.

Платы Teensy, вероятно, поддерживаются лучше всего., @Majenko


0

Вы можете получить лучшие результаты, если не вложите вызовы функций чтения и записи, как раньше. То есть все читай потом все пиши.

Причина этого в том, что softwareserial.read() возвращает 1 символ. Если вы немедленно развернетесь и передадите этот символ в softwareserial.write(), вы потратите ресурсы процессора на отправку этого символа. В то же время, если в процессор будет отправлен другой символ, процессор не увидит его или увидит только его часть.

Тем не менее, вы, скорее всего, получите лучшие результаты, если будете использовать более совершенный встроенный процессор с выделенным аппаратным последовательным портом для каждого порта, который требуется вашему проекту. Например, Mega 2560 на Arduino Mega.

Переход от дешевого процессора к процессору с достаточным аппаратным обеспечением — правильное решение. Поскольку с другим аппаратным последовательным портом процессор нужен только для чтения & написать символ в & с аппаратного обеспечения, используя одну команду для каждой из этих операций, не тратя время на чтение & ожидание каждого бита символа. Аппаратный последовательный порт или UART могут сократить усилия по приему и передаче данных. отправка символа процессором более чем на порядок.

,

с прошивкой AT вы отправляете команду, а затем получаете ответ. так что "пока" в порядке. остальная часть ответа не имеет отношения к вопросу, @Juraj

@Juraj, я улучшил свой ответ, объяснив, почему последовательный порт, реализованный в программном обеспечении, с трудом работает быстро. Я также объяснил, почему HW UART лучше подходит для более быстрой связи., @st2000