Problem mit open() unter Linux

Moin ihr C Gurus,

ich habe schon in folgenden Teil eines kleinen Proggies das Problem, dass nix mehr passiert…etwa wie ein Absturz unter Windows


int fd;
printf(„1\n“);
fd=open("/dev/ttyS0", O_RDWR | O_NOCTTY);
printf(„2\n“);
if(fd == -1)
{
printf(„Prob mit Schnittstelle!\n“);
exit(-1);
}

Zur Ausgabe von 2 ist das Prog nie gekommen:

Was mache ich schon wieder falsch?
Das Programm hat unter root die gleichen Probleme.
Andere Dateien lassen sich problemlos öffnen.
Hab ich irgendeinen Mist gebaut mit meinem Device?
Ist es zeitsparender auf einer anderen Partition ein neues Linux zu installieren?

Danke für eure Antworten,
Leon

System:
Duron 1,3 GHz
256 mb ram
Debian „stable“ Linux

Könnte es auch an etwas anderem liegen
Hallo Leon,

Deine Syntax ist absolut korrekt, korrekter geht’s m.E. gar nicht. Natürlich mußt Du das fertige Programm als Root ausführen, aber das hast Du ja auch gemacht.
Daß das Programm sich aufhängt, während es die Schnittstelle zu öffnen versucht, weist eindeutig darauf hin, daß es das nicht packt. Eventuell hängt noch etwas an der Schnittstelle dran? Dann sollte zwar der fd = -1 werden, aber vielleicht liegt es tatsächlich an so etwas, man weiß ja nie…
Versuche mal außerdem, die ttyS1 zu öffnen!

Viele Grüße,

Bernhard

Hallo Leon,

Deine Syntax ist absolut korrekt, korrekter geht’s m.E. gar
nicht. Natürlich mußt Du das fertige Programm als Root
ausführen, aber das hast Du ja auch gemacht.
Daß das Programm sich aufhängt, während es die Schnittstelle
zu öffnen versucht, weist eindeutig darauf hin, daß es das
nicht packt. Eventuell hängt noch etwas an der Schnittstelle
dran?

->Ein Nullmodemkabel :wink:
Dann sollte zwar der fd = -1 werden, aber vielleicht

liegt es tatsächlich an so etwas, man weiß ja nie…
Versuche mal außerdem, die ttyS1 zu öffnen!

Danke, werde ich mal probieren!

Viele Grüße,

Bernhard

Mir ist heute aufgefallen, dass das Programm beim ersten Start nach dem Hochfahrt die Schnittstelle öffnen kann.
Da ich den Rechner dank Linux nicht so oft neu starte kommt mir diese Erkenntnis spät…
Ich begebe mich mal auf Fehlersuche im weiteren Verlauf des Programmes…

Danke für eure Hilfe,
Leon

Moin ihr C Gurus,

Naja, Guru bin ich sicher nicht :smile:

ich habe schon in folgenden Teil eines kleinen Proggies das
Problem, dass nix mehr passiert…etwa wie ein Absturz unter
Windows

Zunächst einmal solltest Du bei Listings immer die eingebundenen header mit angeben:

#include
#include
#include
#include

fcntl.h für „open“
unistd.h für „close“
errno.h für Fehlermeldungen


int fd;
printf(„1\n“);
fd=open("/dev/ttyS0", O_RDWR | O_NOCTTY);

Wenn man eine Datei öffnet, egal ob low-level über File Descriptor (wie hier) oder als Stream (über fopen z.B.) mache ich stets eine Fehlerabfrage direkt beim öffnen. Da kann ja immer mal was dazwischen kommen. Außerdem mag ich es gerne, wenn mir dann auch genau gesagt wird, was oder gar warum es nicht geklappt hat. Dafür dann ein perror().

if ((fd=open(...)==-1){
 printf("Fehler beim Zugriff auf /dev/ttyS0!\n");
 printf("Grund");
 exit(1);
}

Zur Ausgabe von 2 ist das Prog nie gekommen:

Was mache ich schon wieder falsch?

Ich würde zur Sicherheit beim open() Aufruf auch noch die „O_NONBLOCK“ Filestatus Flagge setzen. Sonnst kann Dir Dein Programm einfrieren, wenn es bis zum St. Nimmerleinstag auf ein Input wartet. Hilft das?

Gruß

Fritze