ASCII Ausgabe auf Commport (/devttyS0) nur mit Warteschleife???? (usleep)



  • Hi @all,
    habe folgendes Problem.
    Ich versuche ein Programm zu schreiben das ASCII Zeichen über den seriellen Port an einen High-Level Grafikkontroller schickt. Der wiederum ist mit einem 240x128 Pixel LCD verbunden.
    Für die Ausgabe von Text und Grafik erwartet der Kontroller an seinem Commport Befehle wie unten beschrieben. Im Eintelschrittmodus oder mit usleep ist das kein Problem. Wenn ich aber usleep rausnehme verschwinden ganze Buchstaben oder er zeigt nichts an. Was manchmal noch schlimmer ist, das Display erhält die abschließende NULL (nur bei dem Befehl Z für ganze Zeichenketten erforderlich)
    scheinbar nicht und geht in einen Terminalmodus. Befehle werden ingnoriert und nur ein Hardwarereset bringt es wieder zum komunizieren.

    Die ganze Geschichte hatte ich schon unter WINDOWS mit Visual Basic zum laufen bekommen und dort mit dem MSCommcontrol gearbeitet. Da gingen die Daten so schnell wie der Port es zuließ an das Display. Ohne irgendwelche Warteschleifen!

    Ich denke hier liegt das Problem eher bei der Einstellung des Ports!
    Unter Windows konnte ich mit RTS und CTS arbeiten
    Sobald ich das mit stty crtscts >/dev/ttyS0 aktiviere,
    passiert nichts mehr am Display. Auch das Programm wartet geduldig!
    Der Hersteller des Controllers schreibt das die Handshakeleitungen zur Verfügung stehe....
    Das Programm schreibe ich mit Borlands cbuilderx.

    Wo kann das Problem liegen???

    /* --------------------- test.c --------------------- */

    #include <stdio.h>
    #include <unistd.h>

    int main()
    {
    FILE * port;

    port = fopen( "/dev/ttyS0", "w+" ); //Öffnen des Ports zum Schreiben
    if ( port == NULL )
    {
    perror( "fopen" ); return ( 1 );
    }
    printf("Beginne zu senden\n");

    fprintf( port, "%c%c%c%c", 'T', 'R', 3, 1 );//Text Modus einstellen, nach rechts, setzen, muster 2(schwarz)
    fflush( port );
    usleep(100000); // 😞 warte...warte...

    fprintf( port, "DL" ); //Lösche Display
    fflush( port );
    usleep(10000);

    fprintf( port, "%c%c%c%c%c", 'N', 0, 0, 240, 20 ); //Zeichne Rundeck 240x20
    fflush( port );

    fprintf( port, "%c%c%c%c", 'F', 3, 1, 1 ); // formatiere Schriftfont und Zoom
    fflush( port );
    usleep(100000);

    fprintf( port, "%c%c%c%s%c", 'Z', 41, 2, " Der Teststring! ", 0 ); //Sende Teststring
    fflush( port );

    fclose( port );
    return ( 0 );
    }

    /* ------------------ end of test.c ------------------ */

    stty configuration:

    speed 9600 baud; rows 0; columns 0; line = 0;
    intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;
    eol2 = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W;
    lnext = ^V; flush = ^O; min = 1; time = 0;
    -parenb -parodd cs8 hupcl cstopb cread clocal -crtscts
    -ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff
    -iuclc -ixany -imaxbel
    opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
    isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt
    echoctl echoke



  • ich hab das immer so gemacht:

    static int open_serial_port (void) {
    
            // Schnittstelle oeffnen: lesen+schreiben, wird nicht unser
            // "controlling tty", nicht-blockierend
            int port_fd = open (com_device, O_RDWR | O_NOCTTY | O_NONBLOCK);
    
            if (port_fd == -1) {
                    cerr << ">> error while opening serial port";
                    return (port_fd);
            }
    
            // Platz fuer Einstellungen des seriellen Ports
            struct termios our_settings;
    
            // aktuelle Einstellungen des Ports abfragen
            if (tcgetattr (port_fd, &saved_settings) != 0)        {
                    cerr << ">> error while checking port-parameters";
                    return (-1);
            }
    
            // Einstellungen kopieren
            our_settings = saved_settings;
    
            // Eingabe-Geschwindigkeit setzen
            cfsetispeed (&our_settings, B9600);
    
            //// Ausgabe-Geschwindigkeit setzen
            cfsetospeed (&our_settings, B9600);
    
            // raw-Modus anschalten -> 8Bit, keine Paritaet, 1 Stopbit, keine
            // Flusskontrolle, keine Verarbeitung spezieller Zeichen
            cfmakeraw (&our_settings);
    
            // Einstellungen uebernehmen, jetzt!
            if (tcsetattr (port_fd, TCSANOW, &our_settings) != 0) {
                    cerr << ">> error while setting port-parameters";
                    return -1;
            }
    
            return (port_fd);
    
    }
    

Anmelden zum Antworten