Pregunta

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

No puedo ver el código de la primera solución, ya que está compilado en un .dll (tiene sentido, de lo contrario la gente puede editar el retraso y no comprarlo ...) y la segunda parece usar solo fopen () para abrir el puerto y luego fwrite () para escribir, tal como se haría con una secuencia. Pero, aparentemente, no es nada devuelto.

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.

¿Alguna idea?

¿Fue útil?

Solución

Todas las soluciones anteriores son ineficientes o requieren 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 consígalo y haga phpize / configure / make / make cosa de instalación.

No sé si debería usarse en una sesión de Apache, pero hágalo.

Otros consejos

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

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

Otra forma posible sería utilizar la API de Win32 a través de algo como w32api_register_function () o ffi y luego use llamadas de comunicaciones en serie para que funcione en Windows.

Tuve el mismo problema y ya consideré escribir mi propia extensión php cuando encontré 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 para / desde los puertos serie y me permitieron usar las funciones de socket php para comunicarme con él.

Debe configurar el puerto com utilizando un comando similar a DOS.

Por ejemplo, la siguiente línea ejecuta el comando a través de php:

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

Para mostrar los resultados que puede usar:

echo "$output"; 

Crear la identificación 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";

Quizás alguien pueda ayudarme con el problema de fgets . Se acumula allí durante exactamente un minuto si TO = on , o se acumula allí para siempre si TO = off . Parece ser un " MODE COM " opción, por lo que tal vez un experto en DOS pueda ayudar.

Quizás en lugar de fgets , uno debería usar fgetc , ya que fgets captura hasta la nueva línea , mientras fgetc captura un solo carácter. Si no se encuentra una nueva línea, puede bloquearse hasta que haya una o hasta que el búfer se vacíe. El retraso de un minuto puede ser que las ventanas vacíen su búfer en un intervalo.

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 también para uso COM. 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 sobre la comunicación directa.

Si desea tratar con sms usando el puerto com, aquí está el clase de comunicación serial php de R & # 233; my Sanchez con código de muestra de google . Aquí hay un hilo que incluye ese tema.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top