(Linux/Unix) Hilfe fuer Zugriff von /dev/ttyS1 unter Linux gesucht
-
Hallo,
ich sitze hier vor einem uralten Kassettenschreibgerät, für welches
ich ein, unter DOS geschriebenes, C-Programm auf Linux umbasteln soll.
Auf die Kassetten werden Bohr- und Fräsprogramme geschrieben, die dann
an CNC-Maschinen genutzt werden.Das Problem ist, daß ich erstens ein C-Laie bin und zweitens der
Datenstrom beim Schreiben auf /dev/ttyS1 abolut konstant geliefert
werden muß. "A transmission break or more than 1 stop bit are not
allowed".Ein einfaches Umschreiben des Programmes auf Linux-C ( die DOS-Version
kennt noch outp(port,int), während ich nun outb(int,port) benutze... )
bringt nichts. Das Kassettengerät fängt noch nicht einmal an mit Spulen.
Egal, was ich mit direkter Portprogrammierung anfange ( ioperm ist vorher
ausgeführt, Programm läuft testweise als root ), nix tut sich. Frühere Versuche, das Programm auf Windows zu portieren, scheiterten auch. Wahrscheinlich wegen der Synchronisationsprobleme von Schnittstelle und Kassettenschreiber.Kann sich ein kundiger Schnittstellenprogrammierer mal bitte den
Teil des alten Programmes anschauen? Ich hoffe mal, ich habe das richtig
kommentiert ( Programm war leider unkommentiert ).-----8<-----8<-----8<-----8<-----<8-----
outb(0x80,0x2fb); // LCR - setze DLAB outb(0x0c,0x2f8); // setze Baudrate... outb(0x00,0x2f9); // ...auf 9600 outb(0x03,0x2fb); // LCR - setze 8 Bit, 1 Stoppbit outb(0x01,0x2fc); // MCR - setze DTR for (x=0;x<length;x++) // schreibe jedes Zeichen aus dem Puffer { outb(block[x],0x2f8); // an /dev/ttyS1 while ((inb(0x2fe)&0x11)!=0x01); // MSR - warte, bis DCTS gesetzt }
-----8<-----8<-----8<-----8<-----<8-----
Da ich mit direktem Ansrechen der Ports nichts erreiche, habe ich
das unter Linux nun anders versucht.-----8<-----8<-----8<-----8<-----<8-----
porthandle=open("/dev/ttyS1",O_RDWR|O_NOCTTY|O_NDELAY); // Port öffnen fcntl(porthandle,&options); cfsetispeed(&options,B9600); // setze Baudrate cfsetospeed(&options,B9600); cfsetispeed(&options,CS8); // setze 8 Bit, 1 Stoppbit cfsetospeed(&options,CS8); for (x=0;x<length;x++) { write(porthandle,block[x]); } close(porthandle);
-----8<-----8<-----8<-----8<-----<8-----
Das Programm sorgt schonmal dafür, daß das Bandlaufwerk anfängt mit
Schreiben. Allerdings ist alles in Windeseile auf Kassette geschrieben
( es fehlt ja auch die while-Schleife, die wartet, bis das Bit
"delta clear to send" gesetzt ist ) und die Kassette ist nicht lesbar.Kann mir jemand sagen, wie ich das erledige, ohne Ports anzusprechen?
Wie kann ich die while-Schleife umschreiben?
Hat sonst vielleicht jemand Erfahrung mit solchen Kassetten-Schreib-
geräten?Es wäre schön, wenn mir jemand auf die Sprünge helfen könnte.
Danke und einen schönen Tag noch.
Sirko