[LUGOS-PROG] Zapiranje serijskih portov
Anze
anze at volja.net
Mon Jan 10 23:27:50 CET 2005
Zivjo!
Imam nek program, ki mi zre zivce. :)
Gre za komunikacijo z modemom, vendar pa zelim najprej ugotoviti, ali je
modem sploh prisoten - ce modema ni, naletim na tezave. Uporabljam
non-canonical branje, vendar simuliram canonical read s svojim bufferjem.
Stvar deluje b.p., ce je modem prisoten.
Program izgleda priblizno takole (celoten program je prevelik, da bi ga
vkljucil):
struct termios newtio;
int f;
f=open(GSM_COMPORT, O_RDWR | O_NOCTTY);
if (f==-1)
{
printf("Error opening port");
fflush(NULL);
return(1);
};
tcgetattr(f, &newtio); // read existing modem parameters
newtio.c_cflag = GSM_BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;
newtio.c_lflag &= ~ECHO; // echo off
newtio.c_iflag = IGNPAR; // ignore parity error
newtio.c_oflag = 0; // raw output
newtio.c_lflag &= ~ICANON; // non-canonical (raw) input
newtio.c_cc[VTIME] = 50; // inter-character timer
newtio.c_cc[VMIN] = 0; // do not block read
tcflush(f, TCIFLUSH);
tcsetattr(f, TCSAFLUSH, &newtio);
if (write(f,"ATE0\r\n",6)<0)
{
fprintf(stderr,"Error writing: '%s'\n",AT); // zakaj se to ne izpise?
fflush(NULL);
return(1);
};
// preberi iz modema, vendar beri le, dokler ne najdes '\n'.
// potem primerjaj, ali si dobil "OK" - ce nisi oz. ce pride do
// timeouta, potem vrni READ_ERROR:
if (read_modem_canonical(buf,sizeof(buf),"OK") != READ_OK)
{
printf("To se izpise.\n");
fflush(NULL);
if (close(f)!=0) // tukaj se obesi
{
printf("To se ne izpise.\n");
fflush(NULL);
};
printf("Tudi to se ne izpise.\n");
fflush(NULL);
return(1);
};
Zoprno je to, da se mi obesi znotraj close(f), ce modem ni priklopljen. Tam
caka, dokler ne dobi signala (SIG_TERM, SIG_ALRM,...). Ko ga dobi, skoci
naprej, kot da se ne bi nic zgodilo.
Ima kdo kaksno idejo, kaj mu dogaja? :(
Obstaja mogoce kaksen lepsi nacin, da vidim, ali je modem prisoten?
Se druga stvar: zakaj mi ne sporoci, da je prislo do napake ze pri pisanju?
Hvalezen bi bil za kaksen namig...
Anze
More information about the lugos-prog
mailing list