Как передать строку по bluetooth?

Arny
Offline
Зарегистрирован: 21.02.2020

Всем привет!

Столкнулся с вот таким парадоксом:
Имею Bluetooth модуль HC-05 который цепляется и отправляет команды на Bluetooth relay.
Так вот, если отправлять команду через Serial.read() , то все работает как надо. 
А вот отправляю программно 
char* str="A0............B0..............c0........D0............e0";
BTSerial.write(str);
, реле команду принимает, но не реагирует. 
Помогите пожалуйста.

 

 

 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Программу предоставьте. А то мы будем говорить о разном.

Arny
Offline
Зарегистрирован: 21.02.2020

Вот так если через порт ввести строку 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);
}

 

 

sadman41
Offline
Зарегистрирован: 19.10.2016

А вы уверены, что результат работы write(char*) и print(String&) одинаковы?

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

А если вывести str на компорт, то чего там будет? После 10 строки вставьте Serial.print(str), хотя тоже не вариант. Принт может добавлять спецсимволы в начале и конце строки. Передавайте посимвольно.

Arny
Offline
Зарегистрирован: 21.02.2020

так тоже не работает (
 

#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);
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А что за библиотека для BT? Приведите заголовок метода write. Или нет библиотеки и это просто Serial? Если так, то wirte используется неверно.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Arny пишет:

так тоже не работает (
 

#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 байт отправляет. Добавьте длину строки

BTSerial.write(str, strlen(str));
Arny
Offline
Зарегистрирован: 21.02.2020

Заработало! Но, не так как ожидалось: вместо того чтобы включить 5шт реле включает только последние. Куда то деваются данные.

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Разбирайтесь. Печатайте отладочную информацию, смотрите.

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Интересно даже куда ж это данные то деваются...
Сарказм.
Длина буфера порта по умолчанию вроде 64 байта.
А вы туда пытаетесь впихнуть невпихуемое.
В String один символ занимает 2байта.
Сначала пишите куда нибудь. Потом уже отсылайте

rkit
Offline
Зарегистрирован: 23.11.2016

Kakmyc пишет:
Длина буфера порта по умолчанию вроде 64 байта. А вы туда пытаетесь впихнуть невпихуемое. В String один символ занимает 2байта.

Бред какой.

Arny
Offline
Зарегистрирован: 21.02.2020

Действительно! Решилось путем дробления на пакеты. Еще оказалось важным чтобы скорость порта и устройства были идентичны (для меня это было открытием).

Рабочий скрипт получился таким:

//// Управление блютуз-реле. Первым делом нужно спарить блютуз-релеблютуз-реле и НС-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()); 
}

 

sadman41
Offline
Зарегистрирован: 19.10.2016

А что за капризный реле с таким странным управлением точечками в команде?