2012-02-23 25 views
6

La siguiente es una biblioteca para comunicaciones en serie a través de PHP: http://www.phpclasses.org/package/3679-PHP-Communicate-with-a-serial-port.html. El problema es que el método readPort no está completamente implementado. Puede leer en un entorno * nix, pero aparentemente no en un entorno de Windows. El método:PHP - Lectura del puerto COM desde Windows

/** 
* Reads the port until no new datas are availible, then return the content. 
* 
* @pararm int $count number of characters to be read (will stop before 
* if less characters are in the buffer) 
* @return string 
*/ 
function readPort ($count = 0) 
{ 
    if ($this->_dState !== SERIAL_DEVICE_OPENED) 
    { 
     trigger_error("Device must be opened to read it", E_USER_WARNING); 
     return false; 
    } 

    if ($this->_os === "linux") 
    { 
     $content = ""; $i = 0; 

     if ($count !== 0) 
     { 
      do { 
       if ($i > $count) $content .= fread($this->_dHandle, ($count - $i)); 
       else $content .= fread($this->_dHandle, 128); 
      } while (($i += 128) === strlen($content)); 
     } 
     else 
     { 
      do { 
       $content .= fread($this->_dHandle, 128); 
      } while (($i += 128) === strlen($content)); 
     } 

     return $content; 
    } 
    elseif ($this->_os === "windows") 
    { 
     /* Do nohting : not implented yet */ 
    } 

    trigger_error("Reading serial port is not implemented for Windows", E_USER_WARNING); 
    return false; 
} 

El autor afirma:

==>/\ ADVERTENCIA/\:!! Está funcionando con Linux para r/w, pero con ventanas sólo he sido capaz de hacer que escribir funcione Si es usuario de Windows , intente acceder al puerto serie a través de la red con serproxy .

La limitación de la biblioteca de clases PHP ya se ha mencionado en SO varias veces. No he encontrado una solución decente. La lectura es imprescindible para mi aplicación.

¿Alguien aquí sabe qué hacer?

Respuesta

3

Si puede garantizar que está en Windows, podría recomendar un enfoque interesante: Use COM (como en, COM de Microsoft, no puerto serie) o .NET.

Hay una clase .NET gratuita que utilizo regularmente llamada CommStudio Express. He encontrado que es muy confiable, pero siempre puedes usar el standard SerialPort class integrado en .NET si no necesitas worry about a USB-to-serial adapter getting unplugged randomly.

En cualquier caso, es bastante fácil de get at a .NET class in PHP with the DOTNET class:

$serial = new DOTNET('system', 'System.IO.Ports.SerialPort'); 
$serial->PortName = 'COM3'; 
$serial->Open(); 

No he probado este código (no en Windows por el momento), pero algo así debería funcionar bien. Luego puede proceder a usar todos los métodos regulares de .NET dentro de PHP.

+0

La solución necesita funcionar en Windows, * Nix, etc. Parece que debería mirar en Java, pero la aplicación web ya se está construyendo en PHP. Es por eso que estoy esperando una solución PHP. La clase .NET a la solución PHP suena tentadora, pero ¿se trata de una solución puramente de Windows? ¿Podría aprovechar una clase .NET en * nix, Mac, etc. entorno? – StackOverflowNewbie

+0

No, las soluciones .NET y COM (nuevamente, el puerto COM de Microsoft no son en serie) son solo de Windows. Sin resumir esto con diferentes métodos para diferentes sistemas, no tengo una solución. Parece que definitivamente debería haber una manera sin embargo. No hay una forma bastante estándar de abrir un dispositivo, ¿verdad? Soy muy poco familiar en los niveles inferiores de PHP desde esta perspectiva. – Brad

+0

Por lo que vale, debe especificar los detalles completos del ensamblado: '$ serial = new DOTNET ('Sistema, Versión = 2.0.0.0, Cultura = neutro, PublicKeyToken = b77a5c561934e089', 'System.IO.Ports.SerialPort') ; '. Sin embargo, el método Open no es COM visible (con el error "com_exception: no se pudo crear una instancia del objeto .Net [Unwrapped, QI para IDispatch] [0x80004002] No se admite esa interfaz"), así que ... No creo que esto trabaje sin escribir un contenedor .net para exportarlo. – scipilot

0

No, DOTNET bloquea el puerto COM. Necesita reiniciar la computadora para detectar nuevamente o los usuarios avanzados generalmente desinstalan e instalan Arduino.

Cuestiones relacionadas