[Perl] Port série, Device::SerialPort; et STDOUT

Patrice Karatchentzeff patrice.karatchentzeff at gmail.com
Jeu 16 Mar 14:11:41 CET 2017


Avec le nouveau script, c'est mieux :-)

(c'est du crash : ne faîtes pas trop attention au style)

#!/usr/bin/perl

use strict;
use warnings;
use English;

# For Linux
# do apt install libdevice-serialport-perl in Debian before !
#   for testting, do apt install socat
#   socat -d -d pty,raw,echo=0 pty,raw,echo=0
#  depending of this previsous screen out, do
#     ./getserial.pl /dev/pts/12 9600 60 toto.txt
#     echo coucou > /dev/pts/11
#

usage();

my $line    = "$ARGV[0]";
my $baud    = "$ARGV[1]";
my $runtime = "$ARGV[2]";
my $file    = "$ARGV[3]";
my $fh;

# open saved data file
open $fh, '>', $file
  or die "can't open file: $OS_ERROR\n";

print $fh "test0\n";


# manage serial port
use Device::SerialPort;
my $port = Device::SerialPort->new("$line")
  or die "can't open port: $OS_ERROR\n";

# For Windows. You only need one or the other.
# Uncomment these for Windows and comment out above
#use Win32::SerialPort;
#my $port = Win32::SerialPort->new("COM3");

# manage serial port
# only baudrate is managed from the external line
$port->baudrate($baud); # Configure this to match your device
$port->databits(8);
$port->parity("odd");
$port->stopbits(1);
$port->handshake('on');
#$port->handshake("xoff");
$port->buffers(4096, 4096);
$port->stty_icrnl(1)     || die "failed setting convert cr to new line";
$port->user_msg(1);           # misc. warnings
$port->error_msg(1);          # hardware and data errors
$port->debug(1);              # debug on at 0, 1 otherwise
#$port->read_const_time(500); # const time for read (milliseconds)
$port->read_char_time(0);
$port->write_settings;

print $fh "test1\n";

# print configuration
my @data_opt = $port->parity; # list context
print "\nData Bit Options: ";
foreach $a (@data_opt) { print " $a"; };
print "\n$line $baud $runtime $file\n";
# begin reading serial port
#$port->write("\nBegin perl serial listener\n");

print $fh "test2\n";

while (1) {
    my $char = $port->lookfor();
#    my $char = $port->read(255);
  if ($char) {
      print $fh "testFH\n";
      print STDOUT "testSTDOUT\n";
      print  "$char\n";
      $port->write("\ntest02");
    }
#  $port->lookclear; # needed to prevent blocking
  }

close $fh;
close $port;

sub usage {
  if ( $#ARGV ne "3" ) {
    print "usage :\n";
    print "   getserial.pl port speed  runtime file\n";
    print "      where : port     = serial port\n";
    print "              seed     = port speed (in bauds)\n";
    print "              runtime  = runtime of the measure (in seconds)\n";
    print "              file     = data saved file\n";
    exit;
    }
}

Le 16 mars 2017 à 14:08, Patrice Karatchentzeff <
patrice.karatchentzeff at gmail.com> a écrit :

> Re moi,
>
> J'ai avancé un peu... En fait, j'ai l'impression que le module Device::SerialPort;
> redéfinit beaucoup de choses...
>
> Je n'arrive pas non plus à écrire dans un fichier par exemple !
>
> Je n'ai rien lu - ou pas compris - si la doc du module en parlait...
>
> Quelqu'un a-t-il une idée comment contourner ?
>
> Merci
>
> PK
>
> 2017-03-13 10:07 GMT+01:00 Patrice Karatchentzeff <
> patrice.karatchentzeff at gmail.com>:
>
>> Salut les mongueurs
>>
>> J'ai un petit souci avec une redirection sur la sortie standard en jouant
>> avec les ports série. Le but de la manipulation est de récupérer les
>> données d'un appareil de mesure branché sur un port série (USB en fait).
>>
>> Voici un extrait crash-test du programme.
>>
>> Pour ceux qui veulent tester tout, voici un exemple sous Linux (pour
>> Windows, il n'est pas encore prêt pour le desktop à mon dernier test de
>> décembre 2016 😉) :
>>
>> # Créer une liaison de ports série virtuels :
>> % socat -d -d pty,raw,echo=0 pty,raw,echo=0
>> 2017/03/13 09:36:06 socat[29169] N PTY is /dev/pts/7
>> 2017/03/13 09:36:06 socat[29169] N PTY is /dev/pts/8
>> 2017/03/13 09:36:06 socat[29169] N starting data transfer loop with FDs
>> [5,5] and [7,7]
>>
>> # Lancement de mon scrit
>> % ./getserial.pl /dev/pts/8
>>
>> # envoi de données dans le port série
>> %  echo coucou >| /dev/pts/7
>>
>> # ce qui se passe en sortie de mon programme:
>> % ./getserial.pl /dev/pts/8
>> Debug level: /dev/pts/8 = 0 at ./getserial.pl line 36.
>>
>> Data Bit Options:  none odd evencoucou
>> coucou
>> coucou
>>
>> etc.
>>
>> Maintenant, si je veux rediriger la sortie de mon programme *en externe *
>> :
>>
>>  % ./getserial.pl /dev/pts/8 >>| toto.txt
>>
>> Le fichier ne se remplit pas...
>>
>> Je ne comprends pas pourquoi...
>>
>> Voici le programme simplifié :
>>
>> % cat getserial.pl
>> #!/usr/bin/perl
>>
>> use strict;
>> use warnings;
>> use English;
>>
>> use Device::SerialPort;
>> my $port = Device::SerialPort->new("$ARGV[0]")
>>   or die "can't open port: $OS_ERROR\n";
>>
>>
>> $port->baudrate(115200); # Configure this to match your device
>> #$port->baudrate(19200); # Configure this to match your device
>> $port->databits(8);
>> $port->parity("odd");
>> $port->stopbits(1);
>> $port->handshake('on');
>> #$port->handshake("xoff");
>> $port->buffers(4096, 4096);
>> $port->stty_icrnl(1)     || die "failed setting convert cr to new line";
>> $port->user_msg(1);           # misc. warnings
>> $port->error_msg(1);          # hardware and data errors
>> $port->debug(1);              # debug on at 0, 1 otherwise
>> #$port->read_const_time(500); # const time for read (milliseconds)
>> $port->read_char_time(0);
>> $port->write_settings;
>>
>> # print port configuration
>> my @data_opt = $port->parity; # list context
>> print "\nData Bit Options: ";
>> foreach $a (@data_opt) { print " $a"; }
>>
>> # begin reading serial port
>> #$port->write("\nBegin perl serial listener\n");
>>
>> while (1) {
>>   my $char = $port->lookfor();
>>     if ($char) {
>>         print "$char\n";
>>     }
>> #  $port->lookclear; # needed to prevent blocking
>>   }
>>
>> ​Any help welcome 😁
>>
>> Merci
>>
>> PK​
>>
>>
>> --
>>       |\      _,,,---,,_           Patrice KARATCHENTZEFF
>> ZZZzz /,`.-'`'    -.  ;-;;,_   mailto:patrice.karatchentzeff at gmail.com
>>      |,4-  ) )-,_. ,\ (  `'-'      http://p.karatchentzeff.free.fr
>>     '---''(_/--'  `-'\_)
>>
>
>
>
> --
>       |\      _,,,---,,_           Patrice KARATCHENTZEFF
> ZZZzz /,`.-'`'    -.  ;-;;,_   mailto:patrice.karatchentzeff at gmail.com
>      |,4-  ) )-,_. ,\ (  `'-'      http://p.karatchentzeff.free.fr
>     '---''(_/--'  `-'\_)
>



-- 
      |\      _,,,---,,_           Patrice KARATCHENTZEFF
ZZZzz /,`.-'`'    -.  ;-;;,_   mailto:patrice.karatchentzeff at gmail.com
     |,4-  ) )-,_. ,\ (  `'-'      http://p.karatchentzeff.free.fr
    '---''(_/--'  `-'\_)
-------------- section suivante --------------
Une pièce jointe HTML a été nettoyée...
URL: <http://listes.mongueurs.net/mailman/private/perl/attachments/20170316/bfd4ac3e/attachment.html>


Plus d'informations sur la liste de diffusion Perl