Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
 
0 / 0 / 0
Регистрация: 07.02.2019
Сообщений: 3
1
RAD XE4+

Classic Bluetooth странное поведение сокета

07.02.2019, 09:14. Просмотров 492. Ответов 8
Метки нет (Все метки)

Доброго времени суток !

Пытаюсь подружить устройство на stm32+CH-06 с компом

Использую Embarcadero® C++Builder XE8 Version 22.0.19908.869 и компонент Bluetooth Classic

К устройству подключаюсь успешно, а вот с сокетом непонятки

Отправка(BT_Socket->SendData(ToSend)) работает, на stm-ме я вижу именно то что отправил с компа
а вот ответ(ToRead = BT_Socket->ReceiveData(80)) приходит 2мя частями

Я с stm32 отправил к примеру 5 байт
после первого ReceiveData я вижу когда 1н когда 2 байта ответа, если сразу вызвать ReceiveData то на 2-3 раз прилетают оставшиеся байты

Ещё странность, пробую на любой байт от компа отправлять с smt строку "DBG TEST", при первой отправке мне приходит ответ 2мя частями, дальше приходит целиком. Но если отправляю с компа команду из нескольких байт то это правило уже не работает.

пробовал играться с таймаутом ReceiveData и Bluetooth1->SocketTimeout никаких внятных результатов не получил.

Подскажите знающие люди как сделать так чтоб данные прилетали целиком и за 1н раз ?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.02.2019, 09:14
Ответы с готовыми решениями:

Вычитывание байтов из InputStream сокета Bluetooth
Создан блютузный сокет, приконнекчен к девайсу, запущен следующий поток: private class...

странное поведение
До определенного времени мой сайт получал с Яндекса почти 2к посетителей в сутки. Но в один...

Странное поведение new
Объясните почему оператор new выделяет неверное количество памяти? # include <iostream> using...

БД, странное поведение
Привет Создаю источник данных из папки (скрин 1 и 2). Запускаю проект, добавляю 3 строки, нажимаю...

8
693 / 485 / 125
Регистрация: 31.05.2013
Сообщений: 2,697
Записей в блоге: 3
07.02.2019, 10:13 2
Доброго!
В теории, Если посмотреть технологию обмена данными по блютус, то там есть свои стандарты передачи данных, их основных у 4.0 три, так что возможно к пакетом добавляются служебные байты со стороны других устройств.
Единтсвенный стабильный и простой способ передачи я вижу в предварительной отправке длины пакетов.
0
0 / 0 / 0
Регистрация: 07.02.2019
Сообщений: 3
07.02.2019, 13:03  [ТС] 3
я так и хотел сделать, но мешает мусор в ответе который непонятно как отсеивать

в первом варианте у меня была динамическая длинна ответного пакета от stm с указанием его длинны и фиксированная длинна команды с компа, сейчас сделал так что stm отвечает на любую команду пакетом фиксированной длинны и опять странность

у меня 2 команды, 0 и 1, на первую stm отдает 32шт 0xFF на вторую 32шт 0xFE
отправляю я к примеру команду 0, в ответ должно придти 32 шт 0xFF, с первого раза прилетает сначала пакет длинной 1, следом длинной 31, 3ий и далее ответы строго по 32
вроде ладно, можно на это забить и сделать костыль

но когда я начинаю чередовать команды то нужный ответ приходит со 2го раза

т.е. отправил я 0, в ответ 0xFF, здорово
далее отправил 1, в ответ опять 0xFF хотя модуль отдал 0xFE, wtf ?
ещё раз отправляю 1, прилетело верное 0xFE, здорово
теперь отправляю 0, и получаю 0xFE, wtf ?
ещё раз отправляю 0, в ответ 0xFF и так по кругу

попробовал сделать костыль, отправлять каждую команду 2 раза и последний считать верным, но и тут засада, если отправлять пакеты без задержек то ничего не приходит, если отправлять с задержкой в 300мсек то все вроде ОК

но блин 600мсек на обработку команды это дич какая-то, команд у меня около 20 шт которые нужно выполнять постоянно в разной последовательности, это 12 секунд на все, крайне не поворотливое решение выйдет

такое ощущение что нужно чистить какой-то буфер то-ли на стороне stm то-ли на компе, но чего-то похожего не могу найти
0
Эксперт С++
8329 / 6081 / 605
Регистрация: 10.12.2010
Сообщений: 28,251
Записей в блоге: 27
07.02.2019, 21:39 4

Не по теме:

С

Цитата Сообщение от bodigard Посмотреть сообщение
-06
Можно работать как с виртуальным COM портом для чего можно использовать сторонний компонент TBComPort.

Это как альтернатива.



Но судя по вопросам, ТС просто не понимает как работают сокеты и вообще передача данных.

Добавлено через 5 минут
Хотя смотрю описания компонента и тоже не понимаю как он работает, я ожидал увидеть событийный компонент и свойство-событие типа аля "OnReciveData"
0
0 / 0 / 0
Регистрация: 07.02.2019
Сообщений: 3
08.02.2019, 07:22  [ТС] 5
как работают обычные сокеты win/nix я прекрасно представляю, только применительно к обмену по tcp-ip, и когда я их использовал у меня проблемы были когда за раз пытался загнать овер 500кб (да знаю сзсб ) в сокет, но на мелких (десятки и сотни байт) пакетах проблем отрадясь небыло
собственно отсюда и вопросы ...

от COM порта я отказался потому-что CH-06 у меня определяется как 2 COM порта, какой из них использовать для обмена хз, к тому-же при попытке подключиться к любому из них терминалом отваливается из системы сам CH-06 и виснет терминал
возможно это мой локальный глюк, но т.к. нет возможности тестить на 10ке компов то нафиг

в общем пока победил так:
с stm-а на любой запрос отправляется 80 байт, это у меня максимальный возможный ответ от модуля
на ПК ловлю пакеты, складываю их в буфер, как только поймал 80 байт считаю что ответ получен
вроде работает

нифига не оптимально конечно, большинство ответов на команды это 2-4 байта, есть пара байт по 20-30,в зависимости от обстоятельств во внешнем мире, и только 1 на 80, и из-за него приходиться всегда гонять 80 байт

спасибо всем ответившим !
0
693 / 485 / 125
Регистрация: 31.05.2013
Сообщений: 2,697
Записей в блоге: 3
08.02.2019, 10:59 6
А чем Вас не устроили стандартные компонеты из среды или из FMX?
0
Эксперт С++
8329 / 6081 / 605
Регистрация: 10.12.2010
Сообщений: 28,251
Записей в блоге: 27
08.02.2019, 13:31 7
Цитата Сообщение от bodigard Посмотреть сообщение
CH-06
Может НС-06 ? Если он то он нормально определяется, по крайней мере у меня.

Добавлено через 1 минуту
Цитата Сообщение от bodigard Посмотреть сообщение
как работают обычные сокеты win/nix я прекрасно представляю, только применительно к обмену по tcp-ip, и когда я их использовал у меня проблемы были когда за раз пытался загнать овер 500кб (да знаю сзсб ) в сокет, но на мелких (десятки и сотни байт) пакетах проблем
Еще раз подтверждает что Вы не понимаете как это работает.
0
Dinkin
08.02.2019, 13:34
  #8

Не по теме:


Цитата Сообщение от Avazart Посмотреть сообщение
Может НС-06
Интересная плата, хотел себе тоже взять, что нит на нее прикрепить. Но так и ненашел куда бы ее =))

0
Avazart
08.02.2019, 13:43     RAD XE4+ Classic Bluetooth странное поведение сокета
  #9

Не по теме:

Я использую HC-05 + Arduino +ИК пульт + ПО эмулирующее курсор/кнопки клавы/звук в итоге получаю нечто вроде ИК пульта для ноута.


С Arduino нормально работает, я правда общаюсь "текстовым" протоколом т.е команды текстовые, читается все что до разделителя \n.

0
08.02.2019, 13:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.02.2019, 13:43
Привет! Вот еще темы с ответами:

Странное поведение
Здравствуйте еще раз :) Теперь возникла другая непонятка. Есть класс StringParser, объекты которого...

Странное поведение
Собственно, сабж: https://www.cyberforum.ru/attachment.php?attachmentid=272592&stc=1&d=1369472568...

Странное поведение
Добрый день! Имеется класс с мейном: public class Main { // args - is path to file with...

Странное поведение
Всем привет,я тут новенький и прошу у вас помощи. Проблема заключается в следующем: Были проблемы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.