rockin_santa
13.05.2008, 23:25
Hallo Zusammen,
Ich habe einen ATmega32, der einen kleinen Bot steuert und bin gerade dabei, die Kommunikation mit meinem Linux-PC (Ubuntu, Kernel 2.6.24) in C zu implementieren.
Mein µC gibt momentan timergesteuert über die serielle Schnittstelle ein wiederkehrendes Byte aus. Über ein Terminalprogramm kann ich sehen, wie die Bytes "einfliegen". So weit so gut.
Nun versuche ich, eine Funktion in C zu schreiben, die die serielle Schnittstelle am PC öffnet und konfiguriert, dass ich einzelne Bytes hin- und herschicken kann.
Hierzu orientiere ich mich an einigen deutsch- und englischsprachigen Tutorials im Netz (um mal eines zu nennen. (http://www.tldp.org/HOWTO/Serial-Programming-HOWTO/x56.html)).
In diesen wird immer erläutert, dass die Konfigurationsparameter der Schnittstelle in einer Struktur vom Typ "termios" abgelegt werden. Soweit ist alles klar. Ich erzeuge also eine Struktur und öffne das Device.
Sobald ich aber die Funktionen
tcgetattr(<filedescriptor>,&<struktur>); /* Funktion der <termios.h> */ oder
cfsetispeed(&<struktur>, BAUDRATE); /* Funktion der <termios.h> */ verwende, spuckt mir der gcc beim kompilieren eine Warnung entgegen:
rs232.c:36: Warnung: Übergabe des Arguments 2 von »tcgetattr« von inkompatiblem Zeigertyp und
rs232.c:37: Warnung: Übergabe des Arguments 1 von »cfsetispeed« von inkompatiblem Zeigertyp
Seltsamerweise verwenden alle Tutorials diese Syntax. Nagut, ist nur eine Warnung, er kompiliert es ja fertig.
Nun komm ich aber zu meinem eigentlichen Problem:
In den Tutorials werden die Konfigurationsflags mit folgender Syntax gesetzt:
rs232.c_cflag = CLOCAL | CREAD; /* als Beispiel */
Hierbei wird ja bekanntlich auf eine Komponente innerhalb einer Struktur zugegriffen. Ich kann in dieser Zeile keinen Fehler sehen und sämtliche Tutorials benutzen auch genau diese Syntax in ihren Beispielprogrammen.
Dennoch reagiert mein gcc äußerst ungehalten mit der Aussage:
rs232.c:39: Fehler: Anfrage nach Element »c_cflag« in etwas, was keine Struktur oder Variante ist
Ja, und hier bin ich mit meinem Latein am Ende. Wenn ein Tutorial diese Syntax verwendet, gehe ich vielleicht noch davon aus, dass sich dort einfach ein Fehler eingeschlichen hat, aber alle verwenden diese Zeile so... :-k
Wie, wenn nicht so, kann ich meine Schnittstelle denn konfigurieren?
Oder sehe ich vielleicht den Wald vor lauter Bäumen nicht?
MfG rockin_santa
Ich habe einen ATmega32, der einen kleinen Bot steuert und bin gerade dabei, die Kommunikation mit meinem Linux-PC (Ubuntu, Kernel 2.6.24) in C zu implementieren.
Mein µC gibt momentan timergesteuert über die serielle Schnittstelle ein wiederkehrendes Byte aus. Über ein Terminalprogramm kann ich sehen, wie die Bytes "einfliegen". So weit so gut.
Nun versuche ich, eine Funktion in C zu schreiben, die die serielle Schnittstelle am PC öffnet und konfiguriert, dass ich einzelne Bytes hin- und herschicken kann.
Hierzu orientiere ich mich an einigen deutsch- und englischsprachigen Tutorials im Netz (um mal eines zu nennen. (http://www.tldp.org/HOWTO/Serial-Programming-HOWTO/x56.html)).
In diesen wird immer erläutert, dass die Konfigurationsparameter der Schnittstelle in einer Struktur vom Typ "termios" abgelegt werden. Soweit ist alles klar. Ich erzeuge also eine Struktur und öffne das Device.
Sobald ich aber die Funktionen
tcgetattr(<filedescriptor>,&<struktur>); /* Funktion der <termios.h> */ oder
cfsetispeed(&<struktur>, BAUDRATE); /* Funktion der <termios.h> */ verwende, spuckt mir der gcc beim kompilieren eine Warnung entgegen:
rs232.c:36: Warnung: Übergabe des Arguments 2 von »tcgetattr« von inkompatiblem Zeigertyp und
rs232.c:37: Warnung: Übergabe des Arguments 1 von »cfsetispeed« von inkompatiblem Zeigertyp
Seltsamerweise verwenden alle Tutorials diese Syntax. Nagut, ist nur eine Warnung, er kompiliert es ja fertig.
Nun komm ich aber zu meinem eigentlichen Problem:
In den Tutorials werden die Konfigurationsflags mit folgender Syntax gesetzt:
rs232.c_cflag = CLOCAL | CREAD; /* als Beispiel */
Hierbei wird ja bekanntlich auf eine Komponente innerhalb einer Struktur zugegriffen. Ich kann in dieser Zeile keinen Fehler sehen und sämtliche Tutorials benutzen auch genau diese Syntax in ihren Beispielprogrammen.
Dennoch reagiert mein gcc äußerst ungehalten mit der Aussage:
rs232.c:39: Fehler: Anfrage nach Element »c_cflag« in etwas, was keine Struktur oder Variante ist
Ja, und hier bin ich mit meinem Latein am Ende. Wenn ein Tutorial diese Syntax verwendet, gehe ich vielleicht noch davon aus, dass sich dort einfach ein Fehler eingeschlichen hat, aber alle verwenden diese Zeile so... :-k
Wie, wenn nicht so, kann ich meine Schnittstelle denn konfigurieren?
Oder sehe ich vielleicht den Wald vor lauter Bäumen nicht?
MfG rockin_santa