Portál AbcLinuxu, 4. prosince 2025 08:49
//otevreni seriaku
fd=open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NONBLOCK); //zajisteni spojeni mezi soub.deskript. a komun. portem
if(fd<0){
printf("\033[38mProblem pri otevirani serioveho portu.\033[0m\n\n");
perror("/dev/ttyUSB0");
return(1);
}
printf("\033[32mSeriovy port otevren v poradku.\033[0m\n");
saio.sa_handler = funkce_pri_preruseni;
sigemptyset(&saio.sa_mask);
saio.sa_flags = 0;
saio.sa_restorer = NULL;
sigaction(SIGIO,&saio,NULL);
//povolit procesu prijmout SIGIO
fcntl(fd, F_SETOWN, getpid());
fcntl(fd, F_SETFL,O_NONBLOCK | FASYNC); /
tcgetattr(fd,&oldtio); //zaloha puvodniho nastaveni portu
//nastaveni portu - Canonnical Input - radek ukoncen znakem ASCII LF
newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;
newtio.c_iflag = IGNPAR | ICRNL;
newtio.c_oflag = 0;
// newtio.c_lflag = ICANON;
newtio.c_cc[VMIN]=1;
newtio.c_cc[VTIME]=0;
tcflush(fd, TCIFLUSH);
tcsetattr(fd,TCSANOW,&newtio);
write(fd,.....
fcntl(fd, F_SETFL,O_NONBLOCK | FASYNC);
Nastavením O_ASYNC žádáš, aby jádro poslalo SIGIO pokaždé, když je deskriptor připraven přijímat nebo dodat data; drtivou většinu SIGIO dostáváš proto, že deskriptor hlásí připravenost k přijetí dalších dat.
Jiná otázka je, co s tím
Bohužel nevím o tom, že by šlo nastavit přijetí signálu jen při přijetí nových dat. Zdá se mi, že ti nezbyde buď při každém SIGIO ověřit stav deskriptoru a zjistit, která z těch situací nastala (select(), poll() nebo něco podobného), nebo, podle aplikace, nechat signály koňovi a používat místo nich select() nebo poll() rovnou.
(Upozorňuji, že jsem odpůrce konceptu signálů, které jsou podle mne užitečné jen pro hlášení kritických situací, takže můj pohled je poněkud ovlivněn.
)
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.