In der Init() wird die Schnittstelle zum Schreiben geöffnet. Möchtest Du lesen und schreiben, dann wird entweder
Code:
fd = open(MODEMDEVICE, O_WRONLY | O_NOCTTY);
.
.
.
newtio.c_cc[VMIN] = 1; /* blocking read until 1 chars received */
gegen
Code:
fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY);
.
.
.
.
newtio.c_cc[VMIN] = 0; /* blocking read until 1 chars received */
getauscht oder du öffnest die Schnittstelle ein zweites Mal nur zum lesen. Die zweite Änderung (newtio.c_cc[VMIN] = 0; ) braucht es dann aber trotzdem, damit
das Programm nicht beim Read blockiert wird, wenn nichts kommt. Dafür steigt dann durch das ständige Einlesen der UART die Prozessorlast.
Die Init(); Sub habe ich im Internet gefunden und da sie funktionierte, habe ich sie so belassen. Möglich, dass diese noch optimiert werden kann. Bei C werden überwiegend nur
die Adressen statt der Inhalte der Variablen übergeben. Es wird also die Schnittstelle geöffnet und die Adresse in fd zurückgegeben. Da schreibt dann die send(); immer nur ein Zeichen
rein und dieses wird dann unmittelbar über UART ausgegeben. Mehrere Zeichen "auf einmal" senden habe ich nicht probiert. Möglich, dass der Output Buffer irgendwann überläuft.
Tritt beim Senden kein Fehler auf, wird als Ergebnis (res Abkürzung für result) 0 zurückgegeben.
Code:
int res=write(fd, &c, 1);
Diese Schleife
Code:
while(pBuf && *pBuf){ //Zeichen einzeln senden
send(*pBuf++);
habe ich auch im Netz gefunden. Man könnte auch die Zeichen gleich in der Schleife, wo die Umlaute angepasst werden, senden. Das hatte ich zwischendurch auch im kombinierten Senden/Empfangen Programm gemacht. Habe diese Idee dann aber, wie gesagt wegen der Prozessorlast, wieder verworfen.
Die Geschwindigkeit hatte ich Anfangs auf 38400 Baud. Später habe ich mich dann bei 19200 eingependelt. 115200 würde mein AVR nicht schaffen (die Abweichung wäre zu hoch), da ich kein Baudratenquarz nutze.
19200 ist für meine Anwendung noch ausreichend schnell und ich habe noch vor, den TX-Pin des Raspi mit 2 parallel geschalteten RX zu verbinden, da ich noch eine externe Uhr ansteuern möchte. Da ist das Kabel dann knapp 1m lang. Da ist langsamer besser.
Ansonsten ist C noch recht neu für mich..
Lesezeichen