Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
krant
0 / 0 / 0
Регистрация: 19.07.2015
Сообщений: 4
#1

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

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

Добрый день. Прошу особо не пинать. Вопрос чисто технический.

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

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

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

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

По необходимости могу предоставить коды на контроллер и проект из студии.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
krant
0 / 0 / 0
Регистрация: 19.07.2015
Сообщений: 4
27.07.2015, 10:31  [ТС]     Приём текста по Bluetooth. Ошибки в символах #2
Спустя 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();}
        }
 
 
    }
}



Результат работы таков:
Приём текста по Bluetooth. Ошибки в символах

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

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

Добавлено через 3 минуты
кстати, еще вопрос, это только у меня при резком движении телефоном рвется связь?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.08.2015, 17:01     Приём текста по Bluetooth. Ошибки в символах
Еще ссылки по теме:
Bluetooth + Android Android
Android Снова Bluetooth
Bluetooth Broadastreceiver Android
Android Bluetooth- приложение
Работа с bluetooth Android

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

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

Свою проблему я решил не увеличением скорости на ведомом устройстве, а впихиванием задержки в коде приёма в потоке блютуса. Скорость увеличить не могу из-за неуспеваемости вычислений на ведомом устройстве.
Yandex
Объявления
03.08.2015, 17:01     Приём текста по Bluetooth. Ошибки в символах
Ответ Создать тему
Опции темы

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