PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ASCII Ausgabe auf Commport (/devttyS0) nur mit Warteschleife???? (usleep)


jogi67
06.05.2004, 12:19
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.:mauer:

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


FireBird2002
06.05.2004, 17:50
Google mal nach dem Serial Programming Howto, das gibt's leider nicht (mehr) überall. da sind 3 Möglichkeiten zur Komubnikation beschrieben...

P.S.:Benutz beim nächsten Mal Code-Tags. Manche Leute mögen das nicht.