[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