Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/40: Рейтинг темы: голосов - 40, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 19.07.2015
Сообщений: 4

Приём текста по Bluetooth. Ошибки в символах

19.07.2015, 14:32. Показов 7752. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Прошу особо не пинать. Вопрос чисто технический.

Второй день ищу по поисковикам, заметил что не я один сталкивался с такой проблемой.
Суть в чем. Есть связка:
Контроллер - HC-06 - Android девайс (у меня их 4 штуки, ситуация на всех одинакова).

Организована между ними передача данных (телеметрия). Пакетом по 64 информационных байта. Для расшифровки пакета и разбиения на информационные блоки я использовал текстовые метки, но дело в том, что текстовые метки приходят подозрительно кривые, иногда идёт замена символов (на соседние, не те что нужно). Иногда идёт повтор кусков текстового сообщения. Как назло bluetooth терминал что из маркета принимает данные добезумия круто и без единого пропуска в байтах или перестановки их местами.

Важное замечание: при использовании одних лишь цифр и разделителей ";" , ":" никаких проблем нет. Я понимаю что можно оставить и так, но разобраться то хочется.

Кто-то сталкивался с этой проблемой, расскажите как вы её решали.

По необходимости могу предоставить коды на контроллер и проект из студии.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.07.2015, 14:32
Ответы с готовыми решениями:

Приём данных по Bluetooth
Из Arduino посылается строка xx|xx|xx|xx|xx,xxxx|\n, где х-любое число. На андроиде получаю: х| x| x| x| итд. Подскажи как...

Приём данных через Bluetooth
Как правильно принимать данные через bluetooth? Соединение устанавливать я умею. Интересует именно сам процесс получения данных....

Bluetooth серез Socket и прием файлов
Привет всем. Подскажите пожалуйста что можно сделать в моем случае. Имеем программу которая передает файлы на мобильные по BT....

6
0 / 0 / 0
Регистрация: 19.07.2015
Сообщений: 4
27.07.2015, 10:31  [ТС]
Спустя 2 недели как-то никакого интереса в теме.
Буду значит понемногу выкладывать информацию. На выходных написал полностью голый проект под работу с БТ.
Исходный код:

Ардуино.
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <Wire.h>
char recive_buffer[64];
char recive_count;
 
void setup() {
recive_count=0;
Serial.begin(9600);
}
 
void loop() {
while(Serial.available())
  {
  recive_buffer[recive_count]=Serial.read();
  recive_count++;
  }
 
if(recive_count>0)
  {
  
  if (recive_buffer[0]=='g' && recive_buffer[1]=='e' && recive_buffer[2]=='t' && recive_buffer[3]=='c')
  Serial.print("123456789");Serial.print("987654321");
 
  recive_count=0;
  }


полный код активити

Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
 
package ru.krantinbox.bluepupnew;
 
import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.os.Message;
import android.os.Bundle;
import android.view.Menu;
import android.os.Handler;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
 
import org.w3c.dom.Text;
 
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.UUID;
 
 
public class MainActivity extends Activity {
    public BluetoothAdapter myBtAdapter=null;
    public BluetoothDevice myBtDevice=null;
    public BluetoothSocket myBtSocket=null;
 
    private ConnectedThread myThread;
 
    Handler h;
    private final int ReciveData=1;
    private TextView myPrintReciveBuffer;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myPrintReciveBuffer = (TextView)findViewById(R.id.textView2);
 
        try {
            init_bt();
        } catch (IOException e) {
            e.printStackTrace();
        }
 
    h = new Handler(){
        public void handleMessage(Message msg){
            switch (msg.what){
                case ReciveData:
                    byte[] readbuff = (byte[])msg.obj;
                    String strInComm = new String (readbuff,0, msg.arg1);
                    myPrintReciveBuffer.setText(myPrintReciveBuffer.getText()+strInComm);
                    break;
            }
        }
    };
 
    }
 
    public void init_bt() throws IOException {
        boolean hardBtOnBoard=false;
        boolean hardBtTurnOn=false;
        final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
            String myRemoteMacAdress = "20:15:03:30:74:36";
 
            myBtAdapter = BluetoothAdapter.getDefaultAdapter();
            // проверка на наличие БТ на утройстве
            if (myBtAdapter!=null) hardBtOnBoard=true;
            // проверка включен ли БТ на устройстве?
            if (myBtAdapter.isEnabled()) hardBtTurnOn=true;
            if (hardBtTurnOn & hardBtOnBoard) {
                myBtDevice = myBtAdapter.getRemoteDevice(myRemoteMacAdress);
                Toast.makeText(getApplicationContext(), "Выбрано устройство: " + myBtDevice.getName(), Toast.LENGTH_SHORT).show();
                myBtSocket= myBtDevice.createInsecureRfcommSocketToServiceRecord(MY_UUID);
                myBtAdapter.cancelDiscovery();
                myBtSocket.connect();
        }
        myThread = new ConnectedThread(myBtSocket);
        myThread.start();
        if (myBtSocket.isConnected()) Toast.makeText(getApplicationContext(),"Подключено к " + myBtDevice.getName() + "адресс: " + myBtDevice.getAddress(),Toast.LENGTH_LONG).show();
        else {
            Toast.makeText(getApplicationContext(), "не подключился", Toast.LENGTH_SHORT).show();
            myBtSocket.close();
        }
    }
 
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }
 
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
 
        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }
 
        return super.onOptionsItemSelected(item);
    }
 
    public void ReciveData(View view) {
    myThread.sendData("getc");
        myThread.sendData("gett");
    }
 
    public void reciveALt(View view) { myThread.sendData("geta");
    }
 
    public void reciveTemp(View view) {myThread.sendData("gett");
    }
 
    public void recivePres(View view) {myThread.sendData("getp");
    }
 
    public void clear(View view) {myPrintReciveBuffer.setText("");
    }
 
    public void Connect(View view) throws IOException {
        init_bt();
    }
 
    private class ConnectedThread extends Thread{
        private BluetoothSocket genBtSocket;
        private OutputStream genOutStream;
        private InputStream genInStream;
 
        public ConnectedThread(BluetoothSocket socket){
        genBtSocket = socket;
        OutputStream tmpOut = null;
        InputStream tmpIn = null;
            try{
                tmpOut = socket.getOutputStream();
                tmpIn = socket.getInputStream();
            } catch (IOException e) {}
            genOutStream=tmpOut;
            genInStream=tmpIn;
        }
 
       public void run(){
           byte[] buffer = new byte[16];
           int bytes;
           while (true){
               try{
 
                   bytes = genInStream.read(buffer);
                   h.obtainMessage(ReciveData,bytes,-1,buffer).sendToTarget();
               } catch (IOException e) {break;}
           }
       }
 
 
        public void sendData(String message){
            byte[] msgBuffer = message.getBytes();
            try{
                genOutStream.write(msgBuffer);
            } catch (IOException e) {Toast.makeText(getApplicationContext(),"не вышло",Toast.LENGTH_SHORT).show();}
        }
 
 
    }
}



Результат работы таков:


Как понимаете. по запросу я передаю две посылки по 9 байт. Первая посылка "123456789" и следом за ней тут же "987564321". Число байт сохраняется, но вот коды символов уже приходят не те. Скажу сразу одно: первая посылка приходит всегда без ошибок.

Кто-нибудь сталкивался с таким ?
0
0 / 0 / 0
Регистрация: 31.07.2015
Сообщений: 3
31.07.2015, 22:28
Ага, у меня такие же грабли, стоит задача написать клиента под андроид для проекта.
Блютуз модуль такой же. Со стороны контроллера все работает идеально, в блютуз терминале отображается вся посылка целиком, криво только в примере. Если получится решить, отпишусь
0
0 / 0 / 0
Регистрация: 31.07.2015
Сообщений: 3
02.08.2015, 01:40
мда, оказывается все уже решено: Как принять сообщение по BlueTooth
0
0 / 0 / 0
Регистрация: 19.07.2015
Сообщений: 4
02.08.2015, 20:03  [ТС]
Эм, не понимаю, в приведённой ссылке как я понял из результирующих кодов в конце страницы просто селектируют конец строки, и по концу строки определяют информационный сегмент который потом пускают в дальнейшую обработку. Решение пока не было найдено.
0
0 / 0 / 0
Регистрация: 31.07.2015
Сообщений: 3
02.08.2015, 20:41
Не совсем, у меня сложилось впечатление (ИМХО) что в телефоне у блютуз модуля низкий приоритет и сообщение до блютуз чата доходит кусками. Спасибо авторам темы за инфу, я сначала вывел в лог буфер приема, увидел 3 куска своего сообщения, добитых до длины нулями, а потом сделал как у них(склеил из кусков строку, конец определяется по служебным символам). в результате принимаю все сообщение целиком одной строкой. Непонятно одно- зачем выкладывать как образец нерабочий или полурабочий пример?

Добавлено через 3 минуты
кстати, еще вопрос, это только у меня при резком движении телефоном рвется связь?
0
0 / 0 / 0
Регистрация: 19.07.2015
Сообщений: 4
03.08.2015, 17:01  [ТС]
На самом деле всё оказывается несколько проще. Я намедни поигрался со скоростями. Если передавать информацию со скорость 38400 и выше, то информационный поток становится более менее похожим на истину (изредка проскакивают ошибки, но в уарте это допускается, если потеря байтов на общем потоке не более 3%).

Свою проблему я решил не увеличением скорости на ведомом устройстве, а впихиванием задержки в коде приёма в потоке блютуса. Скорость увеличить не могу из-за неуспеваемости вычислений на ведомом устройстве.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.08.2015, 17:01
Помогаю со студенческими работами здесь

Прием/передача данных с устройства по Bluetooth BLE
Добрый день. Подскажите, кто-нибудь сталкивался с подключением, приемом и передачей данных устройства по протоколу Bluetooth BLE. Читал в...

Пример кода отправка и прием данных по bluetooth в сервисе, в фоне
Есть задача соединение по bluetooth в сервисе, прием и передача данных. В интернете есть примеры реализации соединения по bluetooth, но они...

Получение списка подключеных Bluetooth-устройств и передача/прием файлов
скачал wireles framework.как с ним работать.нужно получить список подключеных блютуз-устройств и передать или получить какойто файл на...

Qt Bluetooth, ошибка qt.bluetooth: Dummy backend running. Qt Bluetooth module is non-functional
Начал разбираться с Qt и Bluetooth, для этого запустил пример http://doc.qt.io/qt-5/qtbluetooth-btscanner-example.html. Скомпилил, все...

Обработка ошибки подключения по Bluetooth
Добрый день! У меня в программе, написанной на Basic4Android реализована связь телефона с контроллером по Bluetooth. При запуске...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru