Von uC zu Android-Smartphone per BT Daten versenden: Problem mit der Typkonvertierung

Gast #3601168
Lesenswert?

Hallo,

ich versende von einem STM32F4-Discovery-Board über ein an den UART 
angeschlossenes BT-Modul wie folgt Daten:
1
...
2
char buf[3];
3
char *pbuf = buf;
4
*pbuf++ = 0xa7;
5
*pbuf++ = 0x01;
6
*pbuf = '\0';
7
USART_SendBuf(USART2, buf, strlen(buf));
8
USART_SendBuf(USART2, "\r\n", strlen("\r\n"));
9
...

Ein an die serielle Schnittstelle angeschlossener Logic Analyzer (LA) 
zeigt, dass die Daten wie folgt an das BT-Modul weitergegeben werden:
1
'167' (0xA7) '1' (0x01) \r (0x0D) \n (0x0A)


Die Daten empfange ich mit einem Android-Smartphone wie folgt:

BT-Teil:
1
private void sendLineRead(String line) {
2
    mHandler.obtainMessage(MSG_LINE_READ, -1, -1, line).sendToTarget();
3
}
4
...
5
BufferedReader reader = new BufferedReader(new InputStreamReader(mmInStream));
6
while (!stop) {
7
    try {
8
        String line = reader.readLine();
9
        if (line != null) {
10
            sendLineRead(line);
11
        }
12
...

Handler:
1
...
2
case BluetoothService.MSG_LINE_READ:
3
    String readMessage = (String)msg.obj;
4
    mConversationArrayAdapter.add(readMessage);
5
    char x;
6
    int[] t = new int[readMessage.length()];
7
    for(int i = 0; i < (readMessage.length()); i++) {
8
        x = readMessage.charAt(i);
9
        int z = (int) x & 0xFF;
10
        t[i] = z;
11
        mConversationArrayAdapter.add(Integer.toString(z));
12
    }
13
...

Auf dem Smartphone ausgegeben wird:
1
253
2
1

Das ist falsch, so viel ist mir klar. Jemand eine Idee was genau ich 
falsch mache?

Vielen Dank im Voraus!
#3601215
Lesenswert?

Bei String ist immer auch ein Encoding im Spiel - Du gibts leider keins 
an. Android nimmt IIRC UTF-8 intern per default - damit können dann auch 
Chars > 256 auftreten.

Wenn die Bytes erhalten bleiben sollen, musst Du mit byte[] oder 
ByteBuffer arbeiten.

Alternativ könnte man auch valides UTF-8 erzeugen und mit BT übertragen, 
dann klappts auch mit String.
Gast #3605379
Lesenswert?

Hi,

sorry, ich kapiere es nicht. Hier was ich versucht habe:
1
...
2
private void sendLineRead(byte[] line) {
3
    mHandler.obtainMessage(MSG_LINE_READ, -1, -1, line).sendToTarget();
4
}
5
...
6
BufferedReader reader = new BufferedReader(new InputStreamReader(mmInStream));
7

8
while (!stop) {
9
    try {
10
        byte[] line = reader.readLine().getBytes();;
11
            if (line != null) {
12
                sendLineRead(line);
13
                ...
1
....
2
case BluetoothService.MSG_LINE_READ:
3
if (paused) break;
4
byte[] readMessage = (byte[])msg.obj;
5
int z = 0;
6
for (int i = 0; i < readMessage.length; i++) {
7
    z = readMessage[i] & 0xFF;
8
    System.out.println(Integer.toHexString(z));
9
}
10
...

Eclipse gibt im LogCat folgendes aus:

ef
bf
bd
1

Jedes Byte bei bei dem das MSB 1 ist (z.B. 0xa7) wird als "ef bf bd" 
ausgegeben.
#3606007
Lesenswert?

> reader.readLine().getBytes();

Leider auch falsch. Du liesst einen String mit readLine() - dort findet 
intern die erste Konvertierung von Zeichensätzen statt, weil die Ausgabe 
ein String ist - und machst dann getBytes(), wo die Zeichen als UTF-8 
ausgegeben werden (IIRC laut Android Doku). Das ergibt natürlich andere 
Werte als Du sie oben reinsteckst.

Du kannst mal versuchen, explizit mit Charset Name zu arbeiten:
1
BufferedReader reader = new BufferedReader(new InputStreamReader(mmInStream), "ISO-8859-1");
2
// ...
3

4
byte[] line = reader.readLine().getBytes("ISO-8859-1");

Das müsste dann die Bytes so ausgeben wie sie reinkommen.


> Eclipse gibt im LogCat folgendes aus:

> ef
> bf
> bd
> 1

Das ist ein UTF-8 BOM, siehe auch
https://developer.android.com/reference/java/nio/charset/Charset.html

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren