Moin!
Ich möchte auf einem embedded System, auf dem Android 2.2 läuft, die
serielle Schnittstelle unter Java nutzen. Deshalb benutze ich das JNI.
Bislang funktioniert auch alles ganz gut, nur habe ich nun folgendes
Problem. Ich möchte Zugriff auf die Steuerleitungen bekommen, was
eigentlich mit dem unten stehenden c Schnipsel funktioniert (in diesem
Fall RTS setzen). Das Problem ist, dass dieses Vorgehen nur bis zum
Linux Kernel 2.4 funktionierte. Android basiert allerdings auf Version
2.6. Weiss jemand, wie es nun funktioniert? (Zur Zeit erhalte ich als
Rückgabewerte der ioctl() immer -1, wenn ich mir diese ausgeben lasse.)
Vielen Dank für Eure Hilfe!
Eins Vorweg ich kenne JNI nicht, außer als Bussword ;-)
Ich versuche Java zu vermeiden!
Die ioctls welche du nutz sollten auch unter den 2.6 Kernel gehen, sie
sind jedenfalls nicht Obsolete oder so, daher vermute ich mal das der
Fehler ausserhalb des schnippsel Codes liegt welchen du und gesendet
hast. Ein heißer Kandidat ist zum Beispiel der fileDescriptor. Wenn der
nicht auf eine TTY Zeigt kommt es zu denn Verhalten das du beobachtest.
Außerdem hat dein Filediscriptor denn Type jint, ist der zum c int
Kompatible (Breite, Endianness, etc) oder kann es sein das es durch den
für ioctls nüblichen Datentypen zum Problem kommt.
Weiter könnte es sein das die Serielle Schnittstelle unter dein Embedded
system nicht ttyS0 heißt sondern anderes( ttyAM0, wäre zum Beispiel
möglich)
Imon schrieb:> Eins Vorweg ich kenne JNI nicht, außer als Bussword ;-)
JNI:
http://de.wikipedia.org/wiki/Java_Native_InterfaceImon schrieb:> jint, ist der zum c int> Kompatible (Breite, Endianness, etc)
Das passende Headerfile sollte das zumindest passend definieren.
Trotz allem bietet es sich an, bevor man das ganze einbettet sich ein
"normales" C Programm zu schreiben.
P. D. schrieb:> Ich möchte auf einem embedded System,
[...]
> Das Problem ist, dass dieses Vorgehen nur bis zum> Linux Kernel 2.4 funktionierte. Android basiert allerdings auf Version> 2.6.
Selbe Hardware, 2.4 geht, 2.6 (+Android) nicht?
Welcher Serielle Port? (µC-Intern?)
Hat der Port überhaupt RTS/CTS, oder wurde das unter 2.4 per GPIO
gemacht?
Weiß der 2.6er Treiber das, und hat die richtigen GPIOs dafür
konfiguriert?
Imon schrieb:> Außerdem hat dein Filediscriptor denn Type jint, ist der zum c int> Kompatible (Breite, Endianness, etc) oder kann es sein das es durch den> für ioctls nüblichen Datentypen zum Problem kommt.
Ja zu Beginn habe ich immer umgecastet, bis ich gemerkt hab, dass man
sich das sparen kann. In diesem Fall hat das keine Wirkung (Gilt aber
zum Beispiel nicht für char, jchar ist doppelt so breit wie char).
Imon schrieb:> Weiter könnte es sein das die Serielle Schnittstelle unter dein Embedded> system nicht ttyS0 heißt sondern anderes( ttyAM0, wäre zum Beispiel> möglich)
Das habe ich natürlich bedacht, die heisst tatsächlich ttymxc1. Lesen
von und schreiben auf die Schnittstelle funktioniert ja wunderbar
(Software Handshake), daran wirds also nicht liegen.
Läubi .. schrieb:> Das passende Headerfile sollte das zumindest passend definieren.> Trotz allem bietet es sich an, bevor man das ganze einbettet sich ein> "normales" C Programm zu schreiben.
Habe ich auch gemacht, selbes Ergebnis. Ich erhalte als Rückgabewert des
ersten ioctl immer -1 zurück.
MicroSD schrieb:> Selbe Hardware, 2.4 geht, 2.6 (+Android) nicht?>> Welcher Serielle Port? (µC-Intern?)> Hat der Port überhaupt RTS/CTS, oder wurde das unter 2.4 per GPIO> gemacht?> Weiß der 2.6er Treiber das, und hat die richtigen GPIOs dafür> konfiguriert?
Das kann ich nicht genau sagen, sondern habe es nur gelesen. Ich habe
kein System mit einem älteren Kernel aufgesetzt. Die Arbeit wollte ich
mir vorerst sparen. Dann bleibt mir wohl nicht anderes übrig, als mich
durch die verschiedenen Layer der Treiber durchzuarbeiten. Das werde ich
mal versuchen und sehen was passiert :)
P. D. schrieb:> Läubi .. schrieb:>> Das passende Headerfile sollte das zumindest passend definieren.>> Trotz allem bietet es sich an, bevor man das ganze einbettet sich ein>> "normales" C Programm zu schreiben.>> Habe ich auch gemacht, selbes Ergebnis. Ich erhalte als Rückgabewert des> ersten ioctl immer -1 zurück.
Hast du mal den errno wert ausgewertete, dann wissen wir wenigsten warum
der ioctl meint schief gehen zu müssen.
> Ich möchte auf einem embedded System, auf dem Android 2.2 läuft, die> serielle Schnittstelle unter Java nutzen.
Falscher Ansatz. Nimm rxtx, das ist fertig.