/ / pySerial - Solo leyendo un byte - python, serial-port, pyserial

pySerial: solo se lee un byte: python, serial-port, pyserial

Cartel de la primera vez aquí, así que por favor tengan paciencia conmigo.

Estoy tratando de leer y escribir en un sensor a través de serie utilizando pySerial. No tengo control de flujo de software o hardware.

Puedo enviar una cadena de hexadecimal al dispositivo, pero solo recibo un byte de vuelta en lugar de los dos a diez bytes que debería ver. El sensor está funcionando, lo he verificado con Realterm.

He intentado usar ser.readline () (en lugar del inWaiting loop) y ser.read (2); Esto solo hace que el programa se cuelgue. También he intentado aumentar el tiempo de sueño y he experimentado con diferentes velocidades de transmisión (tanto en la PC como en el sensor), pero nada parece funcionar.

¿Alguien tiene algún consejo?

import time
import serial

# configure the serial connections
ser = serial.Serial(
port="COM1",
baudrate=115200,
parity=serial.PARITY_EVEN,
stopbits=serial.STOPBITS_ONE,
bytesize=serial.EIGHTBITS
)

ser.isOpen()

print "Enter your commands below.rnInsert "exit" to leave the application."

while 1 :
# get keyboard input
data_in = raw_input(">> ")

if data_in == "exit":
ser.close()
exit()
else:
# send the character to the device
ser.write(data_in.decode("hex") + "rn")

out = ""
time.sleep(1)
while ser.inWaiting() > 0:
out += ser.read(1)

if out != "":
print ">>" + " ".join(hex(ord(n)) for n in out)

(Modifiqué ligeramente el código del que se encuentra en Ejemplos completos de usar el paquete pySerial)

Respuestas

0 para la respuesta № 1

Su declaración de lectura está solicitando explícitamente 1 byte:

ser.read(1)

Si sabe cuántos bytes leer, puede especificar aquí. Si no está seguro, puede especificar un número mayor. Por ejemplo, haciendo

ser.read(10)

Leerá hasta 10 bytes. Si solo hay 8 disponibles, entonces solo devolverá 8 bytes (después del tiempo de espera, ver más abajo).

También vale la pena establecer un tiempo de espera para evitar que el programa se cuelgue. Simplemente agregue un parámetro de tiempo de espera a su constructor de serie. Lo siguiente le dará un tiempo de espera de 2 segundos:

ser = serial.Serial(
port="COM1",
baudrate=115200,
parity=serial.PARITY_EVEN,
stopbits=serial.STOPBITS_ONE,
bytesize=serial.EIGHTBITS,
timeout=2
)

La documentación establece:

read(size=1) Leer size bytes del puerto serie. Si se establece un tiempo de espera, puede devolver menos caracteres según lo solicitado. Sin tiempo de espera, se bloqueará hasta que se lea el número de bytes solicitado.

Entonces, si no sabe cuántos bytes esperar, establezca un pequeño tiempo de espera (si es posible) para que su código no se bloquee.

Si su código no devuelve el número completo debytes esperados, entonces es probable que el dispositivo al que está conectado no esté enviando todos los bytes que está esperando. Ya que ha verificado que debería estar funcionando por separado, ¿ha verificado que los datos que está enviando son correctos? Quizás codifique en bytes primero utilizando struct.pack (). Como ejemplo, para enviar un byte con un valor decimal de 33 (hexadecimal 0x21)

import struct
bytes_to_send = struct.pack("B", 33)

Nunca me ha parecido necesario agregar los caracteres de final de línea. rn a un mensaje antes de enviar