• Publicidad

Socket con dispositivo serial/ethernet

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Socket con dispositivo serial/ethernet

Notapor vasko » 2010-08-26 19:02 @834

Hola.

Estoy intentando enviar datos (hexadecimales) desde un microcontrolador conectado a un dispositivo (Digione SP) por una entrada serie. Este dispositivo tiene una salida ethernet la cual está conectada a un enrutador que le asigna una IP.

En un servidor conectado al enrutador tengo el siguiente código para crear un socket TCP que quede escuchando.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2. use IO::Socket;
  3.  
  4. my $server = IO::Socket::INET->new(
  5.     Proto       => 'tcp',
  6.     LocalPort   =>  5800,
  7.     Listen      =>  1,
  8.     Reuse       =>  1,
  9. );
  10.  
  11. die "No puedo configurar servidor" unless $server;
  12. print "Server $0 aceptando clientes...\n";
  13.  
  14. $|++;
  15.  
  16. while( $cliente = $server->accept() ) {
  17.     $cliente->autoflush(1);
  18.     print "Conectado cliente";
  19.     while(  defined( $line = <$cliente> )  ) {
  20.         print $line;
  21.     }
  22.     close $cliente;
  23. }
  24.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

en tanto el dispositivo (DigiOne) lo configuro como un cliente TCP que se conecta al servidor.

El asunto es que cuando se conecta el DigiOne establece conexión con el servidor pero después, a medida que voy enviando datos desde el microcontrolador, me tira basura, y no los datos hexadecimales.

Probé creando un script cliente que enviara datos al socket (como está en los ejemplos de este foro) y los envía bien, pero no así cuando uso el DigiOne como cliente.

Ojalá se entienda.

Gracias de antemano.
vasko
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2010-08-26 18:04 @794

Publicidad

Re: Socket con dispositivo serial/ethernet

Notapor explorer » 2010-08-27 04:08 @213

Bienvenido a los foros de Perl en Español, vasko.

Es extraño: dices que funciona durante un tiempo, pero que luego empieza a enviar basura. Y que si lo haces con un cliente Perl, funciona perfectamente.

Bueno, eso me da a pensar que la parte servidor no es el problema, si no que es el aparato DigiOne, que, por alguna razón, no envía bien los datos.

O... que el DigiOne sí está enviando los datos correctos, y lo que ha cambiado son los datos/velocidad/protocolo de la parte serie. La parte ethernet la gestiona el sistema operativo y el hardware asociado a la red, por lo que sería muy raro que hubiese un fallo ahí: no te funcionaría la red ni con el DigiOne ni con nada. Así que creo que el problema está en la parte serie.

¿Has probado a conectar el serie a un ordenador para comprobar que está enviando los datos de forma correcta durante un cierto tiempo?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Socket con dispositivo serial/ethernet

Notapor vasko » 2010-08-30 13:57 @623

Gracias por la respuesta.

Probé que los datos enviados por el serie son los correctos. Logré ver los datos que quería. Como el script server lo ejecuto en un terminal me mostraba la mayoría de los datos mal codificados. (Me equivoqué al creer que eran basura)
Usando:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use utf8;
binmode STDOUT, ":utf8";
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

solucioné eso y veo los datos correctos.

Ahora el problema es que los datos no van llegando de uno en uno. Sino que llegan todos agrupados. A medida que envío datos desde el dispositivo serie no me aparecen inmediatamente en el server, sino que responde con demora imprimiendo a veces de a 5 datos juntos otras veces de 30 o más datos juntos.

Probé con un socket en Python y me funciona dándome los datos de uno en uno a medida que envío desde el serie. Pero yo necesito y quiero que funcione con Perl.

Saludos y gracias nuevamente.
vasko
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2010-08-26 18:04 @794

Re: Socket con dispositivo serial/ethernet

Notapor explorer » 2010-08-30 14:30 @646

Es muy posible que el 'use utf8;' no te sirva de nada, porque solo sirve para indicar que el propio programa Perl está escrito en esa codificación. No tiene nada que ver con la codificación de los flujos de datos.

En cuanto a recibir de uno en uno, quizás lo resuelvas cambiando el operador diamante ($line = <$cliente>) por la de read(). Tal como lo tienes ahora, el operador diamante no vuelve hasta que se recibe un carácter de final de línea.

Por ejemplo, para recibir de uno en uno: read $cliente, $line, 1;.

Como ya tienes el caché desactivado ($|=1), el print() sacará el carácter inmediatamente.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Socket con dispositivo serial/ethernet

Notapor vasko » 2010-09-10 16:59 @749

Ahora me funcionó muy bien con el: read $cliente, $line, 1;

¡Muchas gracias por la ayuda!
vasko
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2010-08-26 18:04 @794


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: Google [Bot] y 9 invitados

cron