Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1

    [perl ]errore da interpretare

    ecco la linea incriminata

    $port = new Device::SerialPort ($PortName) || die "Can't open $PortName: $!\n";

    l'errore è
    ./test.pl: line 7: syntax error near unexpected token `($'
    '/test.pl: line 7: `$port = new Device::SerialPort ($PortName) || die "Can't open $PortName: $!\n";


    non funzia perchè non è registrata la device:serialport oppure faccio casini di sintassi ?

    il mio sistemista ( uno scandalo ) dice che l'ha installata ... help me

  2. #2
    Ciao,

    hai inserito prima?

    use Device::SerialPort;

    se si allora ti dice che non si aspetta '($', in $port = new Device::SerialPort ($PortName).

    Essendo invece un costrutto esatto mi viene da pensare che ci possano essere problemi di codifica dei caratteri, ciò può avvenire quando un file viene scritto su un sistema con editor che supporta UTF-8 e poi portato si iso-8859-1 o viceversa.
    Marco Allegretti
    shishii@tiscalinet.it
    Lang: PERL, PHP, SQL.
    Linux user n° 268623 Fedora Core 10, Fedora Core 6, Debian Sarge on mips

  3. #3
    allora ho inserito questo
    use Device::SerialPort qw( :PARAM :STAT 0.07 );

    prima invece usavo solo
    use Device::SerialPort; ... non credo che cambi qualcosa anche se non so cosa significhi

    per il problema della codifica come mi muovo ?
    grazie

  4. #4
    la mia è solo un'ipotesi basata su problemi che ho avuto io.

    per risolvere i problemi di codifica dovresti accertarti che lo script è stato editato e salvato in iso-8859-1.

    Se non sei sicuro fai così:

    apri un editor che ti consente di accertarti di quale codifica stai usando.

    apri lo script in un'altra pagina (importante).

    copi-incolli il testo dello script dalla seconda pagina alla prima e salvi.

    riuplodi.
    Marco Allegretti
    shishii@tiscalinet.it
    Lang: PERL, PHP, SQL.
    Linux user n° 268623 Fedora Core 10, Fedora Core 6, Debian Sarge on mips

  5. #5
    non credo che sia un problema di codifica, ti posto il codice che ho fatto

    codice:
    #!/usr/bin/perl -w
    
    use Device::SerialPort qw( :PARAM :STAT 0.07 );
    
    $pass = '';
    $out = '';
    
    $PortName = "/dev/ttyS1";
    #$port = new Device::SerialPort ($PortName);
    $port = new Device::SerialPort ("/dev/ttyS1") || die "Can't open $PortName: $!\n";;
    
    $port->baudrate(19200);
    $port->databits(8);
    $port->stopbits(1);
    $port->parity("none");
    
    $i=1;
    while($i){
      $pass = $port->write('S$') ;
       $j=0;
       while ( $j==0){
           $out = $port->input;
           if ( $out ne '' ){
            $_ = $out;
            if ( m/S:/ ){
                    $string = '';
                    $string = $_ ;
                    }#end string start
            elsif ( m/:$/ ){
                    $string = $string + $out ;
                    print $string;
                    $j=1;
                    $i='';
                    }#deal with the end stuff
                else {
                    $string = $string + $out ;
                }
            }#end if for read out
    
       }#close while $j
    }#close while $i
    è collegata una sonda che rileva valori come temperatura e varie

    devo solo intercettare cosa legge, cioè trasformare le stringhe che ho in dati che poi inserisco in un db

    la difficoltà è leggere e successivamente scrivere (inviare) sulla porta rs232.

    sai darmi qualche info, qualche dritta, ho sbagliato logica ?

    grazie

  6. #6
    ma in questo modo ti da errore?
    Marco Allegretti
    shishii@tiscalinet.it
    Lang: PERL, PHP, SQL.
    Linux user n° 268623 Fedora Core 10, Fedora Core 6, Debian Sarge on mips

  7. #7
    adesso credo che vada in loop

    non mi da nessuna risposta

    ti passo la versione che ho provato a stampare a video fino a dove si potrebbe bloccare ma non stampa nulla
    codice:
    #!/usr/bin/perl -w
    
    use Device::SerialPort qw( :PARAM :STAT 0.07 );
    
    $pass = '';
    $out = '';
    
    $PortName = "/dev/ttyS1";
    
    print "$PortName";
    
    #$port = new Device::SerialPort ($PortName);
    $port = new Device::SerialPort ("/dev/ttyS1") || die "Can't open $PortName: $!\n";;
    
    print "Port ok";
    
    $port->baudrate(19200);
    $port->databits(8);
    $port->stopbits(1);
    $port->parity("none");
    
    $i=1;
    print "$i";
    while($i){
      $pass = $port->write('S$') ;
       $j=0;
       while ( $j==0){
           $out = $port->input;
           if ( $out ne '' ){
            $_ = $out;
            if ( m/S:/ ){
                    $string = '';
                    $string = $_ ;
                    print "end string start";
                    }#end string start
            elsif ( m/:$/ ){
                    $string = $string + $out ;
                    print $string;
                    $j=1;
                    $i='';
                    print "deal with the end stuff";
                    }#deal with the end stuff
                else {
                    $string = $string + $out ;
                    print "string $string";
                }
            }#end if for read out
    
       }#close while $j
    }#close while $i

  8. #8
    correggi con:

    print "$PortName\n";

    e vedrai che quello lo scrive.
    Si blocca subito dopo avere aperto la porta con
    port = new Device::SerialPort ("/dev/ttyS1") || die "Can't open $PortName: $!\n";

    ho provato questo script d'esempio e funziona, nel senso che hai 10 secondi per inserire un comando o più, e te lo esegue alla fine dei 10 secondi.

    codice:
     #!/usr/bin/perl -w
    
    use Device::SerialPort;
     
     my $port=Device::SerialPort->new("/dev/ttyS0");
    
     my $STALL_DEFAULT=10; # how many seconds to wait for new input
     
     my $timeout=$STALL_DEFAULT;
     
     $port->read_char_time(0);     # don't wait for each character
     $port->read_const_time(1000); # 1 second per unfulfilled "read" call
     
     my $chars=0;
     my $buffer="";
     while ($timeout>0) {
            my ($count,$saw)=$port->read(255); # will read _up to_ 255 chars
            if ($count > 0) {
                    $chars+=$count;
                    $buffer.=$saw;
     
                    # Check here to see if what we want is in the $buffer
                    # say "last" if we find it
            }
            else {
                    $timeout--;
            }
     }
    
     if ($timeout==0) {
            die "Waited $STALL_DEFAULT seconds and never saw what I wanted\n";
     }
    prova.
    Marco Allegretti
    shishii@tiscalinet.it
    Lang: PERL, PHP, SQL.
    Linux user n° 268623 Fedora Core 10, Fedora Core 6, Debian Sarge on mips

  9. #9
    lo faro' domani appena posso e ti ringrazio in anticipo a prescindere dall'esito ... una curiosità ? secondo la mia logica su linux ( non sono sistemista e quello che abbiamo è uno scandalo, ha montato la sonda nella com2 al posto della com1 ) una porta deve fare il mount come una periferica o disco, giusto? e se si è giusto farlo fare in automatico all'avvio della macchina ?

    la com1 a cosa corrsiponde nelle unità di default ? alla ttyS0 o ttyS1 ? o sono nomi assegnati al mount ?

    grazie ancora

  10. #10
    Ciao,

    no le porte seriali e le parallele non fanno alcun mount, la com 1 corripsonde alla S0, la com2 alla S1.

    I sistemi settati normalmente di default caricano i driver delle seriali in maniera automatica all'avvio.
    Marco Allegretti
    shishii@tiscalinet.it
    Lang: PERL, PHP, SQL.
    Linux user n° 268623 Fedora Core 10, Fedora Core 6, Debian Sarge on mips

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.