Столкнулся с вот таким парадоксом:
Имею Bluetooth модуль HC-05 который цепляется и отправляет команды на Bluetooth relay.
Так вот, если отправлять команду через Serial.read() , то все работает как надо.
А вот отправляю программно
char* str="A0............B0..............c0........D0............e0";
BTSerial.write(str);
, реле команду принимает, но не реагирует.
Помогите пожалуйста.
Программу предоставьте. А то мы будем говорить о разном.
Вот так если через порт ввести строку A0............B0..............c0........D............e0 - все работает.
#include <SoftwareSerial.h> SoftwareSerial BTSerial(52, 53); void setup(){ Serial.begin(38400); BTSerial.begin(38400); // HC-05 default speed in AT command more } void loop(){ if (BTSerial.available()) Serial.write(BTSerial.read()); if (Serial.available()) BTSerial.write(Serial.read()); }#include <SoftwareSerial.h> SoftwareSerial BTSerial(52, 53); String str; void setup(){ Serial.begin(38400); BTSerial.begin(38400); str="A0............B0..............c0........D............e0"; } void loop(){ BTSerial.print(str); delay(2000); }А вы уверены, что результат работы write(char*) и print(String&) одинаковы?
А если вывести str на компорт, то чего там будет? После 10 строки вставьте Serial.print(str), хотя тоже не вариант. Принт может добавлять спецсимволы в начале и конце строки. Передавайте посимвольно.
так тоже не работает (
#include <SoftwareSerial.h> SoftwareSerial BTSerial(52, 53); // 9 подключаем к RX | 8 подключаем к TX char* str; void setup(){ Serial.begin(38400); BTSerial.begin(38400); // HC-05 default speed in AT command more str="A0............B0..............c0........D............e0"; } void loop(){ BTSerial.write(str); delay(2000); }А что за библиотека для BT? Приведите заголовок метода write. Или нет библиотеки и это просто Serial? Если так, то wirte используется неверно.
так тоже не работает (
#include <SoftwareSerial.h> SoftwareSerial BTSerial(52, 53); // 9 подключаем к RX | 8 подключаем к TX char* str; void setup(){ Serial.begin(38400); BTSerial.begin(38400); // HC-05 default speed in AT command more str="A0............B0..............c0........D............e0"; } void loop(){ BTSerial.write(str); delay(2000); }Ну, так бы сразу.
В таком виде она у Вас только 1 байт отправляет. Добавьте длину строки
Заработало! Но, не так как ожидалось: вместо того чтобы включить 5шт реле включает только последние. Куда то деваются данные.
Разбирайтесь. Печатайте отладочную информацию, смотрите.
Интересно даже куда ж это данные то деваются...
Сарказм.
Длина буфера порта по умолчанию вроде 64 байта.
А вы туда пытаетесь впихнуть невпихуемое.
В String один символ занимает 2байта.
Сначала пишите куда нибудь. Потом уже отсылайте
Бред какой.
Действительно! Решилось путем дробления на пакеты. Еще оказалось важным чтобы скорость порта и устройства были идентичны (для меня это было открытием).
Рабочий скрипт получился таким:
//// Управление блютуз-реле. Первым делом нужно спарить блютуз-релеблютуз-реле и НС-05. Это делается через АТ команды, в гуглах про это много и понятно написано. //// Этот скрипт включает и выключает реле передавая на него команды через блютуз. #include <SoftwareSerial.h> SoftwareSerial BTSerial(52, 53); // 9 подключаем к RX | 8 подключаем к TX int i; char bt[20]; String str; void setup(){ Serial.begin(38400); BTSerial.begin(38400); // HC-05 default speed in AT command more ///!!! Важно (скорость Serial == скорость BTSerial) } void loop(){ ///bt - массив полученый опытным путем. А0 - включить первый реле. А3 - выключить. Обратите внимание (f != F) и F0 не сработает. bt[0] = 'A'; bt[1] = 'B'; bt[2] = 'c'; bt[3] = 'D'; bt[4] = 'e'; bt[5] = 'f'; bt[6] = 'G'; bt[7] = 'M'; bt[8] = 'N'; bt[9] = 'o'; bt[10] = 'P';bt[11] = 'l';bt[13] = 'H'; bt[14] = 'i'; bt[15] = 'j'; bt[12] = 'K'; str=""; for (i=0; i<10; i++){ if (bt[i]){ str+=bt[i]; // str+="077.......";} if(i==2 or i==5 or i==11 or i==8 or i==14) { Serial.println(str); BTSerial.println(str); str=""; } } Serial.println(str); BTSerial.println(str); delay(5000); str=""; for (i=0; i<16; i++){ str+=bt[i]; str+="377......."; if(i==2 or i==5 or i==11 or i==8 or i==14) { Serial.println(str); BTSerial.println(str); str=""; } } Serial.println(str); BTSerial.println(str); delay(4000); // if (BTSerial.available()) // Serial.write(BTSerial.read()); // if (Serial.available()) // BTSerial.write(Serial.read()); }А что за капризный реле с таким странным управлением точечками в команде?