#1 2020-06-12 14:29:54

Рамиль
Учасник
Зареєстрований: 2020-04-03
Повідомлень: 10

Передача сигналов по Bluetooth

Привет!

Сделал одну модель с дистанционным управлением по bluetooth с помощью hc-06. Управляется с помощью специального приложения с компьютера. Например, приложение отправляет сигнал A или B, и скеч обрабатывает его так:

    switch (control) {
      case 'A': functionA();  break; 
      case 'B': functionB();  break; 
    }

Подскажите, как сделать, чтобы скеч корректно обрабатывал отправку двух или более символов. Например, "A1" и "B2". И скеч обрабатывает:

    switch (control) {
      case "A1": functionA();  break; 
      case "B2": functionB();  break; 
    }

Последний код, конечно же, не работает как нужно. Как сделать правильно?

Остання редакція Рамиль (2020-06-12 14:30:56)

Неактивний

#2 2020-06-12 16:09:11

renoshnik
Учасник
Зареєстрований: 2017-04-03
Повідомлень: 1,025

Re: Передача сигналов по Bluetooth

Делайте правильное чтение данных из порта.

Неактивний

#3 2020-06-12 21:15:47

Рамиль
Учасник
Зареєстрований: 2020-04-03
Повідомлень: 10

Re: Передача сигналов по Bluetooth

Так вот я и спрашиваю - как правильно?

Неактивний

#4 2020-06-13 06:54:15

vvr
Учасник
Зареєстрований: 2015-04-12
Повідомлень: 874

Re: Передача сигналов по Bluetooth

вы пока не показали как вы делаете....

Неактивний

#5 2020-06-13 11:41:49

renoshnik
Учасник
Зареєстрований: 2017-04-03
Повідомлень: 1,025

Re: Передача сигналов по Bluetooth

Рамиль пише:

Так вот я и спрашиваю - как правильно?

правильно это не так как вы делаете, а как вы делаете я не знаю.
но судя по результату вы делаете неправильно.

Неактивний

#6 2020-06-13 15:00:04

Рамиль
Учасник
Зареєстрований: 2020-04-03
Повідомлень: 10

Re: Передача сигналов по Bluetooth

Я вот так получаю данные от компа:

char control;   

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

void loop()
{
if (Serial.available() > 0) {
    control = Serial.read();
    switch (control) {
     {
      case "A1": functionA();  break; 
      case "B2": functionB();  break;  
      ...
    }
    }
  }

Неактивний

#7 2020-06-13 16:41:06

Mishka
Учасник
Зареєстрований: 2019-11-18
Повідомлень: 93

Re: Передача сигналов по Bluetooth

Разве компилятор не выдает ошибку для case "A1"? Как оно вообще собирается?

Оператор case ожидает целочисленное значение. Это неплохо работает со следующей конструкцией, потому что 'А' фактически является числом 65 и C может свободно привести char к int, обратите внимание на одинарные кавычки.

switch (command) {
case 'A':
    functionA();
    break;
...
}

Но строки типа "A1" являются регионами памяти и запись case "A1" будет синтаксически неверной.

Касательно сути вопроса. Serial.read() возвращает всего один (первый) байт из буфера, поэтому чтобы обрабатывать больше, нужно либо сохранять прочитанные байты между вызовами loop(), либо читать весь буфер Serial в контексте одного вызова loop(). Также возникает вопрос, что произойдет, если передать две команды "А1" и "B2" подряд? Подозреваю - поправьте меня, пожалуйста, если это не так - что они будут прочитаны как одна команда "A1B2". А если два устройства будут заполнять буфер Serial одновременно, не возникнет ситуация, когда результат окажется чем-то вроде "AB12"?

В этом смысле может оказаться, что намного прагматичнее использовать однобайтовые команды: и быстрее передаются, и проще код, и меньше неоднозначностей.

Остання редакція Mishka (2020-06-13 16:42:09)

Неактивний

#8 2020-06-13 18:05:41

renoshnik
Учасник
Зареєстрований: 2017-04-03
Повідомлень: 1,025

Re: Передача сигналов по Bluetooth

Рамиль пише:

Я вот так получаю данные от компа:

Читайте еще раз http://arduino.ru/Reference/Serial/Read

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму