|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
19.09.2017, 11:17 | #1 |
Форумчанин
Регистрация: 06.10.2013
Сообщений: 216
|
BlueTooth на Android
Привет, в этой теме опишу рабочий способ связать Android и Arduino средствами Bluetooth. Во первых логика самой программы такова, что она формирует кадр который мы и будем отправлять. Кадр из себя представляет 3 значения, 2 разделителя и окончание строки. Выглядит кадр вот так r/g/ae, где r - значение от 0 до 179 соответствует ползунку руля, g - значение от 0 до 179 соответствует ползунку газа, a - значения от 0 до 8 для управления 3-я каналами aux, и e - конец строки.
Начнем с класса Код:
Код:
Код:
Код:
Код:
Создаем процедуру PairedDevices, запоминаем ее, она даст нам список сопряженных устройств, потом нам понадобится индекс устройства! Код:
Код:
Код:
У меня все-таки получилось засунуть все это в один модуль и теперь это управляется в 3 действия Код:
EasyBlueTooth.zip Последний раз редактировалось PTyTb32; 19.09.2017 в 14:34. |
05.10.2017, 20:55 | #2 |
Новичок
Джуниор
Регистрация: 25.09.2010
Сообщений: 1
|
Спасибо за код. Как я понимаю, отправляется именно строковое значение. А что нужно переделать, чтоб можно было отправлять byte?
|
02.11.2017, 13:29 | #3 |
Форумчанин
Регистрация: 06.10.2013
Сообщений: 216
|
|
25.10.2018, 20:32 | #4 |
Участник клуба
Регистрация: 28.03.2007
Сообщений: 1,814
|
Всем привет. Сижу бьюсь уже неделю с блютусом на андроиде. Всё работает нормально, но как только доходит до строчки
Код:
|
23.12.2018, 16:37 | #5 | |
Новичок
Джуниор
Регистрация: 22.12.2018
Сообщений: 2
|
Цитата:
|
|
23.12.2018, 17:23 | #6 |
Новичок
Джуниор
Регистрация: 22.12.2018
Сообщений: 2
|
Пример рабочий, проверил. А как получать данные?
|
26.12.2018, 14:30 | #7 |
Форумчанин
Регистрация: 06.10.2013
Сообщений: 216
|
едва помню эту приложуху, возможно где то есть исходники..
если первый бит будет содержать в себе количество бит за ним, то можно так Код:
|
28.01.2019, 12:55 | #8 |
Новичок
Джуниор
Регистрация: 14.10.2018
Сообщений: 2
|
Ниже описано, как получать данные по Bluetooth( двусторонняя связь):
Пример PTyTb32 это переделанный, упрощенный варианта оригинального примера ClBluetooth(classic Bluetooth Basic App) от Embarcadero. Упрощенный вариант мне помог разобраться с тем, как это работает, из него убрано куча ненужностей оригинального варианта, за что PTyTb32 большой Спасибо! Вообще приём данных уже заложен в пример(ы) - в потоке в процедуре TServerConnectionTH.Execute, строчка ASocket := FServerSocket.Accept(100); означает, что в течении 100 мсек происходит запрос входных данных, и в случае получения данные мы должны получать ссылку на сокет из которого 5 строчками ниже происходит чтение данных FData := ASocket.ReadData и т.д. Но в ASocket всегда nil. Не работает. Моё решение: 1. Открываем оригинальный пример ClBluetooth.dproj 2. меняем Код:
Код:
3. В манифесте разрешаем Bluetooth 4. на форму добавляем таймер Код:
5. добавляем следующий код Код:
7. Создаём реакцию на нажатие данной кнопки: Код:
|
24.02.2019, 00:36 | #9 |
Новичок
Джуниор
Регистрация: 16.02.2019
Сообщений: 1
|
Товарищ divdiv, ваш вариант рабочий, спасибо. Но работает коряво и с фризами жуткими. Фризы по секунд 10, наверное. я не уверен, что правильно понял про строчку ASocket := FServerSocket.Accept(100); но если правильно, то тут замечание: FServerSocket.Accept(100); задаёт таймаут в миллисекундах на получение сокета, к входным данным отношения не имеет.
Очень большой интервал таймера. Вы предлагаете до 3 секунд. Это слишком много, да и фризит на чтении из буфера ещё дольше. В поток запихнуть чтение входных данных не получилось у меня. либо виснет, либо вообще никак не реагирует. И вообще, судя по другим форумам, не только у меня не получилось. Обнаружилось, что если в буфере что-то есть, то на LData := FSocket.ReceiveData; ничего не подвисает и не фризит. как только буфер пустой, ReceiveData как будто ждёт определенное время, а не появится ли там чего, потому и фризы. Оказалось, вот как дело обстоит: "function ReceiveData(ATimeout: Cardinal): TBytes; overload; Читает массив байтов, отправленных удаленным устройством. ATimeout - максимальное время ожидания данных. Если по истечении времени данных нет, возвращаемое значение (TBytes) будет пустым." Меняем ваше LData := FSocket.ReceiveData; на LData := FSocket.ReceiveData(0); - профит! Ничего не фризит, всё отлично работает. И интервал таймеру можно и 10мс поставить. Странно, что в интернетах столько мучеников с этой проблемой, и никто документацию почитать не догадался. Ну и жаль, что в поток запихнуть не получилось. Последний раз редактировалось edge89; 24.02.2019 в 00:45. |
03.03.2019, 17:18 | #10 | |
Новичок
Джуниор
Регистрация: 14.10.2018
Сообщений: 2
|
Цитата:
|
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
XE8 + Android: не запрашивает доступ к Bluetooth | mosq | Мобильные ОС (Android, iOS, Windows Phone) | 0 | 14.06.2017 11:21 |
FM Bluetooth | PTyTb32 | Компоненты Delphi | 0 | 08.01.2017 02:27 |
bluetooth | Drago56 | C/C++ Сетевое программирование | 0 | 25.02.2016 23:36 |
BlueTooth | GBAXA | Работа с сетью в Delphi | 1 | 19.12.2010 13:53 |
BlueTooth | subsonic | Общие вопросы Delphi | 4 | 24.07.2008 16:19 |