Доброго времени суток. Подключаю ZS-040 к Arduino Uno по след. схеме: vcc -> +5V, GND -> GND, D8 -> TX, D9 -> RX. Код (C++): #include <SoftwareSerial.h> SoftwareSerial BTserial(8, 9); // RX | TX const long baudRate = 38400; char c=' '; boolean NL = true; void setup() { Serial.begin(9600); Serial.print("Sketch: "); Serial.println(__FILE__); Serial.print("Uploaded: "); Serial.println(__DATE__); Serial.println(" "); BTserial.begin(baudRate); Serial.print("BTserial started at "); Serial.println(baudRate); Serial.println(" "); } void loop() { if (BTserial.available()) { c = BTserial.read(); Serial.write(c); } if (Serial.available()) { c = Serial.read(); BTserial.write(c); if (NL) { Serial.print(">"); NL = false; } Serial.write(c); if (c==10) { NL = true; } } } После открываю "Монитор порта", ввожу, к примеру, команды "AT", "AT+VERSION", но в ответ ничего не получаю. В чем может быть проблема?
Тут и тут пишут, что можно. Но в целом, весь код это ктрл+ц и ктрл+в. Почему нельзя гуглить, вот чему можно удивляться. Ещё и схемотехника сомнительна
Те, кто реально использует, пишут, что 38400 это предел, при том без гарантии стабильности. Где то и 9600 называют пределом. Я стараюсь выше 19200 софтовый сериал не юзать.
Тут все очень зависит от того, чем вообще занимается процессор помимо софтериала. Есть ли запрещения прерываний и т.п. Я, кода делал диммер на AtTiny85 заметил, что на 38400 диммер работает стабильно, а на 9600 иногда замечал подрагивания света лампы накаливания в момент передачи от AtTiny85 по софтериал. А связано это с запрещением прерываний в библиотеке софтериала, в момент передачи байта, и чем скорость выше, тем короче время запрета прерываний.
Может подрагивание происходило потому что команда принималась дольше? При скорости 38400 глаз просто не успевал заметить этот момент, особенно с инертной лампой накаливания. В случае сабжа я бы подключил блютуз к хардовому сериалу и параллельно смотрел что происходит через терминал. И скорость можно менять прямо на мониторе, удобно. Но для этого надо переписать программу (подсказка: залить пустую).
Я проверял, что влияет на мерцание, снижая скорость до 1200, и поднимая до 38400, и убирая ответ с AtTiny85, и добавляя промежуточный вывод (передачу от AtTiny85) Если оставлять только прием - мерцаний не было. Соответственно стал смотреть на передачу в библиотеке - нашел запрет прерываний. Хотел убрать запрет прерываний в библиотеке, но понял, что не нужно, так как вывод с тиньки, у меня был только для отладки.
Я делал софт сериал для тинек "вручную", особо актуально для 2313 и прочих где памяти мало. Работает без прерываний, крутить надо в случае когда ожидается передача или прием, но зато очень миниатюрно. По приезду могу поделиться.
Спасибо! Интересно, посмотреть. Это вечная дилемма, или кроссплатформенность или оптимальность… По хорошему, нужно написать софтсериал в виде автомата, с привязкой к таймеру, под конкретный случай. Тогда все будет работать прекрасно, и не будут тормозить другие задачи... Потом использовать, если нужно, но это будет не библиотека.