Ver Mensaje Individual
  #2 (permalink)  
Antiguo 21/10/2010, 18:58
jferrero
Colaborador
 
Fecha de Ingreso: mayo-2006
Ubicación: Valladolid
Mensajes: 524
Antigüedad: 17 años, 11 meses
Puntos: 11
Respuesta: ayuda con perl y puerto serial

Código Perl:
Ver original
  1. #!/usr/bin/perl –w
  2. #
  3. #makes a time intervalo measurement with a sr620 counter
  4.  
  5. use strict;                     # programación estricta
  6. use Geotopt;                    # módulo para leer opciones en los argumentos
  7. use Fcntl qw(:DEFAULT :flock);  # importamos la función flock() para bloquear accesos a los ficheros
  8.  
  9. @_ = split ‘/’, $0;             # $0 es la ruta completa de este programa
  10.                                 # lo dividimos según los delimitadores '/'
  11. my $PROG_NAME = pop @_;         # la última parte somos nosotros
  12.  
  13. my $VERSION;
  14. my $version;
  15. my $help;
  16. my $samples=2;
  17. my $trigger_level = -99.;
  18. my $impedance='';
  19. my $verbose;
  20. my $device="";
  21.  
  22. my $cmd;
  23. my $answer;
  24. my $imp_value;
  25. my ( $mean, $rel, $std, $min, $max );
  26. my ( $year, $month, $day, $hour, $minu, $sec );
  27.  
  28. Getopt::Long::Configure ('no_ignore_case_always');
  29. unless ( Getopt::Long::GetOptions (    # si el usuario no nos pasa
  30.     'help'      => \$help,             # alguna de estas opciones
  31.     'device=s'  => \$device,
  32.     'samples=f' => \$samples,
  33.     'trigger=f' => \$trigger_level,
  34.     'imp=s'     => \$impedance,
  35.     'V'         => \$version,
  36.     'v'         => \$verbose
  37.     )
  38. ) {
  39.     # nos morimos indicando al usuario cómo obtener ayuda
  40.     die "usage: $PROG_NAME -h (for a short help! )\n";
  41. }
  42.  
  43. ( $help ) && help_die();                       # si nos pide ayuda se la damos
  44. ( $version ) && die "$PROG_NAME - $VERSION\n"; # lo mismo si nos pide número de versión
  45.  
  46. # check input parameter
  47. # controlamos que el usuario nos haya pasado los parámetros adecuados
  48.  
  49. # debe indicarnos un dispositivo
  50. ( $device eq "" ) and die "FATAL: define device with option –d !!\n";
  51. ( -c $device ) or die "FATAL: device \"$device\" doesn\'t exist !!\n";
  52.  
  53. $impedance =~ y/A-Z/a-z/;       # la impedancia la pasamos a minúsculas
  54. if ( $impedance eq '50' ) {     # si es igual a '50'
  55.     $imp_value = 0;             # realmente será 0
  56. }
  57. elsif ( $impedance eq '1m' ) {  # si es '1m'
  58.     $imp_value = 1;             # será 1
  59. }
  60. elsif ( $impedance eq 'uhf' ) { # si es 'uhf'
  61.     $imp_value = 2;             # será 2
  62. }
  63. else {
  64.     # y si no, decimos qué valores de impedancia necesitamos
  65.     die "FATAL: -I input impedance not 50|1M|UHF !!\n";
  66. }
  67.  
  68. # ver si el nivel de disparo está dentro del rango (-5,5)
  69. if ( ( $trigger_level < -5. ) or ( $trigger_level > 5. ) ) {
  70.     die "FATAL: -t trigger level not in range [-5.0 .. 5.0] !!\n";
  71. }
  72.  
  73. # el número de muestras no debe superar los 5 millones
  74. if ( $samples > 5e6 ) {
  75.     die "FATAL: -s max number of samples = 5e6 !!\n";
  76. }
  77.  
  78. # y ser más de uno, lógicamente
  79. if ( $samples < 1 ) {
  80.     die "FATAL: -s min number of samples = 1 !!\n";
  81. }
  82.  
  83. # el número de muestras debe ser múltiplo de 1, 2 o 5
  84. my $chk_samples = $samples;
  85. while ( $chk_samples >= 10 ) {
  86.     $chk_samples /= 10;
  87. }
  88. if ( ( $chk_samples != 1 ) and ( $chk_samples != 2 ) and ( $chk_samples != 5 ) ) {
  89.     die "FATAL: -s number of samples not in step 1,2 or 5 !!\n";
  90. }
  91.  
  92. # open serial device
  93. # abrimos el dispositivo serie
  94.  
  95. # cálculo del tiempo máximo
  96. my $timeout = ($samples+2) * 40;
  97. if ( $timeout > 255 ) {
  98.     $timeout = 255
  99. }
  100.  
  101. # llamamos al comando stty con la configuración de velocidad y
  102. # demás parámetros de como queremos que sea la comunicación
  103. system ( "stty 19200 raw – hupcl ignbrk –onlcr –iexten –echo –echoe –echonl
  104. -echoctl –echoke –echok min 0 time $timeout –crtscts <$device") and die "Can\'t initialize \"$device\"!\n";
  105.  
  106. # abrimos el dispositivo en modo lectura/escritura
  107. open SR620, "+<$device" or die "Can\'t open device \"$device\"!\n";
  108.  
  109. # lo bloqueamos de forma exclusiva
  110. flock ( SR620, LOCK_EX|LOCK_NB ) || die "FATAL: Device \"$device\" already in use!\n";
  111.  
  112. #initialize sr620 and do measurement
  113. #inicialización y medida
  114.  
  115. #$cmd = sprintf "*rst; locl 1; term 1,0; levl 1,1.2; armm 1; size %f; term 2,%d; levl 2,%f; mode 0; jttr 0", $samples, $imp_value, $trigger_level;
  116.  
  117. do {   # repetir...
  118.  
  119.     # fichero resultado, lo abrimos en modo añadir
  120.     open FILE, ">>fg5_offset.dat" or die "FATAL: Cant open file!!";
  121.  
  122.     # composición del comando a enviar
  123.     # basada en una plantilla
  124.     $cmd = sprintf "locl 1; term 1,0; levl 1,1.2; arm 1; size %f; term 2,%d; levl 2,%f;
  125. mode 0; jttr 0", $samples, $imp_value, $trigger_level;
  126.     ( $verbose ) && print "CMD: $cmd\n";    # informamos al usuario
  127.     print SR620 "$cmd\n";                   # y lo mandamos
  128.  
  129.     # otro comando
  130.     $cmd =sprintf "autm 0; meas? 0; meas? 1; meas? 2; meas? 3";
  131.     ( $verbose ) && print "CMD: $cmd\n";    # ídem
  132.     print SR620 "$cmd\n";                   # ídem
  133.     $answer = <SR620>;                      # aquí leemos lo que nos dice
  134.  
  135.     $cmd = sprintf "xall?";                 # otro comando
  136.     ( $verbose ) && print "CMD: $cmd\n";    # ídem
  137.     print SR620 "$cmd\n";
  138.     $answer = <SR620>;                      # lo mismo, obtenemos resultado
  139.  
  140.     # si la respuesta comienza con un número o con un '-'
  141.     if ( ( defined $answer ) and ( $answer =~ /^\d|-/ ) ) {
  142.         ( $verbose ) && print $answer;      # la mostramos
  143.         # dividimos la respuesta por sus comas
  144.         ( $mean, $rel, $std, $min, $max ) = split /,/, $answer;
  145.  
  146.         # si el promedio está definido
  147.         if ( defined $mean ) {
  148.             # obtenemos la hora y fecha de ahora mismo
  149.             ($sec,$minu,$hour,$day,$month,$year) = gmtime(time);
  150.             # y lo sacamos en pantalla
  151.             printf "%04d.%02d.%02d %02d:%02d:%02d %.3f %.0f\n", $year+1900, $month+1, $day, $hour, $minu, $sec, $mean*1e9, $std*1e12;
  152.             # y al fichero
  153.             printf FILE "%04d.%02d.%02d %02d:%02d:%02d %.3f %.0f\n", $year+1900, $month+1, $day, $hour, $minu, $sec, $mean*1e9, $std*1e12;
  154.         }
  155.     }
  156.     else {
  157.         # si no, quizás pasó demasiado tiempo
  158.         print "Timeout!!\n";
  159.     }
  160.  
  161.     $cmd = sprintf "locl 0; size 1; autm 1";  # otro comando
  162.     print SR620 "$cmd\n";                     # que enviamos
  163.     close FILE;                               # y cerramos el fichero
  164. } while (1);  # ... para siempre
  165.  
  166. close SR620;
  167.  
  168. # Mensaje de ayuda
  169. sub help_die {
  170.     printf STDERR "usage: $PROG_NAME\n\t-h ( for a short help )\n";
  171.     printf STDERR "\t-d serial device\n";
  172.     printf STDERR "\t-s number of samples\n";
  173.     printf STDERR "\t-t trigger level of input B\n";
  174.     printf STDERR "\t-I input impedance of input [50|1M|UHF] B\n";
  175.     printf STDERR "\t-v verbose\n";
  176.     die "\t-V print program version\n";
  177. }
Había algunos errores. Faltaba un ';', y las comillas simples y dobles estaban todas mal.
__________________
JF^D Perl Programming en Español

Última edición por jferrero; 22/10/2010 a las 02:13