(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


Anmelden zum Antworten