2012-04-29 15 views
8

He instalado xampp en fedora 13.I estoy tratando de comunicarme con el microcontrolador a través del puerto serie utilizando la clase de serie php. Mi código es ejemplo.phpcomunicación serie php en linux

include("php_serial.class.php"); 
$serial = new phpSerial(); 
$serial->deviceSet("0"); 

$serial->confBaudRate(9600); //Baud rate: 9600 
$serial->confParity("none"); //Parity (this is the "N" in "8-N-1") 
$serial->confCharacterLength(8); //Character length (this is the "8" in "8-N-1") 
$serial->confStopBits(1); //Stop bits (this is the "1" in "8-N-1") 
$serial->confFlowControl("none"); //Device does not support flow control of any kind, so set it to none. 

//Now we "open" the serial port so we can write to it 
$serial->deviceOpen(); 

$serial->sendMessage("*1"); //sleep(1); // echo "hi"; $serial->deviceClose(); 

?> 

El script php será ejecutado, pero da las siguientes advertencias.

Advertencia: especificado puerto serie no es válido en /opt/lampp/htdocs/xampp/php_serial.class.php en la línea 147 Advertencia: No se puede establecer la velocidad de transmisión: el dispositivo no se establece o se abre en/opt/lampp/htdocs/xampp/php_serial.class.php en la línea 241 Advertencia: no se puede establecer la paridad: el dispositivo no está configurado o abierto en /opt/lampp/htdocs/xampp/php_serial.class.php en la línea 295

... He usado el comando: chmod 0777/dev/ttyUSB0 para otorgar permisos. También traté de agregar el usuario de apache "prudhvi" al grupo de marcación usando el comando: $ usermod -a -g dialout prudhvi

Pero no funciona. Cuando envío un comando directamente desde el terminal usando el comando: echo 1>/dev/ttyUSB0 funciona y '1' se transmite al puerto serie. Pero usando php obtengo las advertencias anteriores.

He usado el "$ whoami" para verificar el nombre del usuario y he agregado ese usuario "prudhvi" al grupo de marcado. Todavía no funciona. Por favor, ayúdenme chicos.

+3

¿Estás seguro de que php está accediendo a ttyUSB0? Podría tratar de usar ttyS0 de manera predeterminada. –

Respuesta

0

Pruebe primero un tipo de script de phlo mundo hello para probar su instalación básica.

Luego, compruebe que el servidor web/motor de php se está ejecutando como un usuario que se encuentra en un grupo al que se permite acceder al archivo de dispositivo/dev/ttyWHATEVER correspondiente al puerto serie. Sería sorprendente que eso fuera cierto por defecto, probablemente tendrá que agregarlo al 'marcador' o grupo similar.

Agregue algunas fallas de comprobación/informes a su código.

2

¿Podría publicar las líneas cerca/relacionadas con "/opt/lampp/htdocs/xampp/php_serial.class.php en la línea 147"?

Sospecho que está tratando de configurar el dispositivo incorrectamente (como Marc indicó). O eso o el puerto ya está siendo utilizado por otras pruebas que está realizando al mismo tiempo. No estoy seguro de si el script que está ejecutando proporciona errores específicos de los puertos a los que está intentando conectar y que ya están en uso.

3

Hice esto una vez con Debian para controlar una placa Arduino con una secuencia de comandos PHP e inicialmente me encontré con el mismo problema.

En Debian, debe agregar el usuario de Apache al grupo de marcado para permitirle realizar solicitudes de conexión en serie. Yo asumiría que lo mismo es cierto para Fedora.

En Debian el comando es:

useradd -G dialout www-data 

Sin embargo creo que los nombres de Fedora del usuario Apache como Apache en su lugar. Yo no tengo una máquina para probar Fedora, pero yo asumiría el comando que necesita para funcionar es:

useradd -G dialout apache 

A continuación, tendrá que reiniciar el servidor XAMPP.

Ver la siguiente referencia:

http://www.cyberciti.biz/faq/howto-linux-add-user-to-group/ http://fedoraproject.org/wiki/Administration_Guide_Draft/Apache#Apache_File_Security

Neal

0

crédito va al comentario de Marc B para lo que me hizo ver esto, y está muerto en: http://www.phpclasses.org/browse/file/17926.html

function deviceSet ($device) 
{ 
    if ($this->_dState !== SERIAL_DEVICE_OPENED) 
    { 
     if ($this->_os === "linux") 
     { 
      if (preg_match("@^COM(\d+):[email protected]", $device, $matches)) 
      { 
       $device = "/dev/ttyS" . ($matches[1] - 1); 
      } 

      if ($this->_exec("stty -F " . $device) === 0) 
      { 
       $this->_device = $device; 
       $this->_dState = SERIAL_DEVICE_SET; 
       return true; 
      } 
     } 
     elseif ($this->_os === "windows") 
     { 
      if (preg_match("@^COM(\d+):[email protected]", $device, $matches) and $this->_exec(exec("mode " . $device)) === 0) 
      { 
       $this->_windevice = "COM" . $matches[1]; 
       $this->_device = "\\.\com" . $matches[1]; 
       $this->_dState = SERIAL_DEVICE_SET; 
       return true; 
      } 
     } 

     trigger_error("Specified serial port is not valid", E_USER_WARNING); 
     return false; 
    } 
    else 
    { 
     trigger_error("You must close your device before to set an other one", E_USER_WARNING); 
     return false; 
    } 
} 

Creo que llamar al $serial->deviceSet("/dev/ttyUSB0"); lo arreglará, b Sin embargo, es posible que tenga que modificar la fuente de php_serial.class.php para trabajar en /dev/ttyUSB en lugar de /dev/ttyS.

Cuestiones relacionadas