SIGIO eldobasa soros port aszinkron olvasasakor, es mas SIGIO kerdesek

 ( Hiena | 2008. szeptember 26., péntek - 9:25 )

Egy soros GPS-t idomitok linux ala, ehhez faragok egy egyszeru kodot. A Serial Programing How-to -bol copy-pasteztem a "3.3. Asynchronous Input" mintakodot, es kikommenteltem belole az ures enterre torteno kilepes reszt.
A kod siman fordul, es szepen ki is kohogi a NMEA kodot, ahogy kell, viszont 2-3 perc mukodes utan "megall". Nemi hackkeles aran kiderult, hogy valamilyen oknal fogva a SIGIO "kezeleset" vegzo fuggveny nem kerul meghivasra, emiatt a egyhelyben fut a cucc. Mivel a megallas helye fuggetlen a kuldott es a fogadott adatok mennyisegetol, es a SIGIO meghivasatol, ezert hirtelen nincs otletem, hogy mi lehet az oka.
Mivel a GPS veletlenszeruen kuld ures entereket, arra gyanakszom, hogy rovid idon belul ketszer is meg van hivva a SIGIO kezelo, es ezert dob hatast a kod.
Valami otlet erre?

A masik kerdes, hogy tudtok valami jo online how-to-t vagy tutorialt a SIGIO kezelesre? Elsodlegesen, idozitesi funkciok (rtc es tarsai) erdekelnenek.

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

A sigio helyett hasznalj select()-et vagy poll()-t. A linkelt peldaban levo" megoldas, alszunk 0.1 masodpercig, hatha tortenik valami, majd ha igen, akkor olvasgatunk, elegge nem tul elegans. Pl igy:

fd_set  set;
while ( STOP==FALSE )
 {   FD_ZERO(&set);
     FD_SET(fd,&set);
     select(fd+1,&set,NULL,NULL,NULL);
     if ( FD_ISSET(fd,&set) )
      {     res = read(fd,buf,255);
            buf[res]=0;
            printf(":%s:%d\n", buf, res);
            if (res==1) STOP=TRUE;
      }
 }

A select() addig blokkol, mig a &set-ben levo" fd-k valamelyikerol (konkretan most arrol az egy db fd-rol) nem tudsz beolvasni legalabb egy byte-ot (azaz a megfelelo" read() nem blokkolna). Ha timeout-ot is akarsz adni, akkor egy struct timeval-t kell atadni 5. parameternek, lasd `man 2 select`, igy le tudod kezelni azt is szepen, hogyha egy altalad megadott idointervallumig nem jon adat (sot, a select() modositja a timeval struct erteket, a hatralevo" idore abban az esetben, hogyha a timeout lejarta elott erkezett az adat igy akkumulativ timeout-ot is nagyon egyszeruen lehet csinalni).

szerk: egyebkent a kovetkezo" pelda itt, pont a select() alapu megoldast diszkutalja ;)