Virtuelles USB-Serial-Device (FTDI-Treiber), Bytestream "garbled"
Verfasst: Sa 25. Jan 2025, 03:50
Ich habe auf meinem Laptop ein mit Xen virtualisiertes Android-x86.
Um auch Applikationen sinnvoll nutzen zu können, die einen Standort abfragen, nutze ich den GPS Connector. Mit dem Simulations-Modus und dem "Abspielen" einer Datei, die ich ebenfalls mit dem GPS-Connector auf meinem Handy erzeugt habe, klappt das auch wunderbar.
Um die GPS-Funktion granularer steuern zu können wollte ich mir nun ein virtuelles USB-Serial-Device einrichten, dass ich vom Host aus mit NMEA-Daten versorgen kann. Dabei wird ein FTDI-USB-Serial-Device emuliert. Das funktioniert nur "fast".
Fast heißt: Die NMEA-Daten kommen an und sind im Terminal-Modus des GPS-Connector an, sind aber "verhunzt". Lasse ich sie mitschreiben sehe ich im Hexdump, dass wiederholt die zwei Byte "B1 00" in den Byte-Stream "eingestreut" wurden. Dann können die NMEA-Sätze natürlich nicht mehr sauber geparst werden. Die Daten kommen aber alle an, nur die zusätzlichen Bytes stören offensichtlich.
Richte ich ein identisches USB-Serial-Device in einer Linux-VM ein, passiert das nicht. Und wenn ich in meinem virtualisierten Android die App "Serial USB Terminal" benutze, passiert das auch nicht. Das Problem müsste von daher am ehesten im GPS-Connector selbst liegen, möglicherweise in der FTDI-Unterstützung.
Ich habe mir also mal ein Debug-Log erzeugt. Es ist auch voller Meldungen "invalid status byte". Ein kausaler Zusammenhang mit meinem Problem ist also nicht unwahrscheinlich.
Ich würde es auch gerne anhängen, aber egal welche Extension ich für die Datei verwende, wird das Hochladen mit "ungültige Dateierweiterung" vom Forum abgelehnt?!
Daher hier ein kurzer Ausschnitt, die vollständige Datei sende ich gerne auf anderem Wege:
Ich würde mich freuen, wenn man damit den Fehler näher untersuchen und eventuell gar beheben könnte.
Um auch Applikationen sinnvoll nutzen zu können, die einen Standort abfragen, nutze ich den GPS Connector. Mit dem Simulations-Modus und dem "Abspielen" einer Datei, die ich ebenfalls mit dem GPS-Connector auf meinem Handy erzeugt habe, klappt das auch wunderbar.
Um die GPS-Funktion granularer steuern zu können wollte ich mir nun ein virtuelles USB-Serial-Device einrichten, dass ich vom Host aus mit NMEA-Daten versorgen kann. Dabei wird ein FTDI-USB-Serial-Device emuliert. Das funktioniert nur "fast".
Fast heißt: Die NMEA-Daten kommen an und sind im Terminal-Modus des GPS-Connector an, sind aber "verhunzt". Lasse ich sie mitschreiben sehe ich im Hexdump, dass wiederholt die zwei Byte "B1 00" in den Byte-Stream "eingestreut" wurden. Dann können die NMEA-Sätze natürlich nicht mehr sauber geparst werden. Die Daten kommen aber alle an, nur die zusätzlichen Bytes stören offensichtlich.
Richte ich ein identisches USB-Serial-Device in einer Linux-VM ein, passiert das nicht. Und wenn ich in meinem virtualisierten Android die App "Serial USB Terminal" benutze, passiert das auch nicht. Das Problem müsste von daher am ehesten im GPS-Connector selbst liegen, möglicherweise in der FTDI-Unterstützung.
Ich habe mir also mal ein Debug-Log erzeugt. Es ist auch voller Meldungen "invalid status byte". Ein kausaler Zusammenhang mit meinem Problem ist also nicht unwahrscheinlich.
Ich würde es auch gerne anhängen, aber egal welche Extension ich für die Datei verwende, wird das Hochladen mit "ungültige Dateierweiterung" vom Forum abgelehnt?!
Daher hier ein kurzer Ausschnitt, die vollständige Datei sende ich gerne auf anderem Wege:
Code: Alles auswählen
[25.01.2025 03:11:14.537] [D] [TID:131390530090224] [0360::IpcServer.cpp] [doWork()] IPC-NMEA-DataServer [0x45]: wait for msg from client [timeout=60s]
[25.01.2025 03:11:14.817] [E] [TID:131390211257584] [1230::DevImplLibUSB.cpp] [stripFTDIStatusBytes()] Invalid status byte at 0: 0xB1
[25.01.2025 03:11:14.836] [D] [TID:131390211257584] [1231::DevImplLibUSB.cpp] [stripFTDIStatusBytes()] Len=512: B1 00 24 47
[25.01.2025 03:11:14.836] [E] [TID:131390211257584] [1230::DevImplLibUSB.cpp] [stripFTDIStatusBytes()] Invalid status byte at 64: 0xB1
[25.01.2025 03:11:14.841] [D] [TID:131390211257584] [1231::DevImplLibUSB.cpp] [stripFTDIStatusBytes()] Len=512: B1 00 24 47 50 47 47 41 2C 30 32 31 31 31 34 2E 34 36 35 2C 34 38 34 37 2E 31 37 37 2C 4E 2C 30 30 38 30 36 2E 37 34 39 2C 45 2C 31 2C 31 30 2C 31 2E 30 2C 31 32 32 2E 30 2C 4D 2C 2C 4D 2C 2C B1 00 2A 34
[25.01.2025 03:11:14.841] [E] [TID:131390211257584] [1230::DevImplLibUSB.cpp] [stripFTDIStatusBytes()] Invalid status byte at 128: 0xB1
[25.01.2025 03:11:14.845] [D] [TID:131390211257584] [1231::DevImplLibUSB.cpp] [stripFTDIStatusBytes()] Len=512: B1 00 24 47 50 47 47 41 2C 30 32 31 31 31 34 2E 34 36 35 2C 34 38 34 37 2E 31 37 37 2C 4E 2C 30 30 38 30 36 2E 37 34 39 2C 45 2C 31 2C 31 30 2C 31 2E 30 2C 31 32 32 2E 30 2C 4D 2C 2C 4D 2C 2C B1 00 2A 34 39 0D 0A 24 47 50 47 4C 4C 2C 34 38 34 37 2E 31 37 37 2C 4E 2C 30 30 38 30 36 2E 37 34 39 2C 45 2C 30 32 31 31 31 34 2E 34 36 35 2C 41 2C 41 2A 35 33 0D 0A 24 47 50 47 53 41 2C 41 B1 00 2C 33
[25.01.2025 03:11:14.845] [E] [TID:131390211257584] [1230::DevImplLibUSB.cpp] [stripFTDIStatusBytes()] Invalid status byte at 192: 0xB1
[25.01.2025 03:11:14.849] [D] [TID:131390211257584] [1231::DevImplLibUSB.cpp] [stripFTDIStatusBytes()] Len=512: B1 00 24 47 50 47 47 41 2C 30 32 31 31 31 34 2E 34 36 35 2C 34 38 34 37 2E 31 37 37 2C 4E 2C 30 30 38 30 36 2E 37 34 39 2C 45 2C 31 2C 31 30 2C 31 2E 30 2C 31 32 32 2E 30 2C 4D 2C 2C 4D 2C 2C B1 00 2A 34 39 0D 0A 24 47 50 47 4C 4C 2C 34 38 34 37 2E 31 37 37 2C 4E 2C 30 30 38 30 36 2E 37 34 39 2C 45 2C 30 32 31 31 31 34 2E 34 36 35 2C 41 2C 41 2A 35 33 0D 0A 24 47 50 47 53 41 2C 41 B1 00 2C 33 2C 33 2C 36 2C 37 2C 31 31 2C 31 32 2C 31 33 2C 31 34 2C 31 38 2C 33 30 2C 33 32 2C 2C 2C 2C 31 2E 30 2C 2A 30 45 0D 0A 24 47 50 47 53 56 2C 33 2C 31 2C 31 30 2C 30 33 2C 33 38 2C B1 00 32 31
[25.01.2025 03:11:14.850] [E] [TID:131390211257584] [1230::DevImplLibUSB.cpp] [stripFTDIStatusBytes()] Invalid status byte at 256: 0xB1
[25.01.2025 03:11:14.854] [D] [TID:131390211257584] [1231::DevImplLibUSB.cpp] [stripFTDIStatusBytes()] Len=512: B1 00 24 47 50 47 47 41 2C 30 32 31 31 31 34 2E 34 36 35 2C 34 38 34 37 2E 31 37 37 2C 4E 2C 30 30 38 30 36 2E 37 34 39 2C 45 2C 31 2C 31 30 2C 31 2E 30 2C 31 32 32 2E 30 2C 4D 2C 2C 4D 2C 2C B1 00 2A 34 39 0D 0A 24 47 50 47 4C 4C 2C 34 38 34 37 2E 31 37 37 2C 4E 2C 30 30 38 30 36 2E 37 34 39 2C 45 2C 30 32 31 31 31 34 2E 34 36 35 2C 41 2C 41 2A 35 33 0D 0A 24 47 50 47 53 41 2C 41 B1 00 2C 33 2C 33 2C 36 2C 37 2C 31 31 2C 31 32 2C 31 33 2C 31 34 2C 31 38 2C 33 30 2C 33 32 2C 2C 2C 2C 31 2E 30 2C 2A 30 45 0D 0A 24 47 50 47 53 56 2C 33 2C 31 2C 31 30 2C 30 33 2C 33 38 2C B1 00 32 31 31 2C 33 32 2C 30 36 2C 34 33 2C 33 34 36 2C 33 38 2C 30 37 2C 31 34 2C 30 32 34 2C 33 31 2C 31 31 2C 30 35 2C 32 30 37 2C 33 32 2A 37 44 0D 0A 24 47 50 47 53 56 2C 33 2C 32 2C 31 B1 00 30 2C
[25.01.2025 03:11:14.854] [E] [TID:131390211257584] [1230::DevImplLibUSB.cpp] [stripFTDIStatusBytes()] Invalid status byte at 320: 0xB1
[25.01.2025 03:11:14.892] [D] [TID:131390211257584] [1231::DevImplLibUSB.cpp] [stripFTDIStatusBytes()] Len=512: B1 00 24 47 50 47 47 41 2C 30 32 31 31 31 34 2E 34 36 35 2C 34 38 34 37 2E 31 37 37 2C 4E 2C 30 30 38 30 36 2E 37 34 39 2C 45 2C 31 2C 31 30 2C 31 2E 30 2C 31 32 32 2E 30 2C 4D 2C 2C 4D 2C 2C B1 00 2A 34 39 0D 0A 24 47 50 47 4C 4C 2C 34 38 34 37 2E 31 37 37 2C 4E 2C 30 30 38 30 36 2E 37 34 39 2C 45 2C 30 32 31 31 31 34 2E 34 36 35 2C 41 2C 41 2A 35 33 0D 0A 24 47 50 47 53 41 2C 41 B1 00 2C 33 2C 33 2C 36 2C 37 2C 31 31 2C 31 32 2C 31 33 2C 31 34 2C 31 38 2C 33 30 2C 33 32 2C 2C 2C 2C 31 2E 30 2C 2A 30 45 0D 0A 24 47 50 47 53 56 2C 33 2C 31 2C 31 30 2C 30 33 2C 33 38 2C B1 00 32 31 31 2C 33 32 2C 30 36 2C 34 33 2C 33 34 36 2C 33 38 2C 30 37 2C 31 34 2C 30 32 34 2C 33 31 2C 31 31 2C 30 35 2C 32 30 37 2C 33 32 2A 37 44 0D 0A 24 47 50 47 53 56 2C 33 2C 32 2C 31 B1 00 30 2C 31 32 2C 31 30 2C 32 31 30 2C 33 35 2C 31 33 2C 34 35 2C 32 38 32 2C 33 33 2C 31 34 2C 37 30 2C 33 31 35 2C 33 32 2C 31 38 2C 36 39 2C 32 35 35 2C 33 39 2A 37 46 0D 0A 24 47 50 47 B1 00 53 56
[25.01.2025 03:11:14.893] [E] [TID:131390211257584] [1230::DevImplLibUSB.cpp] [stripFTDIStatusBytes()] Invalid status byte at 384: 0xB1
[25.01.2025 03:11:14.898] [D] [TID:131390211257584] [1231::DevImplLibUSB.cpp] [stripFTDIStatusBytes()] Len=512: B1 00 24 47 50 47 47 41 2C 30 32 31 31 31 34 2E 34 36 35 2C 34 38 34 37 2E 31 37 37 2C 4E 2C 30 30 38 30 36 2E 37 34 39 2C 45 2C 31 2C 31 30 2C 31 2E 30 2C 31 32 32 2E 30 2C 4D 2C 2C 4D 2C 2C B1 00 2A 34 39 0D 0A 24 47 50 47 4C 4C 2C 34 38 34 37 2E 31 37 37 2C 4E 2C 30 30 38 30 36 2E 37 34 39 2C 45 2C 30 32 31 31 31 34 2E 34 36 35 2C 41 2C 41 2A 35 33 0D 0A 24 47 50 47 53 41 2C 41 B1 00 2C 33 2C 33 2C 36 2C 37 2C 31 31 2C 31 32 2C 31 33 2C 31 34 2C 31 38 2C 33 30 2C 33 32 2C 2C 2C 2C 31 2E 30 2C 2A 30 45 0D 0A 24 47 50 47 53 56 2C 33 2C 31 2C 31 30 2C 30 33 2C 33 38 2C B1 00 32 31 31 2C 33 32 2C 30 36 2C 34 33 2C 33 34 36 2C 33 38 2C 30 37 2C 31 34 2C 30 32 34 2C 33 31 2C 31 31 2C 30 35 2C 32 30 37 2C 33 32 2A 37 44 0D 0A 24 47 50 47 53 56 2C 33 2C 32 2C 31 B1 00 30 2C 31 32 2C 31 30 2C 32 31 30 2C 33 35 2C 31 33 2C 34 35 2C 32 38 32 2C 33 33 2C 31 34 2C 37 30 2C 33 31 35 2C 33 32 2C 31 38 2C 36 39 2C 32 35 35 2C 33 39 2A 37 46 0D 0A 24 47 50 47 B1 00 53 56 2C 33 2C 33 2C 31 30 2C 33 30 2C 30 34
[25.01.2025 03:11:14.898] [E] [TID:131390211257584] [1230::DevImplLibUSB.cpp] [stripFTDIStatusBytes()] Invalid status byte at 448: 0xB1
[25.01.2025 03:11:14.903] [D] [TID:131390211257584] [1231::DevImplLibUSB.cpp] [stripFTDIStatusBytes()] Len=512: B1 00 24 47 50 47 47 41 2C 30 32 31 31 31 34 2E 34 36 35 2C 34 38 34 37 2E 31 37 37 2C 4E 2C 30 30 38 30 36 2E 37 34 39 2C 45 2C 31 2C 31 30 2C 31 2E 30 2C 31 32 32 2E 30 2C 4D 2C 2C 4D 2C 2C B1 00 2A 34 39 0D 0A 24 47 50 47 4C 4C 2C 34 38 34 37 2E 31 37 37 2C 4E 2C 30 30 38 30 36 2E 37 34 39 2C 45 2C 30 32 31 31 31 34 2E 34 36 35 2C 41 2C 41 2A 35 33 0D 0A 24 47 50 47 53 41 2C 41 B1 00 2C 33 2C 33 2C 36 2C 37 2C 31 31 2C 31 32 2C 31 33 2C 31 34 2C 31 38 2C 33 30 2C 33 32 2C 2C 2C 2C 31 2E 30 2C 2A 30 45 0D 0A 24 47 50 47 53 56 2C 33 2C 31 2C 31 30 2C 30 33 2C 33 38 2C B1 00 32 31 31 2C 33 32 2C 30 36 2C 34 33 2C 33 34 36 2C 33 38 2C 30 37 2C 31 34 2C 30 32 34 2C 33 31 2C 31 31 2C 30 35 2C 32 30 37 2C 33 32 2A 37 44 0D 0A 24 47 50 47 53 56 2C 33 2C 32 2C 31 B1 00 30 2C 31 32 2C 31 30 2C 32 31 30 2C 33 35 2C 31 33 2C 34 35 2C 32 38 32 2C 33 33 2C 31 34 2C 37 30 2C 33 31 35 2C 33 32 2C 31 38 2C 36 39 2C 32 35 35 2C 33 39 2A 37 46 0D 0A 24 47 50 47 B1 00 53 56 2C 33 2C 33 2C 31 30 2C 33 30 2C 30 34
Ich würde mich freuen, wenn man damit den Fehler näher untersuchen und eventuell gar beheben könnte.