Forum: Mikrocontroller und Digitale Elektronik Linux und serielle Schnittstelle


von Jan (Gast)


Lesenswert?

Ich will mit meinem Bord auf dem ein embbeddet Linux läuft die Serielle
Schnittstelle ansprechen.
Habe bei google gesucht und den Stichworten:
- Linux rs232 code
-embedded Linux
- Linux UART

da ich mir möglichst wenig Arbeit machen will und bestimmt schon
hunderte diese Problem gelößt habe such ich irgendwelchen Code mit dem
ich Strings ausgeben kann und dannach die Antwort einlesen kann.
Hat jemand eine Idee wie ich die Suchbegriffen ändern sollte das ich so
was finde?
Gruß

von Wolfram (Gast)


Lesenswert?

mach dir ganz wenig Arbeit und schau mal links in die Artikel...

von andreas (Gast)


Lesenswert?

@jan: was für ein board benutzt du? hast du ein tutorial zu dem board?
will mich demnächst auch mit embedded linux beschäftigen, nur finde ich
nicht so recht den einstieg

von Michael K. (onkel_michi)


Lesenswert?

Hallo Jan,

bei Linux ist es egal, wo drauf das läuft.

Wenn Dein embedded Board eine RS232 Schnittstelle hat, dann wird die
unter /dev/ttySX (X = 0 -16) liegen. Wenn Du die als User benutzen
willst denn musst Du die Rechte der Schnittstelle mit chmod a+rw
/dev/ttySx ändern.

Zum Ausprobieren kannst Du auch mit minicom mal auf die serielle
Schnittstelle zugreifen und ausprobieren, ob das klappt.

Vorher mal mit setserial die Parameter der Schnittstelle einstellen.

Meine bescheidenen Erfahrungen mit embedded Linux beschränken sich auch
nur auf einen WRT 54 GS Router von Linksys.

Michael

von Felix (Gast)


Lesenswert?

Hi ich will auch eine Serielle Schnittstelle ansprechen und auch dann
etwas mehr hintergrundwissen erlangen.
Also gibt es dafür gute Literatur oder Webseiten?
Es scheint ja von Linux zu Linux unterschiede zu geben, z.B. setserial
kennt mein Board nicht als Befehl...

Gruß
Felix

von .,., (Gast)


Lesenswert?

@Felix - was für ein Board (X86, Mips, Arm), was für ein Linux

von Olaf (Gast)


Lesenswert?

man termios

Olaf

von Sven (Gast)


Lesenswert?

@ Felix: Wurde  oben schon beantwortet;
wenn ein Embedded Linux läuft ist es wie ein Linux und es finden sich
auch die Schnittstellen genauso im System.

Wenn z.B. ein setserial fehlt, wird das aus Gründen von Platz sparen
gemacht, es ist also einfach nicht im System eingebunden.

Compilierst Du aber ein Programm für Deine Zielplattform, kannst Du mit
dem z.b. C-Programm alles einstellen (Schnittstellen Parameter,
etc....)

Gruß Sven

von Bobo (Gast)


Angehängte Dateien:

Lesenswert?

ich programmiere grade auch eine serielle Schnittstelle unter Linux.
da ich damit Probleme habe und hier viele sind die Ahnung haben
probiere ich es hier in diesem Thread da es ja irgendwie passt: "Linux
und serielle Schnittstelle" fehlt  nur noch "Problem" ;-).

Also ich habe mich an"Serial Programming Guide for POSIX..."
orientiert und an diversen anderen Quellen.

ich habe einen Coldfireprozessor mit passenden Crosscompiler, so dass
es wohl am Code liegt. (oder an der sonstigen Hardware)
-RxD und TxD sind verbunden.

Fehlermeldung bei mir "SERIAL EAGAIN ERROR". so weit wie ich es
verstehe ist das Problem das nichts gelesen wird.

Hat jemand eine Idee was ich machen kann? bin mittlerweile etwas
ratlos.

Gruß Bobo

von Marco S. (masterof)


Lesenswert?

abo

von Thorsten (Gast)


Lesenswert?

Hallo.

Ein EAGAIN ist kein Fehler im klassischen Sinne. Es ist einfach nichts
auf der seriellen Schnittstelle angekommen, was gelesen werden könnte.
Da Du die serielle Schnittstelle im non-blocking Modus betreibst kommt
der read() mit einem EAGAIN zurück, anstatt auf ein Zeichen zu warten.

von Johann Fischer (Gast)


Lesenswert?

Hallo Bobo,

du kannst eigentlich ganz einfach überprügen ob die serielle
Schnittstelle überhaupt funzt mit 'cat datei > /dev/ttySX' (oder
anstat cat echo 12345) wenn was an der gegenstelle ankommt ist gut.
genauso empfangen mit 'cat /dev/ttySX'.

mfg
JOhann

von Bobo (Gast)


Lesenswert?

Hi
danke euch alles für die Hilfe. Nach einigen hin und her bin ich auf
ttyS1 ausgewichen und siehe da es geht jetzt. Das Terminalprogramm
zeigt mir alles an was ich sende, na ja fast alles.

Hier ist nun ein weiteres Problem:
in writeport: "chars[len+1] = 0x00; // terminate the string
properly"
somit wir jeder String den ich sende abgebrochen sobald 0x00 gesendet
wird. auch wenn ich die Zeile rausnehme und und readport die Zeile:
"result[iIn-1] = 0x00;" wird abgebrochen sobald 0x00 gesendet wird.
für mich ist es aber nicht möglich da drauf zu verzichten da der Sensor
mit dem kommuniziert werden dieses im Anmeldestring erwartet.

Ich weiß nicht mehr genau wo ich das gelesen habe aber irgendwo gab es
den Tip Zeichen kleiner 20 ein 0x1b voranzustellen damit es nicht als
Steuerzeichen interpretiert wird:
- Der string wird trotzdem abgebrochen
- Der sensor ist nicht in der Lage das 0x1b heraus zu interpretieren
Also geht das nicht. Die Escape Zeichen Methode scheidet somit aus.
auch die definition eines nicht benutzen zeichens scheidet aus da der
Sensor dieses nicht senden würde.

Also was kann ich tun? Hat jemand eine Idee wie ich den Code ändern
muss?

was ich jetzt erstmal als Idee verfolge ist einen Strng von fest
definierter Länge mit synchronisation am Anfang, vielleicht klapps ja

so on Bobo

von Bobo (Gast)


Lesenswert?

Nachtrag zum vorherigen Posting: mit fest definerter Länge gehts, jetzt
noch das lesen anpassen und ich bin glücklich ( Bis zum nächsten
Problem)

Aber nun erstmal
schönes Wochenende euch allen

von Wiesi (Gast)


Lesenswert?

Ich würde dir außerdem noch raten, dass du bei der Initialisierung der
seriellen Schnittstelle auch das options.c_cc array richtig setzt. Da
kann man unter anderen einstellen, ob ein read blocken soll, bis
zeichen eintreffen, wieviele eintreffen müssen, wie lange gewartet wird
usw.

Hier kann ich nur auf:
http://www.faqs.org/docs/Linux-HOWTO/Serial-Programming-HOWTO.html
unterpunkt  Non-Canonical Input Processing verweisen.
Denn wenn du das nicht selbt einstellst, dann kann es sein, dass
vorheer ein anderes Programm die Schnittstelle nicht zurückgesetzt hat,
und dass funktionierts nicht. (Wahrscheinlich ist das auch der Grund,
warum's auf der anederen seriellen nicht geht.)

   Wiesi

von Bobo (Gast)


Lesenswert?

Danke für den Tip mit dem cc-array. Es hat etwas gedauert bis ich wieder
Zeit dafür gefunden habe aber nun habe ich mich wieder etwas damit
beschäftigt.
Das blieb aber leider nicht ohne Probleme.

Bei der Funktion writeport wird an den String noch die 2 Zeichen
<CR>(0x0d) und 0x00 hinzu gefügt. Diese sind Notwendig damit das
Stringende erkannt wird. Für mich ist es aber total üngünstig das 0x00
als Terminierungszeichen erkannt wird.
Sicherlich kann man dieses ändern das z.B 0xaa diese Aufgabe übernimmt.
Jetzt ist nur die Frage wo mach ich es?
Im cc-Arry gibt es ja auch "options.c_cc[VEOL] = 0;/* '\0'End of
line*/"
hier habe ich das =0 in =0xaa geändert aber dennoch war 0x00 das
terminierungszeichen.

Kann es sein das ich so wie so einen gedanklichen Fehler drin habe und
in Canonical Modus programmiere wobei für mich der Non-Canonical-Modus,
da ich die Anzahl der Zeichen die ankommen kenne besser wäre?


Grüß
Bobo

von Bobo (Gast)


Lesenswert?

PS: hat von euch jemand ggf. ein Beispiel wie ich mit der seriellen
Schnittstelle ohne die Steuerzeichen lesen und schreiben kann?
Ziel ist es das ich an einen Sensor ein String schicke und die Antwort
eingelesen werden kann.
Mit dem Code bekomme ich es nur hin das ich wenn ich Txd und Rxd
verbind das Echo wieder einlesen kann...

wenn ich das an den Sensor anschließe funktioniert es schon nicht
mehr...
Gruß Bobo

von Stephan (Gast)


Lesenswert?

Hallo,

ich möchte gerne einen Atmega8 Platine  mit 16 MHz Quarz mit der 
NSLU2(Unslung) NAS/Linux über die "serielle" Schnittstelle verbinden.

bisher geht :

(bin root)

Atmega8 (16 MHz Quarz) mit PC verbunden. Textausgabe auf Hyperterminal 
+/Pegelwandler
Die Baudrate wurde bei beiden auf 9600 Baud eingestellt. funktioniert

NSLU2(Unslung) NAS mit PC verbunden (interne Schnittstelle) . 
Textausgabe auf Hyperterminal    +/Pegelwandler
Die Baudrate wurde im Hyperterminal auf 115000 Baud eingestellt. 
funktioniert

Frage:
Wie bekomme ich nun die Baudrate der NSLU2 auf 9600 Baud ??
gewünschtes "Programm" : setserial

die Eingabe von : setserial /dev/ttyS0 -a brachte folgendes u.a.
baud_base  921600
divisor 0


die Eingabe von : setserial /dev/ttyS0 divisor 96 brachte folgendes u.a.
baud_base  921600
divisor 96

wobei die Ausgabe am Hyperterminal wiederum nur mit 115000 lief,statt 
wie erwartet mit 9600 Baud

spd_cust brachte keine Änderung

den Quarz wechseln geht nicht, da kein anderer zur verfügung steht.


gelesen Absatz 12.3 :
http://www.linuxhaven.de/dlhp/HOWTO/DE-Modem-HOWTO-12.html
ist gut erklärt, aber funktioniert nicht bzw. hab ich nicht richtig 
verstanden


über eine Hilfe würde ich mich freuen
Stephan

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.