[pyar] Pyserial: enviando datos hexadecimales de un byte

913 views
Skip to first unread message

Santiago Paleka

unread,
Dec 9, 2010, 9:43:49 AM12/9/10
to Python Argentina
Hola lista, tengo el siguiente inconveniente:

Quiero enviar a través del puerto serie un dato de un byte hexadecimal
(por ejemplo 0x10 0x11 0xf3 lo que sea)
si hago n = 0x11
y después envío por el puerto serie así:
self.pserie.write(n)

en el receptor me llegan dos caracteres en dos bytes separados, en el
ejemplo dado recibo 1 1.
Como puedo hacer para enviar un dato de un byte y recibirlo exactamente igual.
Los datos que tengo que enviar los tengo en una tupla =
(0x10,0x11,0x45,0xf4) etc.

Estoy usando pyserial2.5, python2.6.6 en windows xp sp2.
Gracias.
_______________________________________________
pyar mailing list py...@python.org.ar
http://listas.python.org.ar/listinfo/pyar

PyAr - Python Argentina - Sitio web: http://www.python.org.ar/

Claudio Freire

unread,
Dec 9, 2010, 9:57:00 AM12/9/10
to Python Argentina


2010/12/9 Santiago Paleka <santiag...@gmail.com>

Hola lista, tengo el siguiente inconveniente:

Quiero enviar a través del puerto serie un dato de un byte hexadecimal
(por ejemplo 0x10 0x11 0xf3 lo que sea)
si hago n = 0x11
y después envío por el puerto serie así:
self.pserie.write(n)

write toma siempre un string, o en python3 un "bytes".

Así que lo que tenés que hacer es:

self.pseriel.write(chr(n))

Ramiro Morales

unread,
Dec 9, 2010, 10:02:20 AM12/9/10
to Python Argentina
2010/12/9 Santiago Paleka <santiag...@gmail.com>:

> Hola lista, tengo el siguiente inconveniente:
>
> Quiero enviar a través del puerto serie un dato de un byte hexadecimal
> (por ejemplo 0x10 0x11 0xf3 lo que sea)
> si hago n = 0x11
> y después envío por el puerto serie así:
> self.pserie.write(n)
>
> en el receptor me llegan dos caracteres en dos bytes separados, en el
> ejemplo dado recibo 1 1.
> Como puedo hacer para enviar un dato de un byte y recibirlo exactamente igual.
> Los datos que tengo que enviar los tengo en una tupla =
> (0x10,0x11,0x45,0xf4) etc.
>
> Estoy usando pyserial2.5, python2.6.6 en windows xp sp2.

Usa chr():

>>> c = chr(0x11)
>>> pserie.write(c)

O mejor aun, struct:

>>> import struct
>>> tupla = (0x10, 0x11, 0x45, 0xf4)
>>> s = struct.pack(4 * 'B', *tupla)
>>> s
'\x10\x11\x45\xf4'
>>> pserie.write(s)

--
Ramiro Morales

Santiago Paleka

unread,
Dec 9, 2010, 10:42:21 AM12/9/10
to Python Argentina
>
> write toma siempre un string, o en python3 un "bytes".
>
> Así que lo que tenés que hacer es:
>
> self.pseriel.write(chr(n))
>

No me funciona con chr, si por ejemplo n=0x11escribo el puerto con
self.pserial.write(chr(n)) no envía nada, en cambio para 0x10 si,
depende el valor que le ponga transmite o no, si podés probalo. te
paso un código de pruebas, cambiá lo que escribe de 0x11 a 0x10 y vas
a ver cuantos bytes escribe cada vez (con 0x11 no escribe, devuelve 0)

#############################################################################

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
import serial
import time
import os
import string

#puerto serie a usar
PUERTO = 1
#timeout para lecturas
PSTOUT = 5

class main():
def __init__(self):
self.pserie = serial.Serial(serial.device(PUERTO), 19200,
xonxoff=True,writeTimeout=5)
print self.pserie.portstr
def comienzo(self):
self.pserie.flushInput()
enviados = self.pserie.write(chr(0x11))
print enviados
time.sleep(1)

if __name__ == '__main__':
principal = main()
principal.comienzo()
###########################################################################

gracias.

Santiago Paleka

unread,
Dec 9, 2010, 10:47:46 AM12/9/10
to Python Argentina
> O mejor aun, struct:
>
>>>> import struct
>>>> tupla = (0x10, 0x11, 0x45, 0xf4)
>>>> s = struct.pack(4 * 'B', *tupla)
>>>> s
> '\x10\x11\x45\xf4'
>>>> pserie.write(s)
>
> --
> Ramiro Morales

El problema ahora está al enviar '\x11' y otros valores que no se por
que no los envía.

Santiago Paleka

unread,
Dec 9, 2010, 11:43:31 AM12/9/10
to Python Argentina
2010/12/9 Santiago Paleka <santiag...@gmail.com>:

>> O mejor aun, struct:
>>
>>>>> import struct
>>>>> tupla = (0x10, 0x11, 0x45, 0xf4)
>>>>> s = struct.pack(4 * 'B', *tupla)
>>>>> s
>> '\x10\x11\x45\xf4'
>>>>> pserie.write(s)
>>
>> --
>> Ramiro Morales
>
> El problema ahora está al enviar '\x11' y otros valores que no se por
> que no los envía.
>

Me corrijo, solo no envía 0x11 y 0x13. Alguien sabe por que?

for i in range(256):
enviados = self.pserie.write(chr(i))
if enviados == 0: print hex(i)

salida: 0x11
0x13

Daniel Moisset

unread,
Dec 9, 2010, 11:48:20 AM12/9/10
to Python Argentina
On Thu, Dec 9, 2010 at 1:43 PM, Santiago Paleka
<santiag...@gmail.com> wrote:
>
> for i in range(256):
> enviados = self.pserie.write(chr(i))
> if enviados == 0: print hex(i)
>
> salida: 0x11
> 0x13


Esos son XON y XOFF[1], los caracteres que se usan para hacer flujo de
control por software. Fijate si podes configurar el puerto serie para
que haga flujo de control por hardware, sino no los vas a poder mandar

Saludos,
D.

[1] http://en.wikipedia.org/wiki/XON/XOFF

Santiago Paleka

unread,
Dec 9, 2010, 12:13:41 PM12/9/10
to Python Argentina
El día 9 de diciembre de 2010 13:48, Daniel Moisset
<dmoi...@machinalis.com> escribió:

Si, evidentemente tiene que ver con eso y el software que estaba
usando para emular los puertos. Sacando los datos directamente al
puerto físico com1 anda bien. Gracias y perdón si molesté con una
tontería! debería haber aclarado que estaba usando puertos virtuales
me parece.

Reply all
Reply to author
Forward
0 new messages