[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Porta seriale



Hola,
ho qualche problemino con la porta seriale.

Posto il codice (Perl) e commento.

#########################################################################################

#!/usr/bin/perl

use strict;
use Getopt::Long;
$|=1;
open(LOCK,">/var/lock/LCK..ttyS0") or die "lock:$!\n";
#open(MODEM,"+</dev/ttyS0") || die"$!\n";
my ($dest,$sorg,$mess);
&GetOptions("d=s" => \$dest,
          "s=s" => \$sorg,
          "m=s" =>\ $mess);
###
if(!$dest || !$sorg || !$mess){
  die"'zzo scrivi !!\n";
}
$SIG{INT}=sub{unlink('/var/lock/LCK..ttyS0');die;};
print"\n";
chomp($dest);
chomp($sorg);
chomp($mess);
my $stringa=&costruisci($sorg,$dest,$mess);

&scrivi("ATD+41794998990\r");
&leggi("CONNECT");
sleep 1;
&scrivi(chr(2).$stringa.chr(3));
sleep 1;
&leggi("R");
sleep 1;
&scrivi("+++");
&leggi("OK");
&scrivi("ATH\r");
unlink('/var/lock/LCK..ttyS0');



sub scrivi{
  open(OUT,">/dev/ttyS0") || die"$!\n";
  my $campo=$_[0];
  select OUT;$|=1;
  print $campo;
  close OUT;
}
###############################################################
sub leggi{
  open(IN,"/dev/ttyS0") || die"$!\n";
  my $campo=$_[0];
  while(1){
  select IN;$|=1;
  my $lin=<IN>;
  select STDOUT;$|=1;
  print"$lin\n";
  if($lin=~/$campo/){
      last;
  }
  }
  close IN;
  return;
}


#######
sub costruisci{
### costruisce una stringone, ma non è importante in questo contesto####
}
#########################################################################

Spiegazio del codice:

1) Faccio una chiamata ad un gateway sms (ATDnumero);
2) Attendo la CONNECT dal gateway (&leggi("CONNECT"));
3) Invio lo stringone (&scrivi(chr(2).$stringa.chr(3)));
4) Attendo la risposta (&leggi("R"));
5) Invio "+++" [termina la sessione]
6) Attendo OK (&leggi("OK"));
7)Invio ATH [chiude la chiamata].

PROBLEMA:
per qualche oscuro motivo la &leggi("R"), non legge la risposta, nel senso che sulla seriale non arriva nulla (rimane in attesa). Se non eseguo la &leggi("R"), la risposta viene catturata dalla &leggi("OK") dopo l'invio dei "+++".


Ricapitolando:

a) Eseguendo la &leggi("R") =>
  - Chiamata verso il numero.
  - Leggo il CONNECT
  - Invio la richiesta.
  - Rimane in attesa della risposta alla richiesta.

b) Senza eseguire &leggi("R") =>
  - Chiamata verso il numero.
  - Leggo il CONNECT
  - Invio la richiesta.
  - Invio "+++"
  - Aspetto OK, ma prima dell'OK, ricevo la risposta alla richiesta.
  - Termino con ATH.

Ho provato ad eseguire la &leggi("R") dopo l'invio di "+++" : in questo caso leggo la risposta alla richiesta, ma non vedo l'OK associato ad "+++" e quindi mi blocco (non invio ATH).


Ho provato anzichè utilizzare lo script, ad utilizzare minicom (un emulatore di terminale, su porta seriale). In questo caso non ho problemi, quindi il dispositivi seriale funziona, comincio a credere che sia un problema di buffer, solo che la mia conoscenza relativa al funziomanto della seriale non va molto oltre.

Il tutto su una Debian 2.2r6


Grazie

  Walter


--
To UNSUBSCRIBE, email to debian-italian-request@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmaster@lists.debian.org



Reply to: