Ver Mensaje Individual
  #1 (permalink)  
Antiguo 07/02/2010, 06:09
Avatar de ferny
ferny
Il capo della mafia
 
Fecha de Ingreso: febrero-2002
Ubicación: Al final del cable
Mensajes: 10.080
Antigüedad: 22 años, 9 meses
Puntos: 55
PyS60, problema con timer y recepción de datos por BT

Hola

Estoy haciendo un pequeño programa para PyS60 1.9.7 que corre en mi nokia 5800. Lo que hago es enviar una serie de datos por BT a través de un adaptador BT a RS232 (Bluesmirf) y muestro el resultado en el móvil. Los datos se envían en ráfagas de 16 bytes cada 2 segundos más o menos.

Tengo la siguiente función para leer datos por Bluetooth (nota: lo hago con un timer porque quiero usar la función principal para dibujar la pantalla, y traté de hacerlo con un thread pero en cuanto meto algo de BT dentro del thread se queda como sin hacer nada)

Código Python:
Ver original
  1. # Para leer datos por BT
  2. def lee_bt():
  3.     global BT
  4.     if BT:
  5.         appuifw.e32.reset_inactivity()
  6.         try:
  7.             data = bt_receive_data()
  8.             data = data.encode("hex")
  9.             print("Data = 0x%x" % int(data,16))
  10.         except:
  11.             pass
  12.     my_timer.after(0.1,lee_bt)
  13.  
  14. my_timer = e32.Ao_timer()
  15. my_timer.after(0.1,lee_bt)
  16.  
  17. bt_connect()
  18. BT = True

La función bt_receive_data()

Código Python:
Ver original
  1. def bt_receive_data():
  2.     ###########################################################################
  3.     # Variables globales
  4.     global sock
  5.     buffer = []
  6.     try:
  7.         buffer = sock.recv(16)
  8.     except:
  9.         pass
  10.     return buffer
  11.     ###########################################################################

El problema: si en el buffer del adaptador BT a RS232 hay 16 o más bytes, los lee sin problemas y los va mostrando, el problema está cuando hay menos de 16 bytes. Por ejemplo, si hay 10 bytes, muestra los 10 bytes, pero ya no recibe nunca más, aunque sé que debería haber datos porque los estoy enviando.

Sin embargo, si cambio el tamaño del buffer a 1 en vez de 16, funciona bien, es decir, si no hay datos se queda en "espera", y cuando vuelve a haber datos los muestra. El problema es que me gustaría leer de 16 en 16 y no de 1 en 1.

Llevo programando en python sólo un par de semanas, así que puedo estar cometiendo cualquier burrada...

Gracias por la ayuda
__________________
www.mundodivx.com || www.mundodivx.org

Pon tu mano en un horno caliente durante un minuto y te parecerá una hora.
Siéntate junto a una chica preciosa durante una hora y te parecerá un minuto.
Eso es la relatividad.

Última edición por ferny; 07/02/2010 a las 08:00 Razón: Añadir algún dato más