PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wortlänge bei RS232 Ansteuerung



DCr33P
05.08.2006, 18:52
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

hazelnoot
05.08.2006, 19:13
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

DCr33P
05.08.2006, 22:49
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 ?

Wolfgang
05.08.2006, 23:57
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

theton
06.08.2006, 03:23
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

DCr33P
07.08.2006, 12:51
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...

theton
07.08.2006, 13:09
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.

tr0nix
07.08.2006, 17:19
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 ?
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?

theton
07.08.2006, 17:23
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.