serie serial puerto leer extension example bascula php serial-port communication
No seguro para subprocesos (para IIS)Thread-safe (para Apache)

puerto - Comunicación serial con PHP en Windows



php serial extension (7)

Estoy buscando una forma de comunicarse con el puerto COM serie RS232 en Windows. He encontrado 2 soluciones en la red, una que no es totalmente gratuita (introduce retrasos deliberados en la función) y otra con capacidad limitada en Windows. Este último solo puede escribir en un puerto COM en Windows, no leerse.

No puedo ver el código de la primera solución, ya que está compilada en .dll (tiene sentido, de lo contrario la gente puede simplemente editar el retraso y no comprarlo ...) y el segundo parece usar fopen () para abrir el puerto y luego fwrite () para escribir, al igual que haría con una transmisión. Pero al parecer frecuentar no devuelve nada.

Sé que es posible ya que la primera solución lo hizo, aunque requiere que Apache use el módulo php-cgi en lugar de php5module.

¿Algunas ideas?



La forma más fácil de abordar esto sería escribir un programa en otro idioma (como C ++) y luego ejecutarlo desde su script php con system() . Hacer Comm I / O en C ++ es trivial.

Esto supone que tienes suficiente acceso al servidor para configurarlo para permitir que el ejecutable sea ejecutado por php, etc.


Otra opción es usar un objeto a través de ActiveX en Windows. Hay varios objetos seriales, en su mayoría comerciales, para COM en Windows. También puede exponer un objeto basado en .Net y registrarlo para uso COM también. Por supuesto, esto supone que tiene control en el servidor para registrar un control COM, ya que necesitaría una interfaz en serie.

Otro problema es la contención de recursos si se usa a través de la Web. Si esto es para una impresora en serie, por ejemplo, entonces un administrador de colas de impresión sería su mejor opción en lugar de la comunicación directa.


Tuve el mismo problema y ya consideré escribir mi propia extensión de PHP cuando me encontré con esta solución que es popular entre los desarrolladores de Arduino: ''serproxy'' (la encontré en muchos lugares, es decir, http://www.lspace.nildram.co. uk / freeware.html ) configura una pila tcp desde / hacia los puertos serie y me permitió usar las funciones de socket php para comunicarme con ella.


Necesitas configurar el com con un comando dos como:

$output = `mode COM1: BAUD=115200 PARITY=N data=8 stop=1 XON=off TO=on `;

El siguiente comando ejecuta el comando dos a través de php:

echo"$output";

Crea la ID del recurso:

$fp = fopen(''COM1'', ''r+''); if(!$fp){ echo"Port not accessible"; }else{ echo"Port COM1 opened successfully"; }

Escribir en el puerto:

$writtenBytes = fputs($fp, "Hello"); echo"Bytes written to port: $writtenBytes";

Leer desde el puerto:

$buffer = fgets($fp); echo"Read from buffer: $buffer";

Tal vez alguien me ayude con el problema de los Fgets. Se apila allí durante exactamente un minuto si TO = encendido o se acumula allí para siempre si TO = apagado. Parece ser una opción "MODE COM", por lo que quizás un experto en DOS pueda ayudar.

Quizás en lugar de fgets, uno debería usar fgetc, ya que fgets captura a través de la nueva línea. Si no se encuentra una nueva línea, puede bloquearse hasta que haya una o hasta que se vacíe el búfer. La demora de un minuto puede ser que Windows descargue su búfer en un intervalo.


Cada solución anterior es ineficaz o demasiado trabajo.

Puede usar la biblioteca PHP-DIO (dio_fcntl, dio_open, dio_read, dio_write, dio_seek, ...). También está en la entrada del manual de PHP para DIO :

Este paquete PECL no está disponible por defecto. Para obtenerlo para Windows, si tiene PHP 5.2.x mayor que 5.2.6, puede descargarlo como parte de un ZIP:

Ambos enlaces se encontraron en http://www.deveblog.com/index.php/download-pecl-extensions-for-windows/

Aquí está la compilación de Linux , solo obténgala y haga lo de phpize / configure / make / make install.

No sé si debería usarse en una sesión de Apache, pero apúntate.