Forum: PC-Programmierung Serielle Schnittstelle unter Linux Kernel 2.6


von Klaus K. (yildi)


Lesenswert?

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!
1
 JNIEXPORT void JNICALL Java_guf_android_hardware_uart_ControlLines_setRTSNative
2
(JNIEnv *env, jobject obj, jint fileDescriptor) {
3
4
  int currentStatus, ret;
5
  ioctl(fileDescriptor, TIOCMGET, &currentStatus);
6
  currentStatus |= TIOCM_RTS;
7
  ioctl(fileDescriptor, TIOCMSET, &currentStatus);
8
}

von Imon (Gast)


Lesenswert?

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)

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Imon schrieb:
> Eins Vorweg ich kenne JNI nicht, außer als Bussword ;-)
JNI:
http://de.wikipedia.org/wiki/Java_Native_Interface

Imon 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.

von MicroSD (Gast)


Lesenswert?

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?

von Klaus K. (yildi)


Lesenswert?

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 :)

von Imon (Gast)


Lesenswert?

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.
1
 ret=ioctl(fileDescriptor, TIOCMGET, &currentStatus);
2
 if ( ret == -1 ) {
3
         perror("IOCTL TIOCMGET");
4
 }

von foofighter (Gast)


Lesenswert?

> 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.

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.