W&T conecta
Interfaces para TCP/IP, Ethernet, RS-232, RS-485, USB, 20mA, fibra óptica de vidrio y de plástico, http, SNMP, OPC, Modbus TCP, I/O digital, I/O analógico, ISA, PCI

Aplicación:

Acceso a la interfaz serial con PHP


A continuación se explica como acceder a una interfaz serial de la pure.box con un sencillo script en PHP, por ejemplo para controlar una estación meteorológica.

En muchos casos, cuando se utiliza un terminal serial, es necesaria la comunicación permanente con un PC en el que esté instalado el software de control. Por ejemplo, una estación meteorológica con conexión serial, que necesite utilizar un ordenador como logger de datos las 24 horas del día para poder registrar la serie continua de mediciones. pure.box podría reducir claramente el coste, la energía y el espacio de esa estructura, utilizada en muchos lugares.

Para, por ejemplo, consultar y recibir la temperatura actual cada minuto sólo se requiere ese pequeño script en PHP que la pure.box tiene que iniciar cíclicamente.

						
						<?php
						$fd = dio_open( '/dev/ttyS1', O_RDWR );
						dio_tcsetattr( $fd, array(
												'baud'         => 9600,
												'bits'         => 8,
												'stop'         => 1,
												'parity'       => 0,
												'flow_control' => 0,
												'is_canonical' => 0	));
						dio_write( $fd, 'temperatur?' );
						$input = '';
						while( strlen( $input ) <= 10 )
							{
							$input .= dio_read( $fd, 1 );
							}
						echo $input;
						dio_close( $fd );
						?>
					
				

Una vez iniciado el script se ejecutan las siguientes acciones:

  • Abre la interfaz serial de la pure.box2 para el acceso de lectura y escritura.
  • El formato serial se configura a 9600 baudios, 8 bits de datos, 1 bit de stop, sin paridad, sin handshake de software.
  • Al cambiar el parámetro is_canonical a 0 se transmite directamente al PHP cada carácter recibido en la interfaz serial. Si ese parámetro está configurado a 1, la transmisión tiene lugar sólo después de recibirse un carácter de cambio de línea.
  • Para solicitar la temperatura actual se envía la cadena de caracteres "temperatur?" al dispositivo conectado en la interfaz serial.
  • Se reciben 10 caracteres, que seguidamente son emitidos.
  • A continuación se cierra de nuevo la interfaz serial.

El valor de temperatura recibido puede ser guardado por ejemplo en la base de datos MySQL o SQLite interna de la box, o bien ser reenviado por la red a un servidor de procesamiento.

Cargue ese script vía FTP o SMB en la carpeta websites Para probar la pure.box también puede ejecutarla en el navegador:

http://<IP der pure.box 2>/websites/<Dateiname des Skriptes>

La ejecución cíclica por la pure.box puede ser configurada tras la descarga en la gestión basada en la web de la box. Para ello navegue en la estructura del menú hasta Mis Archivos y marque en las Propiedades del archivo una ejecución temporizada.

En el script mostrado más arriba se presupone que la respuesta tiene una longitud fija Si no fuese el caso, la rutina de lectura podría terminar tras la recepción de un carácter final determinado.

Y para prevenir también los casos de respuestas vacías o incompletas se tiene que integrar un timeout que finalice automáticamente al concluir el proceso de lectura.

					
						<?php
						$TIMEOUT = 10;
						$fd = dio_open( '/dev/ttyS1', O_RDWR | O_NONBLOCK );
						dio_tcsetattr( $fd, array(
												'baud'       => 9600,
												'bits'       => 8,
												'stop'       => 1,
												'parity'     => 0,
												'flow_control' => 0,
												'is_canonical' => 0	));
						dio_write( $fd, 'tempertur?' );
						$input = '';
						$time_start = time();
						while($time_start + $TIMEOUT > time())
							{
							$input .= dio_read( $fd );
							usleep( 100000 );
							}
						echo $input;
						dio_close( $fd );
						?>
					
				

Al contrario que en el primer ejemplo de script, la interfaz se abre aquí no bloqueante. Mientras la ejecución del script del primer ejemplo se mantiene en la línea $input .= dio_read($fd, 1); hasta que se lee un carácter, en el segundo ejemplo se salta la línea $input .= dio_read($fd);cuando no se recibe ningún carácter serial en el buffer de entrada. La salida del bucle de lectura tiene lugar aquí por control de tiempo. La duración del proceso de lectura está fijado en la variable $TIMEOUT.

La salida del bucle de espera permite el tratamiento de errores y asegura un rendimiento constante.