Hallo, weis zufällig jemand wie ich bei Ubuntu die Serielle
schnittstelle wieder schliessen kann??
Habe ein Programm dass manchmal abschmiert und die schnittstelle ist
dann noch offen..
Danke schon mal..
hmm irgdnwie schiesst es mir den Port immer ab, wenn ich dann vom System
darauf zugreifen will bekomme ich einen "Input/Output Error" und von
alleine schliesst er sich auch nicht.. ??
phreak schrieb:
> irgendwas stimmt da nicht. der port wird nicht mal geschlossen wenn ich> alle prozesse kille ( strg + alt + <---- )
Ähm, das killt nur den X-Server. Grafische Programme können darauf
reagieren und sich beenden, müssen sie aber nicht und können fröhlich
weiter laufen.
Versuch mal "lsof | grep /dev/ttyXX" um herauszufinden welche Prozesse
noch auf die Schnittstelle zugreifen. Hast du mal meinen Code oben
eingebaut, und die Schnittstelle wird trotzdem nicht geschlossen oder
was?
wenn ich jetzt den Port öffne scheint er irgdnwie offen zu sein,
zumindest ist er danach blockiert :/ wenn ich ihn wieder schliesse
rs232.close() ist er trotzdem noch blockiert...
und beim Lesen kommt immer nur 0 raus ... damit ich nicht nach jedem
build neustarten muss wollt ich fragen wie ich den Port abwürgen kann,
oder alternativ warum das Programm so ein Blödsinn macht ;)
Hallo, ich hab exakt dasselbe Problem. Ich verwende ebenfalls die
libserial und muss jedes mal, wenn die Verbindung mit meinem ftdi-device
(serial2USB-Converter /dev/ttyUSB0) unsanft beendet wird, den PC neu
starten.
Der Kernel erkennt zwar, wann das device eingesteckt/abgezogen wird
(dmesg), allerdings meldet er scheinbar nicht den socket ab.
Ich kann eigentlich jedem nur raten, bei Funktionsaufrufen auch die
Rückgabewerte zu überprüfen, auszuwerten und angemessen darauf zu
reagieren. Dafür sind die da!
Wenn ich diese Codesequenz lese:
Ich hatte den Effekt auch schon, dass bei einem Fehler in einem
USB/seriell-Wandler dieser und alle anderen(!) nicht mehr ansprechbar
waren. Statt Reboot tut's dann auch ein modprobe -r usbserial
(natürlich nachdem alle USB/seriell-Prozesse beendet wurden).
Mit neueren Kernels (ab ca. 2.6.29) scheint das Problem weg zu sein; es
trat jedenfalls nicht mehr auf.
----
(Übrigens, weiter oben: Ein SIGSEGV kann vom verursachenden Prozess
nicht abgefangen werden - der Prozess bekommt vom Kernel keine Chance
dazu mehr, denn er wird sofort beendet und hört mit dem SEGV auf zu
laufen. Es wird kein Signalhandler im Prozess aufgerufen. Sein I/O
wird geschlossen (auch vom Kernel).)
Der mizch mag ja Recht haben, aber wer Returncodes von Libc-Aufrufen,
auch wenn sie in C++ verpackt sind, ignoriert, der soll hiermit gewarnt
werden: Irgendwann geht das in die Hose!
Unter Linux ist es ja doch so, dass wenn ein Prozess endet, alle von ihm
belegten Dateien (dazu zählen auch die seriellen Schnittstellen)
freigegeben werden.
Aber darum geht es doch hier nicht!
Das laufende Programm soll bemerken, dass ihm die Schnittstelle abhanden
gekommen ist. Wie soll das denn gehen, wenn sich keiner darum kümmert?
Hazeh Zimmerer schrieb:
> (Übrigens, weiter oben: Ein SIGSEGV kann vom verursachenden Prozess> nicht abgefangen werden - der Prozess bekommt vom Kernel keine Chance> dazu mehr, denn er wird sofort beendet und hört mit dem SEGV auf zu> laufen. Es wird kein Signalhandler im Prozess aufgerufen. Sein I/O> wird geschlossen (auch vom Kernel).)
Ganz sicher? Bei mir funktioniert's:
1
#include<stdio.h>
2
#include<stdlib.h>
3
#include<signal.h>
4
5
voidonsegv(intsig){
6
printf("Programm abgeschmiert\n");
7
exit(0);
8
}
9
10
intmain(){
11
signal(SIGSEGV,onsegv);
12
int*i=0;
13
printf("%d\n",*i);
14
}
Müsste der Gnome Bug Buddy nicht auch so funktionieren?
Da passiert kein SEGV, sondern es wird über den normalen Mechanismus ein
Signal gesendet. Greif mal spaßeshalber auf einen Nullpointer zu und
aus ist's damit.
Hazeh Zimmerer schrieb:
> Da passiert kein SEGV, sondern es wird über den normalen Mechanismus ein> Signal gesendet. Greif mal spaßeshalber auf einen Nullpointer zu und> aus ist's damit.
Was, wenn nicht ein Null-Pointer-Zugriff, ist denn das:
1
int*i=0;
2
printf("%d\n",*i);
Edit: Okay, int* i = NULL wäre vermutlich sauberer, wie hier auch
irgendwo im Forum durchdiskutiert wurde.