Foros del Web » Programando para Internet » Python »

[SOLUCIONADO] Leer Puerto serial RS232

Estas en el tema de Leer Puerto serial RS232 en el foro de Python en Foros del Web. Hola, estoy intentando llamar este código con PHP a través de la función exec() pero no logro que lo que lee Python sea enviado de ...
  #1 (permalink)  
Antiguo 05/10/2012, 21:07
 
Fecha de Ingreso: agosto-2009
Mensajes: 13
Antigüedad: 15 años, 3 meses
Puntos: 0
Exclamación Leer Puerto serial RS232

Hola, estoy intentando llamar este código con PHP a través de la función exec() pero no logro que lo que lee Python sea enviado de vuelta a PHP, sin embargo cuando lo ejecuto en la Terminal lee sin problemas. He intentado de mil formas, guardando en un .txt pero no me da resultado, a ver si alguien me puede orientar o ayudar con esto.

Código:
import serial
from time import sleep

port = "/dev/ttyS0"
ser = serial.Serial(port, 19200, timeout=0, bytesize=8, stopbits=1)
ser.parity=serial.PARITY_NONE

while True:
    data = ser.read(9999)
    if len(data) > 0:
        print 'Datos Recibidos:', data

    sleep(0.5)
    print 'not blocked'

ser.close()
Gracias.
  #2 (permalink)  
Antiguo 05/10/2012, 22:38
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: Leer Puerto serial RS232

No se que tengas en el archivo php que lo ejecutas.

Pero tienes que hacer algo mas o menos así.

Código Php:
Ver original
  1. $output = exec('python tuscript.py');
  2. echo $output;
  #3 (permalink)  
Antiguo 06/10/2012, 12:48
 
Fecha de Ingreso: agosto-2009
Mensajes: 13
Antigüedad: 15 años, 3 meses
Puntos: 0
Respuesta: Leer Puerto serial RS232

Hola razpeitia, primero que todo muchas gracias por tu respuesta y darte el tiempo de ver mi publicación. Te comento que ese código es lo que tengo, y me devuelve un Array vacio PHP.

Como antecedente, lo que leo a través del puerto es una bascula, que envía muuuuchos números del peso por segundo, te adjunto acá una foto:



Eso ocurre escribiendo esto en la terminal:

Código:
python /var/www/Python/con1.py
Sin embargo PHP no me muestra absolutamente nada. Alguna idea de como solucionar este enigma que me tiene acorralado?

Saludos y gracias.
  #4 (permalink)  
Antiguo 06/10/2012, 13:24
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: Leer Puerto serial RS232

Acabo de checar tu código junto con el arreglo vació que envías y ahora veo que es lógico por que nunca te devuelve nada y es que tu script nunca termina.

Lo que debes de hacer es quitarle el while True al script para que solo lea una vez. Te quedaría así:
Código Python:
Ver original
  1. import serial
  2.  
  3. port = "/dev/ttyS0"
  4. ser = serial.Serial(port, 19200, timeout=0, bytesize=8, stopbits=1)
  5. ser.parity=serial.PARITY_NONE
  6. data = ser.read(9999)
  7. if len(data) > 0:
  8.     print 'Datos Recibidos:', data
  9. else:
  10.     print 'Datos no recibidos'
  11. ser.close()

Otra opción mas compleja seria dejar siempre corriendo el proceso y guardar los datos en un archivo o en un pequeña db como sqlite.
  #5 (permalink)  
Antiguo 06/10/2012, 13:33
 
Fecha de Ingreso: agosto-2009
Mensajes: 13
Antigüedad: 15 años, 3 meses
Puntos: 0
Respuesta: Leer Puerto serial RS232

Cita:
Iniciado por razpeitia Ver Mensaje
Acabo de checar tu código junto con el arreglo vació que envías y ahora veo que es lógico por que nunca te devuelve nada y es que tu script nunca termina.

Lo que debes de hacer es quitarle el while True al script para que solo lea una vez. Te quedaría así:
Código Python:
Ver original
  1. import serial
  2.  
  3. port = "/dev/ttyS0"
  4. ser = serial.Serial(port, 19200, timeout=0, bytesize=8, stopbits=1)
  5. ser.parity=serial.PARITY_NONE
  6. data = ser.read(9999)
  7. if len(data) > 0:
  8.     print 'Datos Recibidos:', data
  9. else:
  10.     print 'Datos no recibidos'
  11. ser.close()

Otra opción mas compleja seria dejar siempre corriendo el proceso y guardar los datos en un archivo o en un pequeña db como sqlite.
Ahora dice "Datos no recibidos" pero en el python, php sigue sin traer esos datos :/ he probado mil maneras, todo lo que he encontrado en internet y no he podido hacerlo. Como es posible dejar corriendo un proceso como dices? Saludos y gracias
  #6 (permalink)  
Antiguo 06/10/2012, 13:43
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: Leer Puerto serial RS232

Probablemente no le estas dando suficiente tiempo para que haga la lectura, ademas que el buffer de lectura que le das es muy grande, para que se llene en una sola lectura. Prueba con lo siguiente.

Código Python:
Ver original
  1. import serial
  2.  
  3. port = "/dev/ttyS0"
  4. ser = serial.Serial(port, 19200, timeout=1, bytesize=8, stopbits=1) #Time out 1 segundo
  5. ser.parity=serial.PARITY_NONE
  6. try:
  7.     data = ser.read(1)
  8. except serial.SerialTimeoutException:
  9.     data = ""
  10. if len(data) > 0:
  11.     print 'Datos Recibidos:', data
  12. else:
  13.     print 'Datos no recibidos'
  14. ser.close()

Ademas te recomiendo usar popen en php para que puedas leer la salida del script de python.
Fuente: Stackoverflow
  #7 (permalink)  
Antiguo 06/10/2012, 13:52
 
Fecha de Ingreso: agosto-2009
Mensajes: 13
Antigüedad: 15 años, 3 meses
Puntos: 0
Respuesta: Leer Puerto serial RS232

Cita:
Iniciado por razpeitia Ver Mensaje
Probablemente no le estas dando suficiente tiempo para que haga la lectura, ademas que el buffer de lectura que le das es muy grande, para que se llene en una sola lectura. Prueba con lo siguiente.

Código Python:
Ver original
  1. import serial
  2.  
  3. port = "/dev/ttyS0"
  4. ser = serial.Serial(port, 19200, timeout=1, bytesize=8, stopbits=1) #Time out 1 segundo
  5. ser.parity=serial.PARITY_NONE
  6. try:
  7.     data = ser.read(1)
  8. except serial.SerialTimeoutException:
  9.     data = ""
  10. if len(data) > 0:
  11.     print 'Datos Recibidos:', data
  12. else:
  13.     print 'Datos no recibidos'
  14. ser.close()

Ademas te recomiendo usar popen en php para que puedas leer la salida del script de python.
[URL="http://stackoverflow.com/a/167200/371342"]Fuente: Stackoverflow[/URL]
Muchas gracias nuevamente por tu tiempo, te cuento que justo antes de que me dieras este codigo habia probado lo mismo, pero de la siguiente manera:

Código Python:
Ver original
  1. import serial
  2. import time
  3.  
  4. port = "/dev/ttyS0"
  5. ser = serial.Serial(port, 19200, timeout=0, bytesize=8, stopbits=1)
  6. ser.parity=serial.PARITY_NONE
  7.  
  8. time.sleep(1)
  9. data = ser.readline(9999)
  10. if len(data) > 0:
  11.     print 'Datos Recibidos:', data
  12. else:
  13.     print 'Datos no recibidos'
  14. ser.close()

Dandole un time.sleep de 1 segundo, el problema es que ademas del numero me agrega unos caracteres raros, te muestro:



Y con el codigo que tu me indicas, me lo muestra de esta manera:



Con el time.sleep me he acercado mas a lo que busco, pero sin embargo no me da el valor solo, sino con simbolos extraños.

Alguna idea de lo que pueda ser?

Saludos y muchas gracias.
  #8 (permalink)  
Antiguo 06/10/2012, 14:09
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: Leer Puerto serial RS232

Bueno es que eso depende de que estas leyendo recibiendo en el puerto serial.

Estas leyendo de un dispositivo? Si es así de que dispositivo? probablemente tengan un protocolo o un formato de como enviar y recibir datos por el serial.

He trabajado con el puerto serial enviando señales a un impresora POS y también con un aceptador de billetes. Y cada dispositivo tiene su propio formato para enviar señales.
  #9 (permalink)  
Antiguo 06/10/2012, 14:11
 
Fecha de Ingreso: agosto-2009
Mensajes: 13
Antigüedad: 15 años, 3 meses
Puntos: 0
Respuesta: Leer Puerto serial RS232

Cita:
Iniciado por razpeitia Ver Mensaje
Bueno es que eso depende de que estas leyendo recibiendo en el puerto serial.

Estas leyendo de un dispositivo? Si es así de que dispositivo? probablemente tengan un protocolo o un formato de como enviar y recibir datos por el serial.

He trabajado con el puerto serial enviando señales a un impresora POS y también con un aceptador de billetes. Y cada dispositivo tiene su propio formato para enviar señales.
Estoy trabajando con una báscula, para pesar camiones, solo necesito leer, nada mas :(
  #10 (permalink)  
Antiguo 06/10/2012, 14:14
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: Leer Puerto serial RS232

Cita:
Iniciado por dlandsk Ver Mensaje
Estoy trabajando con una báscula, para pesar camiones, solo necesito leer, nada mas :(
Para eso necesitas saber en que formato te esta enviando los datos la bascula.
¿Marca y modelo de la bascula?
  #11 (permalink)  
Antiguo 06/10/2012, 14:47
 
Fecha de Ingreso: agosto-2009
Mensajes: 13
Antigüedad: 15 años, 3 meses
Puntos: 0
Respuesta: Leer Puerto serial RS232

Cita:
Iniciado por razpeitia Ver Mensaje
Para eso necesitas saber en que formato te esta enviando los datos la bascula.
¿Marca y modelo de la bascula?
Mira! he logrado obtener solo el numero en la consola de python segun mis necesidades:

Código Python:
Ver original
  1. import serial
  2. import time
  3.  
  4. port = "/dev/ttyS0"
  5. ser = serial.Serial(port, 19200, timeout=0, bytesize=8, stopbits=1)
  6. ser.parity=serial.PARITY_NONE
  7.  
  8. time.sleep(0.2)
  9. data = ser.readline()
  10. data = data.replace("+", "")
  11. data = data.replace('\r\n', "")
  12. import re
  13. data = re.sub("\D", "", data)
  14.  
  15.  
  16. if len(data) > 0:
  17.     print data[-7:]
  18.  
  19. else:
  20.     print 'Datos no recibidos'
  21. ser.close()

Ahora el problema es que en PHP usando popen me devuelve de resultado:

Resource id #2

Saludos y gracisa
  #12 (permalink)  
Antiguo 06/10/2012, 15:58
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: Leer Puerto serial RS232

Para php puedes checar la documentación de popen.

Al parecer es bastante sencillo.
  #13 (permalink)  
Antiguo 06/10/2012, 17:01
 
Fecha de Ingreso: agosto-2009
Mensajes: 13
Antigüedad: 15 años, 3 meses
Puntos: 0
Respuesta: Leer Puerto serial RS232

No es tan fácil hehe ya que no hay forma de que logre que PHP me lea lo que arroja Python :( he probado con popen, system, proc_open, exec, etc y nada :(
  #14 (permalink)  
Antiguo 06/10/2012, 17:06
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: Leer Puerto serial RS232

Es por que tienes un error en la linea 13 de código *sarcasmo*.
  #15 (permalink)  
Antiguo 06/10/2012, 20:14
 
Fecha de Ingreso: agosto-2009
Mensajes: 13
Antigüedad: 15 años, 3 meses
Puntos: 0
Respuesta: Leer Puerto serial RS232

Que error???
  #16 (permalink)  
Antiguo 06/10/2012, 20:36
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: Leer Puerto serial RS232

Me sorprendió que no te dieras cuenta que no has puesto como estas haciendo eso en php.

Código PHP:
Ver original
  1. <?php
  2.     $process = popen("python /ruta/a/al/script.py", "r");
  3.     echo fread($process, 1000);
  4. ?>
  #17 (permalink)  
Antiguo 06/10/2012, 20:51
 
Fecha de Ingreso: agosto-2009
Mensajes: 13
Antigüedad: 15 años, 3 meses
Puntos: 0
Respuesta: Leer Puerto serial RS232

Lo probe con lo que me envias y nada... este es mi codigo php

Código PHP:
<?php


error_reporting
(E_ALL);

    
$process popen("python /var/www/Python/con1.py""r");
    echo 
fread($process1000);



$handle = @fopen("/var/www/Python/output.txt""r");
if (
$handle) {
    while ((
$buffer fgets($handle4096)) !== false) {
        echo 
$buffer;
    }
    if (!
feof($handle)) {
        echo 
"Error: unexpected fgets() fail\n";
    }
    
fclose($handle);
}

?>
Como puedes ver en la segunda parte del código, leo el archivo .txt que actualiza Python cuando se ejecuta. El problema que PHP no hay caso que ejecute ese Python, ya no me interesa que me devuelva la información, simplemente que lo ejecute y así actualice el txt que yo leo posteriormente con php y que funciona :(
  #18 (permalink)  
Antiguo 06/10/2012, 21:05
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: Leer Puerto serial RS232

Recuerda darle permisos de ejecución a tu archivo:
Código:
$ sudo chmod +x /var/www/Python/con1.py
  #19 (permalink)  
Antiguo 06/10/2012, 22:22
 
Fecha de Ingreso: agosto-2009
Mensajes: 13
Antigüedad: 15 años, 3 meses
Puntos: 0
Respuesta: Leer Puerto serial RS232

Nada, al parecer mi problema es de permisos en apache y php, estoy buscando información dentro del foro

Editado Solución: Luego de buscar y busca y buscar.. no encontre nada jajajaja, un gran amigo entro en el server y le dio permisos al puerto así:

Código:
sudo chmod o+rwx /dev/ttyS0
y listo, problema solucionado, espero que le sirva a alguien :)

Última edición por dlandsk; 07/10/2012 a las 10:02 Razón: solución encontrada

Etiquetas: puerto, rs232, serial
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:16.