Скорость передачи для стабильной последовательной связи Bluetooth - PullRequest
0 голосов
/ 31 января 2012

У меня есть мега arduino, связывающаяся по Bluetooth (устройство bluesmirf gold) с приложением C #, которое я написала.Arduino постоянно посылает последовательный сигнал из 32 символов, первый из которых всегда «S», а последний «E».Используя шпаклевку, я могу подтвердить, что этот сигнал отправляется правильно в 99% случаев.

Теперь я хочу прочитать этот сигнал с помощью моего приложения на C #, которое я делаю со следующим кодом:

    public string receiveCommandHC()
    {

        string messageHC = "";
        if (serialHC.IsOpen)
        {

            while (serialHC.ReadChar() != 'S')
            {

            }
            messageHC = serialHC.ReadTo("E");
            serialHC.DiscardInBuffer();
        }
        return messageHC;

    }

serialHC относится к последовательному классу.

Иногда это работает отлично, но иногда у меня возникают проблемы, я не могу понять, почему иногда это работает, а другие нет.

Проблемамне кажется, что иногда я получаю довольно большое отставание в данных, которые я читаю с arduino.Я замечаю это, потому что я отправляю состояния кнопок, и они меняются только через несколько секунд после того, как я фактически нажимаю или отпускаю кнопку на Aurduino.Я использовал стандартную скорость передачи данных устройства Bluetooth, которая составляет 115200, и мне было интересно, может ли изменение этого значения на гораздо более низкое значение дать лучшие результаты?Что, если какое-то преимущество будет иметь это?Мне не нужны высокие скорости связи, даже обновление состояния 4-5 раз в секунду было бы приемлемым для моего приложения.

Возможно ли, что задержка идет из моего кода?Я думаю, что это может быть из цикла while, который ожидает входящего "S", но тогда я не понимаю, почему он должен зависать там, поскольку есть новые сигналы, всегда поступающие с высокой скоростью.

Я используюDiscardInBuffer (), потому что я не забочусь об устаревших данных и просто хочу пропустить это.Гораздо важнее, что я читаю текущие данные и работаю с этими свежими данными.

Спасибо за вашу помощь!

С уважением,

Бендер

Обновление:

Только что узнал немного больше информации при отладке.Кажется, что проблема появляется только:

  1. При подключении по Bluetooth (по USB-кабелю нет никаких задержек)
  2. Когда установлено второе соединение Bluetooth от ПК к другому устройству (другой COM-порт и разная скорость передачи данных в бодах)

У кого-нибудь есть какие-либо ошибки в работе двух разных устройств от одного и того же ключа Bluetooth на ПК?Я могу подключиться к обоим без проблем, но все еще с проблемой задержки, упомянутой ранее.

Спасибо за любую помощь

1 Ответ

3 голосов
/ 02 февраля 2012

Вы не действительно используете физический последовательный порт здесь.Драйвер BlueTooth просто эмулирует один.Это часто встречается, Windows API имеет четко определенный набор функций API для связи с последовательным портом.Эмуляция упрощает интерфейс драйвера, поставщику не нужно предоставлять DLL интерфейса или документировать сложный протокол DeviceIoControl ().

Это означает, что фактические параметры связи не имеют значения,Скорость передачи данных в этом сценарии не имеет смысла, именно радиосигнализация BlueTooth устанавливает скорость передачи.Водитель примет все, что вы выберете, но в противном случае проигнорирует это.Сигналы рукопожатия могут интерпретироваться , их выполнение зависит от драйвера.Отчеты об ошибках связи реализуются очень редко, в отличие от реального последовательного порта, BlueTooth имеет протокол исправления ошибок.

Нет, потеря данных здесь полностью вызвана самим собой.Очевидно, что драйвер реализует DiscardInBuffer ().Что ничего не дает, кроме как выбрасывать любые данные, полученные драйвером.Это может пойти не так, если ваш код выполняется с небольшим опозданием или прерывается переключением контекста потока.

Удалите вызов DiscardInBuffer ().

...