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.
- 1024 megtekintés
Hozzászólások
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 ;)
- A hozzászóláshoz be kell jelentkezni