www.mikrocontroller.net

Forum: PC-Programmierung Serielle Schnittstelle unter Linux Kernel 2.6


Autor: Klaus Kanone (yildi)
Datum:

Bewertung
0 lesenswert
nicht 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!
 JNIEXPORT void JNICALL Java_guf_android_hardware_uart_ControlLines_setRTSNative
(JNIEnv *env, jobject obj, jint fileDescriptor) {

  int currentStatus, ret;
  ioctl(fileDescriptor, TIOCMGET, &currentStatus);
  currentStatus |= TIOCM_RTS;
  ioctl(fileDescriptor, TIOCMSET, &currentStatus);
}

Autor: Imon (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: MicroSD (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Klaus Kanone (yildi)
Datum:

Bewertung
0 lesenswert
nicht 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 :)

Autor: Imon (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
 ret=ioctl(fileDescriptor, TIOCMGET, &currentStatus);
 if ( ret == -1 ) {
         perror("IOCTL TIOCMGET");
 }

Autor: foofighter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.