Serial.write и HC-06

evgesh

✩✩✩✩✩✩✩
1 Апр 2022
15
0
На BT через serial.write приходят символы ascii вместо значений.

Если отправить массив из одного числа:
C++:
byte buf[] = {1, 2, 3, 4};
mySerial.write((byte*)&buf, sizeof(buf));
То всё доходит отлично.

Но если из двух:
C++:
byte buf[] = {10, 20, 30, 40};
mySerial.write((byte*)&buf, sizeof(buf));
То приходят символы [14][1E](

Отправка данных из этого урока так же приводит к символам.

Можно использовать строку, но не могу найти как из массива получить строку с разделителями.
 

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
Можно использовать строку, но не могу найти как из массива получить строку с разделителями.
Можно объявить строку.
String S; S.reserve(256);
Потом влупить цикл и перебирать весь буфер и формировать строку через
{
S+=buf;
S+="Разделитель";
}
 

bort707

★★★★★★✩
21 Сен 2020
3,088
917
Если отправить массив из одного числа:
Но если из двух
вы что там курите? У вас в обоих случаях массив из 4х байт. Вы где там одно или два числа разглядели?
Что касается основного вопроса - если вы отправляете байты, а принимаете символы, то надо смотреть код приемника
 

bort707

★★★★★★✩
21 Сен 2020
3,088
917
То приходят символы [14][1E](
это не символы, а байты. 0x14 это 20, а 0x1e - 30 - второй и третий значения вашего массива.
Вывод - у вас все принимается без ошибок и никаких преобразований строк вам не надо. Потратьте лучше время на свое образование, чтоб не задавать таких вопросов
 

evgesh

✩✩✩✩✩✩✩
1 Апр 2022
15
0
это не символы, а байты. 0x14 это 20, а 0x1e - 30 - второй и третий значения вашего массива.
Ааа! Спасибо! А как мне отправить массив данных? Отправка структуры отсюда приводит к следующему:
C++:
>Ор0[00]0[00]80ш[0E][00][06][00]`ѓО0рю0Аю

Потратьте лучше время на свое образование, чтоб не задавать таких вопросов
Прошу прощения, но форум и существует для того, что бы объяснять таким как я.

@evgesh, скорость порта какую ставите? На AT-команды как реагирует?
Здесь пишут, что пин KEY на плате не разведен, поэтому на AT не реагирует.
 

bort707

★★★★★★✩
21 Сен 2020
3,088
917
Отправка структуры отсюда приводит к следующему:
Покажите свой код.
Вы уже сейчас отправляете массив, причем отправляете его правильно.
Теперь покажите ваш код, как вы этот массив принимаете
 
Изменено:

evgesh

✩✩✩✩✩✩✩
1 Апр 2022
15
0
@bort707, массив принимает BT терминал на windows или смартфоне.

Если отправить так:
C++:
char stroka[] = "Stroka";
mySerial.write(stroka);
На терминал все приходит правильно.

Если из терминала отправить на arduino, то так же до монитора порта все доходит корректно
C++:
#include <SoftwareSerial.h>
SoftwareSerial btSerial(10, 11);

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

int data[5];

void loop() {

  if (btSerial.available() ) {
    char str[30];
    int amount = btSerial.readBytesUntil(';', str, 30);
    str[amount] = NULL;

    int count = 0;
    char* offset = str;

    while (true) {
      data[count++] = atoi(offset);
      offset = strchr(offset, ',');
      if (offset) offset++;
      else break;
    }
    for (int i = 0; i < count; i++) Serial.println(data[i]);
  }
}
Screenshot_1.png
 

bort707

★★★★★★✩
21 Сен 2020
3,088
917
я вас просил показать, как у вас массив не принимается, поскольку вы жаловались именно на это.
А если желаете использовать костыли через строки - я вам мешать не буду.
До свиданья
 

evgesh

✩✩✩✩✩✩✩
1 Апр 2022
15
0
@bort707, я не понимаю какой код показать. Все данные принимает BT терминал. Строки и массивы ({1, 2, 3, 4}) доходят корректно, а массивы типа {10, 20, 30, 40} как вы сказали приходят в виде байтов.
 

bort707

★★★★★★✩
21 Сен 2020
3,088
917
Строки и массивы ({1, 2, 3, 4}) доходят корректно, а массивы типа {10, 20, 30, 40} как вы сказали приходят в виде байтов.
корректно - это по вашему как?! Байты это не корректно? :)
И первый ваш массив и второй приходят одинаково - в виде байтов. Между значением 20 и 0x14 нет никакой разницы.
Открою вам страшную тайну - в компьютерах все передается в виде байтов...
Вы бы какую-нить книжку почитали. что ли...
 

evgesh

✩✩✩✩✩✩✩
1 Апр 2022
15
0
корректно - это по вашему как?!
Вот отправил я массив {100, 200, 300, 400} и получил его же в том же виде. Каким образом это можно реализовать на примере с терминалом?

Открою вам страшную тайну - в компьютерах все передается в виде байтов...
К счастью я это знаю, но строка же приходит не в виде байтов
 

bort707

★★★★★★✩
21 Сен 2020
3,088
917
Все данные принимает BT терминал.
Кстати
посмотрите настройки в своем терминале, скорее всего он показывает принятые значения в формате HEX. Шестнадцатиричные числа (HEX) от 0 до 9 совпадают с десятичными, а дальше начинаются различия. Терминал вам все показывает в HEX, но числа до 9 вы узнаете и они вам кажутся "нормальными", а когда вам вместо 10 пишут 0xA - вы теряетесь...
 

bort707

★★★★★★✩
21 Сен 2020
3,088
917
К счастью я это знаю, но строка же приходит не в виде байтов
вы даже не замечаете, как первая часть фразы противоречит второй. Строка тоже приходит в виде байт, только показывается вам в виде символов.
Все что есть в компьютере - файлы, картинки, видео - это байты.

Вот отправил я массив {100, 200, 300, 400} и получил его же в том же виде. Каким образом это можно реализовать на примере с терминалом?
Между отправкой числа 200 и 300, на самом деле, огромная разница. 200 помещается в байт, а 300 уже нет. Тогда надо весь массив уже описывать как тип int - а это вы явно принять не сумеете, судя по вопросам
 

evgesh

✩✩✩✩✩✩✩
1 Апр 2022
15
0
посмотрите настройки в своем терминале, скорее всего он показывает принятые значения в формате HEX
Да, вы правы, он в HEX отображает. У ASCII при отправке массива типа byte крякозябры.
p.jpgp2.jpg

Тогда надо весь массив уже описывать как тип int - а это вы явно принять не сумеете, судя по вопросам
А какой смысл byte buf менять на int buf при условии, что значения двухзначные?
 

evgesh

✩✩✩✩✩✩✩
1 Апр 2022
15
0
@bort707,если массив {10, 20, 30, 40}, то логичнее использоваться byte, а для {100, 200, 300, 400} - int
 

bort707

★★★★★★✩
21 Сен 2020
3,088
917
@evgesh,
правильно
Только во-втором случае слово "логичнее" не совсем верно. Для чисел более 255 байт использовать просто нельзя