Wortlänge bei RS232 Ansteuerung

Dieses Thema: "Wortlänge bei RS232 Ansteuerung" im Forum "Programmieren allgemein" wurde erstellt von DCr33P, 05.08.2006.

  1. DCr33P

    DCr33P Grünschnabel

    Dabei seit:
    01.03.2006
    Beiträge:
    8
    Zustimmungen:
    0
    Hallöle

    Habe in der letzten Zeit ein kleines C Prog geschrieben was die serielle Schnittstelle
    unter Linux ansteuert. Da ich in solchen Dingen generell nicht viel Erfahrung habe, stehe ich nun vor einem Problem... Ich muss nämlich über RS232 ein Gerät ansteuern, welches bestimmte Codes empfängt. Ein Code hat immer die Länge von 11 bits. Jedoch kann ich mit termios nur eine maximale Wortlänge von 8 bit einstellen(term_param.c_cflag |= CS8. Löst man so etwas indem man 2 Wörter hintereinander schickt? geht das so einfach? Wenn ich eine Wortlänge von 8bit habe dann habe ich danach auch ein Stop bit und bestimmt noch irgendwelche Kontrollzeichen. Wie kann ich dann ganz einfach 11 bits hintereinander rüber schieben?
    Wäre über Hilfe sehr dankbar...brauche nen Schubser in die richtige Richtung
     
  2. Anzeige

    Schau dir mal diesen Ratgeber an. Viele Antworten inkl. passender Shell-Befehle!
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 hazelnoot, 05.08.2006
    Zuletzt bearbeitet: 05.08.2006
    hazelnoot

    hazelnoot www.mywm.dl.am

    Dabei seit:
    13.10.2005
    Beiträge:
    377
    Zustimmungen:
    0
    Ort:
    in Geiersberg
    hi!

    warum machs es nicht einfach so mit lowlevel dateioperationen:

    output = open("/dev/ttyS0", O_WRONLY); /*com1 zum schreiben oeffnen*/

    und dann schreibst das mit write raus:
    write(floppy_fd, arrayVollBytes, anzahlDerZuSendenden bytes);

    dann kannst genau 11 bytes verschicken!

    genaue syntax von write:
    ssize_t write(int filedeskriptor, void *daszusendende, size_t anzahlderzusendendenbytes);

    hoffe dass ich dir weiterhelfen konnte!

    mfg hazelnoot

    /*edit*/
    ups hab gerade gesehen dass du 11bits meinst nicht elf bytes... tschuldigung mein fehler! tja waenn das so ist probiers einfach mal so bau dir deine bits so zusammen dass du in den ersten/letzen 11 deine daten drinnenstehen hast die du willst und dann schicks einfach mal... denk mal dann ignoriert dein geraet die anderen bytes... soweit kann ich mir das mal vorstellen
     
  4. DCr33P

    DCr33P Grünschnabel

    Dabei seit:
    01.03.2006
    Beiträge:
    8
    Zustimmungen:
    0
    Vielen Dank für Hilfe!

    Aber ein Wort hat eine maximale Länge von 8 bits also ein Byte.
    Wenn ich mit write(...) 2 Bytes sende, dann habe ich quasi 16 bits, also 5 bits mehr als ich brauche. Dann kann ich die ersten 8 von 11 bits im ersten Wort senden und die restlichen 3 bits am Anfang des zweiten Wortes senden... Die Frage ist wie diese 8 + 3(+5 Nullen) bits dann übertragen werden; Direkt hintereinander so dass beide Wörter zusammenschmelzen oder getrennt mit irgendwelchen Steuerbits ?
     
  5. #4 Wolfgang, 05.08.2006
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Hallo
    Ich habe wenig Kenntnisse mit C, aber:
    Wie wär es, wenn du vorher ein logisches UND mit den überzähligen Bits als Maske auf den Wert anwendest?

    Gruß Wolfgang
     
  6. theton

    theton Bitmuncher

    Dabei seit:
    27.05.2004
    Beiträge:
    4.820
    Zustimmungen:
    0
    Ort:
    Berlin, Germany
    Ich denke, dass eine solche Ansteuerung wesentlich besser ueber ein Kernel-Modul loesbar ist und nicht im Userspace gemacht werden sollte. Da kannst du naemlich die komplette Ansteuerung selbst machen. Evtl. koennte auch http://rt-com.sourceforge.net/ als Schnittstelle etwas fuer dich sein. Im Userspace hast du immer das Problem, dass du quasi ein Terminal/Serial-Device ansprichst. Ausserdem darfst du dort nicht ausser acht lassen, dass du mit 7 Bit (+ ein Paritaetsbit) arbeiten musst. Die serielle Schnittstelle unterstuetzt nunmal nur 8 Bit. Du kannst also nicht 11 Bit an die serielle Schnittstelle senden ohne dass dir das Paritaetsbit dazwischen funkt.
    Schau dir z.B. mal den Axis Bluetooth-Treiber an http://developer.axis.com/software/bluetooth/ in dem u.a. auch die serielle Schnittstelle angesteuert wird. Oder nimm dir das serial-Modul aus dem Kernel und modifiziere es entsprechend. Wenn du denoch im Userspace arbeiten willst, findest du gute Beispiele auf Captains Homepage:
    http://www.captain.at/rtai-serial-port-example.php
    http://www.captain.at/programming/rtai/serportint.php
    http://www.captain.at/rtai-rtdm-serial-port-example.php
     
  7. DCr33P

    DCr33P Grünschnabel

    Dabei seit:
    01.03.2006
    Beiträge:
    8
    Zustimmungen:
    0
    Danke für die Links :)
    Finde das Konzept von diesem Real Time Com Treiber ganz interessant, wobei ich es so verstanden habe dass es die Idee ist eine "Echtzeit" serielle Kommunikation herzutellen ohne dass irgendwelche anderen Prozesse dazwischenfunken. Das Interface von rt_com bietet ja "nur" die normalen read, write etc. Funktionen an. Damit habe ich das Problem immernoch nicht gelöst...
    So wie ich dich verstanden habe wird es dann wohl drauf hinauslaufen müssen dass ich den RS232 Treiber verändere um eine größere Wortlänge senden zu können...
    Das Gerät mit dem ich kommunizieren muss ist ein X10 Modul. Laut Spezifikation hat es eine RS232 Schnittstelle, also sollte ich auch mit dem Standart RS232 Protokoll mit ihm Verbindung aufnehmen können. Frage mich nur warum die ein "Kommando" von 11 bits gewählt haben...
     
  8. theton

    theton Bitmuncher

    Dabei seit:
    27.05.2004
    Beiträge:
    4.820
    Zustimmungen:
    0
    Ort:
    Berlin, Germany
    Eben genau wegen dieser seltsamen Wortlaenge wuerde ich dir empfehlen den serial-Treiber zu modifizieren, da du dann z.B. das Paritaetsbit umgehen kannst, so dass du das Wort auf 2 write() aufteilen kannst ohne dass dir ein nicht-relevantes Bit dazwischen kommt. Willst du allerdings sicherstellen, dass die Daten auch korrekt an das Geraet gesendet wurden, solltest du zumindest nach jedem Kommando ein Paritaetsbit einfuegen, also bei jedem zweiten Senden von Daten an das Geraet.
     
  9. tr0nix

    tr0nix der-mit-dem-tux-tanzt

    Dabei seit:
    11.07.2003
    Beiträge:
    1.585
    Zustimmungen:
    0
    Ort:
    Schweiz, Opfikon/Glattbrugg
    Mh ich kenn mich so auf der Digitalen Ebene nicht so aus, aber wie machst du ein Wort mit einem Byte? Damit kannst du ja gerademal einen ASCII Buchstaben abbilden? Oder ist "Wort" hier in einem anderen Kontext?
     
  10. theton

    theton Bitmuncher

    Dabei seit:
    27.05.2004
    Beiträge:
    4.820
    Zustimmungen:
    0
    Ort:
    Berlin, Germany
    Wort ist hier im Kontext eines einzelnen Kommandos zu sehen. Es wird ein String mit 11 Bits (hier als Wort bezeichnet) als Kommando an das anzusteuernde Geraet uebermittelt.
     
Thema:

Wortlänge bei RS232 Ansteuerung

Die Seite wird geladen...

Wortlänge bei RS232 Ansteuerung - Ähnliche Themen

  1. Passwortlänge ändern

    Passwortlänge ändern: Hallo zusammen, ich habe hier einen Server (SLES9), bei dem das Passwort nach der 8. Stelle abgeschnittten wird. Wir brauchen aber mindestens...
  2. suchfunktion - wortlänge?

    suchfunktion - wortlänge?: ist es möglich, die wortlänge der suchfunktion nicht auf min. 4 buchstaben zu begrenzen? es gibt ja auch kürzere wörter ;)
  3. RS232 ansprechen c't

    RS232 ansprechen c't: Hallo zusammen, vielleicht habt ihr auch schon vom neuen c't artikel gehört, in dem ein router mit einer neuen firmware geflasht wird....
  4. RS232 Schnittstelle Weiterleiten

    RS232 Schnittstelle Weiterleiten: Hallo Leute, Ich habe einen Kommunikationsserver SuSE10.0. An diesem ist an ttyS0 ein Interface zur Telefonanlage, die ich per minicom...
  5. Daten (RS232 Text-Stream) anhand dreier Zeilenenden filtern

    Daten (RS232 Text-Stream) anhand dreier Zeilenenden filtern: Hallo Ein Bash-Problem: Ich schreibe Daten von der RS232 Schnittstelle mit - auf das sendende Gerät habe ich keinen Einfluss. Leider wird kein...