Скорость передачи для стабильной последовательной связи 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(), потому что я не забочусь об устаревших данных и просто хочу пропустить это. Гораздо важнее, что я читаю текущие данные и действую на основе этих свежих данных.
Спасибо за помощь!
С наилучшими пожеланиями,
клещи
Обновить:
Просто узнал немного больше информации при отладке. Проблема только кажется, появляется:
- При подключении через Bluetooth (через USB-кабель нет абсолютно никакой задержки)
- Когда второе соединение Bluetooth установлено с ПК на другое устройство (другой COM-порт и другая скорость передачи данных)
У кого-нибудь есть erxperiances для запуска двух разных устройств от одного и того же ключа Bluetooth на ПК? Я могу соединиться с обоими без проблем, но все еще с проблемой задержки, упомянутой ранее.
Спасибо за любую помощь
1 ответ
Вы на самом деле не используете физический последовательный порт здесь. Драйвер BlueTooth просто имитирует. Это часто встречается, Windows API имеет четко определенный набор функций API для связи с последовательным портом. Эмуляция упрощает интерфейс драйвера, поставщику не нужно предоставлять DLL интерфейса или документировать сложный протокол DeviceIoControl().
Это означает, что фактические параметры связи не имеют значения. Скорость передачи данных в этом сценарии не имеет смысла, именно радиосигнализация BlueTooth задает скорость передачи. Водитель примет все, что вы выберете, но в противном случае проигнорирует это. Сигналы рукопожатия могут быть интерпретированы, это зависит от драйвера, чтобы реализовать их. Отчеты об ошибках связи реализуются очень редко, в отличие от реального последовательного порта, BlueTooth имеет протокол исправления ошибок.
Нет, потеря данных здесь полностью обусловлена самим собой. Очевидно, что драйвер реализует DiscardInBuffer(). Что ничего не дает, кроме как выбрасывать любые данные, полученные драйвером. Это пойдет не так, если ваш код выполняется с небольшим опозданием или прерывается переключением контекста потока.
Удалите вызов DiscardInBuffer().