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ß
mach dir ganz wenig Arbeit und schau mal links in die Artikel...
@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
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
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
@ 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
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
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.
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
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
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
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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.