Скорость передачи для стабильной последовательной связи Bluetooth

У меня есть мега-ардуино, связывающееся через 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-порт и другая скорость передачи данных)

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

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

1 ответ

Решение

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

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

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

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

Другие вопросы по тегам