Особенности скорости у модуля bluetooth HC-06

Тема в разделе "Проводная и беспроводная связь", создана пользователем Витя, 13 май 2014.

  1. Витя

    Витя Гик

    Есть вот такой модуль https://amperka.ru/product/hc-06-bluetooth-module

    Есть код который посылает на ардуино данные. Каждые 0.02 секунды по 99 байт. Т.е. в секунду 4950 байт. Если задать скорость в 57600 бод, то это получается по 7200 байт в секунду можно принимать. Если соединение через USB - то все принимается хорошо. Но если сделать соединение через блютуз HC-06 на той же скорости в 57600, то начинаются странности. Данные ошушение что принимаются раз в полсекунды примерно. Причем они еще и где то буферизируются круто так потому что если слать много то они прийдут через несколько секунд.

    Подскажите куда копать чтобы данные принимались нормально? В чем загвоздка?
     
  2. acos

    acos Официальный гик Администратор

    Наверное копать в сторону Serial.flush() для начала, если не поможет - копать дальше
     
  3. Витя

    Витя Гик

    На всякий случай после каждого write() вызывал fsync() но ничего не изменилось. Не знаю куда теперь копать :(

    В чем вобше может быть проблема. Если задали скорость 57600 значит столько же и должно приходить по идее? А почему приходит в разы меньше? :( И где копится то что не приходит? Где то в недрах ОС или в самом модуле может?
     
  4. acos

    acos Официальный гик Администратор

    у вас как всё подключено? HC06 на ардуине, а bluetooth-мастер где? в ноуте?
    Ну и скетч киньте на всякий случай
     
  5. Витя

    Витя Гик

    Да, HC-06 подключен к ардуине к пинам 0-1 (хардварный serial). Мастер не в ноутбуке, а в компьютере iMac 3,5 GHz Intel Core i7 Bluetooth Broadcom 20702B0.

    Вот короче подключаю по USB - все отлично. Не меняя код в ардуине подключаю блютуз и подключаюсь теперь к блютуз с компа. Теперь данные идут медленно причем где-то копятся потому что через несколько секунд но дойдут. В коде особо ничего необычного в этом плане нет. Код условно такой:
    1. Программа на компьютере очень большая. Но основной код такой. Открытие девайса:
    Код (Text):

    - (void)applicationDidFinishLaunching:(NSNotification *)aNotification
    {
        _device = [DeviceController sharedDevice];

        if (![_device openPort:"/dev/cu.Light-DevB"]) // блютуз
    //    if (![_device openPort:"/dev/cu.usbmodem1451"]) // usb
      { ... }
      ...
    }


    // DeviceController
    - (BOOL)openPort:(char *)bsdPath
    {
        speed_t baudRate = B57600;
        _serialFileDescriptor = open(bsdPath, O_RDWR | O_NOCTTY | O_NONBLOCK);

        if (_serialFileDescriptor == -1) {
            NSLog(@"Can't open device (%@)", [NSString stringWithUTF8String:bsdPath]);
            return NO;
        }
        ioctl(_serialFileDescriptor, TIOCEXCL);
        fcntl(_serialFileDescriptor, F_SETFL, 0);
        ioctl(_serialFileDescriptor, IOSSIOSPEED, &baudRate);
        return YES;
    }
     
    и в общем там смысл что на ардуину посылается набор цветов которые потом загораются на световой ленте:
    Код (Text):

    // просто посылка массива RGB значений цветов каждые 0.2 секунды
    write(*serial, *dataM.a, LEDS_COUNT * 3);
     
    В ардуине это все по сути зациклено примерно так:
    Код (Text):

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

    void loop() {
      Serial.readBytes((char *)pixels, PIXELS_COUNT * 3);
      pix(pixels, PIXELS_COUNT); // Тут зажигается лента теми данными что пришли
    }
     
    В общем в коде ничего такого нет особого только посылка данных и прием данных. Втыкаю усб - работает. Иду через блютуз - все медленно. Код главное один и тот же. Скорость одна и тажа.
     
  6. de_guta

    de_guta Нуб

    всем привет, вопрос в тему, купил я этот HC-06. Передаю данные на COM через блютуз, с обратной стороны читаю данные с COM порта через адаптер USB-COM ( терминал PUTY, так же запустил PortMon). В общем отправляешь один байт , принимаешь почему-то совсем другой.
    Отправляю(символ в Putty) Принимаю байт (Hex, в PortMon)
    1- 67h
    2- 33h
    3- 66h
    4- 19h
    5- 65h
    6 - 32h
    в общем закономерность прослеживается.
    Соответственно ни на какие команды HC-06 не отвечает вообще
    Скорость 9600
    Пробовал разную скорость обмена, но более менее адекватно отвечает только на 9600
     
  7. shpock

    shpock Гик

    если вопрос еще актуален ...
    Думаю проблемка в уровне логики. Вы подключаете HC-06 c 3х вольтовой транзисторной логикой к ком порту. Хорошо что порт ваш на юсб переходнике. Реальный компорт, скорее всего выпалил и НС-06 и сам бы сгорел. Микросхемка st3232 или подобная, в помощь, думаю самое то.
     
  8. de_guta

    de_guta Нуб

    Спасибо за ответ. Да вопрос актуален до сих пор , т.к накупил этих HC-06 и как только не изголялся нефига не выходит. На реальный порт я тоже подключал, ничего не сгорело, происходит та же история. Посылаем одно, принимаем другое. Питание на HC-06 сделал с отдельного USB, там по схеме 5В, 3В должно быть что ли?
     
  9. shpock

    shpock Гик

    Питание можно и 5. Дело в самом сигнале. Ком порт отправляет\принимает 0 и 1 при помощи -15 и +15 вольт. НС-06 понимает 3х вольтовую транзисторную логику. Тоисть сигналы должны быть где-то в приделах 3х вольт. Подключать напрямую к ком порту НЕправильно.
    Если есть ардуино, можно подключить без проблем. Если нет то использовать st3232 с обвязкой.

    (Можно rx и tx на HC-06 замкнуть, подать питание, подключится через блютуз, послать в порт чего нить, должно вернутся.)
     
  10. de_guta

    de_guta Нуб

    Теперь понятно, спасибо за объяснения. А как st3232 правильно подключить к HC-06
     
  11. shpock

    shpock Гик

    3232-hco6.jpg

    практически не проверял, я HC-06 использую с ардуино. Но думаю вот так работать должно. Сдесь на max3232. st3232 тоже пойдет, но их там куча модификаций, по последней букве, я не копался.
     
  12. de_guta

    de_guta Нуб

    практически не проверял, я HC-06 использую с ардуино. Но думаю вот так работать должно. Сдесь на max3232. st3232 тоже пойдет, но их там куча модификаций, по последней букве, я не копался.[/quote]

    Ладно, спасибо, буду пробовать