On ohjelma A joka käyttää USB porttia. Sitten se pysähtyy ja hetkeä myöhemmin käynnistyy ohjelma B joka käyttää tätä samaa porttia. Kun se on valmis, niin taas käynnistetään A jne.
Yleensä tämä menee aivan oikein. Ohjelmassa B lienee kuitenkin jokin bugi jonka takia USB portti jää joskus harvoin sulkeutumatta. Silloin ohjelma A ei saa enää alustettua tätä porttia omaan käyttöönsä.
Tietääkö kukaan mitään kikkaa jolla jonkin toisen ohjelman alustaman portin voi sulkea väkisin katkaisematta virtoja?
---------
Tarkennusta yksityiskohdista:
Ohjelma A on oma joten sen koodi on käytettävissä.
Siinä portti avataan komennolla:
port = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY | O_NONBLOCK);
Tämä menee oikein eli palauttaa >= 0 arvon.
Sitten myöhemmin hyvin harvoin tämä menee väärin:
memset(&newtio, 0, sizeof newtio);
newtio.c_cflag = ....
newtio.c_iflag = ...
jne
tcsetattr(port,TCSANOW,&newtio);
eli attribuutteja ei voi asettaa vaan tcsetattr() palauttaa -1.
Yleensä tämä menee aivan oikein. Ohjelmassa B lienee kuitenkin jokin bugi jonka takia USB portti jää joskus harvoin sulkeutumatta. Silloin ohjelma A ei saa enää alustettua tätä porttia omaan käyttöönsä.
Tietääkö kukaan mitään kikkaa jolla jonkin toisen ohjelman alustaman portin voi sulkea väkisin katkaisematta virtoja?
---------
Tarkennusta yksityiskohdista:
Ohjelma A on oma joten sen koodi on käytettävissä.
Siinä portti avataan komennolla:
port = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY | O_NONBLOCK);
Tämä menee oikein eli palauttaa >= 0 arvon.
Sitten myöhemmin hyvin harvoin tämä menee väärin:
memset(&newtio, 0, sizeof newtio);
newtio.c_cflag = ....
newtio.c_iflag = ...
jne
tcsetattr(port,TCSANOW,&newtio);
eli attribuutteja ei voi asettaa vaan tcsetattr() palauttaa -1.
Vastaukset 2
Vanhimmat
hmm toimiiko fcntl yhtään paremmin?
fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY);
fcntl(fd, F_SETFL, 0);
Kiitos vinkistä. Tuota täytyy kokeilla jossain välissä.... itseasiassa mahdollisimman pian.