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

Рамиль
Участник
Зарегистрирован: 2020-04-03
Сообщений: 6

Передача сигналов по 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
Сообщений: 736

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

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

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

Рамиль
Участник
Зарегистрирован: 2020-04-03
Сообщений: 6

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

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

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

vvr
Участник
Зарегистрирован: 2015-04-12
Сообщений: 649

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

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

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

renoshnik
Участник
Зарегистрирован: 2017-04-03
Сообщений: 736

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

Рамиль пишет:

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

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

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

Рамиль
Участник
Зарегистрирован: 2020-04-03
Сообщений: 6

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
Сообщений: 38

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
Сообщений: 736

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

Рамиль пишет:

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

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

Быстрое сообщение

Введите сообщение и нажмите Отправить

Подвал раздела