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

При приеме сообщения по bluetooth отутствует последний байт - Android

Восстановить пароль Регистрация
 
foxis
5 / 5 / 0
Регистрация: 11.07.2011
Сообщений: 122
13.04.2016, 11:58     При приеме сообщения по bluetooth отутствует последний байт #1
Здравствуйте
необходимо по bluetooth связываться с МК (микрокон-ер) и андроид устройством, отправлять и получать сообщения в виде определенных команд (по протоколу).

В качестве базы взял за основу пример программы от гугл BluetoothChat.
Немного под редактировал ее, чтобы отправлять ни текстовые сообщения, а байты
данных.

Программа BluetoothChat для обмена сообщениями между двумя устройствами
пользуется потоком Handler.

В частности для чтения полученных данных из потока используется код:

Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
case MESSAGE_READ:
                byte[] readBuf = (byte[]) msg.obj;
                // construct a string from the valid bytes in the buffer
                String readMessage = new String(readBuf, 0, msg.arg1);
//              mConversationArrayAdapter.add(mConnectedDeviceName + ":  "
//                      + readMessage);
 
                //My chnages
                mConversationArrayAdapter.add(mConnectedDeviceName);
                for (int i = 0; i < readBuf.length;i++){
                    mConversationArrayAdapter.add( ( Integer.toHexString( (int) readBuf[i] & 255 ) )  );
                    if (readBuf[i] == 0 && i > 25)
                        break;
                }
                //=====================
 
 
                break;


Здесь полный код обработчика:

Кликните здесь для просмотра всего текста
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
// The Handler that gets information back from the BluetoothChatService
    private final Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
            case MESSAGE_STATE_CHANGE:
                if (D)
                    Log.i(TAG, "MESSAGE_STATE_CHANGE: " + msg.arg1);
                switch (msg.arg1) {
                case BluetoothChatService.STATE_CONNECTED:
                    setStatus(getString(R.string.title_connected_to,
                            mConnectedDeviceName));
                    mConversationArrayAdapter.clear();
                    break;
                case BluetoothChatService.STATE_CONNECTING:
                    setStatus(R.string.title_connecting);
                    break;
                case BluetoothChatService.STATE_LISTEN:
                case BluetoothChatService.STATE_NONE:
                    setStatus(R.string.title_not_connected);
                    break;
                }
                break;
            case MESSAGE_WRITE:
                byte[] writeBuf = (byte[]) msg.obj;
                // construct a string from the buffer
                String writeMessage = new String(writeBuf);
//              mConversationArrayAdapter.add("Me:  " + writeMessage);
 
 
                // My changes
                mConversationArrayAdapter.add("Me: ");
                for (int i = 0; i < writeBuf.length;i++){
                    mConversationArrayAdapter.add( ( Integer.toHexString( (int) writeBuf[i] & 255 ) )  );
                }
                //========================
 
 
                break;
            case MESSAGE_READ:
                byte[] readBuf = (byte[]) msg.obj;
                // construct a string from the valid bytes in the buffer
                String readMessage = new String(readBuf, 0, msg.arg1);
//              mConversationArrayAdapter.add(mConnectedDeviceName + ":  "
//                      + readMessage);
 
                //My chnages
                mConversationArrayAdapter.add(mConnectedDeviceName);
                for (int i = 0; i < readBuf.length;i++){
                    mConversationArrayAdapter.add( ( Integer.toHexString( (int) readBuf[i] & 255 ) )  );
                    if (readBuf[i] == 0 && i > 25)
                        break;
                }
                //=====================
 
 
                break;
            case MESSAGE_DEVICE_NAME:
                // save the connected device's name
                mConnectedDeviceName = msg.getData().getString(DEVICE_NAME);
                Toast.makeText(getApplicationContext(),
                        "Connected to " + mConnectedDeviceName,
                        Toast.LENGTH_SHORT).show();
                break;
            case MESSAGE_TOAST:
                Toast.makeText(getApplicationContext(),
                        msg.getData().getString(TOAST), Toast.LENGTH_SHORT)
                        .show();
                break;
            }
        }
    };


Возникает следующая проблема:
msg.obj содержит сообщение ответа пришедшего на андроид устройство с
МК .

Но в некоторых случаях это сообщение содержится там не полностью, почему-то выпадает
последний байт (содержащий 2ую половину контрольной суммы).

Причем это ни проблема со связью, эта ошибка (отсутствие последнего байта с ответного сообщения) появляется постоянно, если приходит ответ определенного вида (т.е. строго определенная последовательность байтов).

Я понимаю, конечно последний байт (контрольную сумму) можно самостоятельно подкорректировать ,зная само
сообщение, посчитав эту сумму самостоятельно.

Но все-таки хотел бы узнать, с чем связано отсутствие последнего байта для некоторых сообщений ?
Почему одни сообщения приходят нормально, а другие с отсутствующим последним байтом ?


Вдогонку: бывает еще такой баг, msg.arg1 обычно содержит длину сообщения пришедшего
на андроид устройство. Но иногда это значение длины отличается от истинного.

Это конечно тоже не критично потому как в самом сообщении уже имеется информация про длину сообщения,
но все таки хотелось бы узнать от чего зависит значение msg.arg1 когда на
андроид устройство приходит сообщение ?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.04.2016, 11:58     При приеме сообщения по bluetooth отутствует последний байт
Посмотрите здесь:

Bluetooth Android
Android Снова Bluetooth
Bluetooth Broadastreceiver Android
Bluetooth + Android Android
Android + PC + bluetooth Android
Bluetooth кнопка Android
Реализовать воспроизведение звука при каждом показе сообщения Android
Bluetooth-чат Android
Android Bluetooth- приложение
Работа с bluetooth Android
При передаче текста в другую программу нужен только Bluetooth Android
Android Bluetooth. Повторный запрос Pin-кода на спаривание (при коннекте)

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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