Forum: Mikrocontroller und Digitale Elektronik Von uC zu Android-Smartphone per BT Daten versenden: Problem mit der Typkonvertierung


von durak (Gast)


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!

von Jim M. (turboj)


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.

von durak (Gast)


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.

von Jim M. (turboj)


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

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.