[PYTHON] Transmission / réception binaire avec Pyserial

introduction

Je décrirai la transmission et la réception binaires en utilisant pyserial comme rappel.

Comment envoyer un binaire avec Pyserial

Référence: Données binaires utilisant pyserial (port série python) Parmi eux, la méthode Serial.write () de pyserial envoie uniquement des données de chaîne de caractères. Est écrit.

Vous pouvez envoyer une version convertie en binaire afin que la sortie soit quelque chose comme "\ x00". ("\ X" signifie interpréter les deux caractères suivants comme une valeur entière en notation hexadécimale.)

Comme exemple de conversion Il décrit comment utiliser array - séquence de types de données fixes.

import serial
import array

#Je souhaite envoyer des données binaires
b = [0xc0, 0x04, 0x00]
print(b)
#S'affiche après avoir été converti en décimal
# >>>[192, 4, 0]

#Méthode utilisant un tableau de conversion en binaire de Python
b_data=array.array('B', [0xc0, 0x04, 0x00]).tostring()
print(b_data)
# >>>b'\xc0\x04\x00'

#Méthode utilisant des octets de conversion pour le binaire de Python
b2_data = bytes(b)
print(b2_data)
# >>>b'\xc0\x04\x00'

#Les deux sont les mêmes lorsqu'on les compare.
print(b_data==b2_data)
# >>>True

Il est plus facile d'utiliser bytes (), alors utilisez ceci. Il peut être utilisé lors de l'échange en mode binaire de TWELITE mentionné dans l'article précédent.

Envoyer

#Envoyer, par exemple
senddata=[0xA5,0x5A,0x80,0x07,0x00,0x00,0x00,0x64,0xFF,0xFF,0x02,0x67]

print(senddata)
#La sortie imprimée sera en notation décimale
# [65, 90, 128, 7, 1, 0, 0, 100, 255, 255, 2, 103]

#Convertir en binaire
send_binary =bytes(senddata) 
# bytearray()Peut être
# send_binary =bytearray(senddata) 

print(send_binary)
#Envoyer des données binaires
# b'\xa5Z\x80\x07\x01\x00\x00d\xff\xff\x02g'

#Envoyer par pyserial
with serial.Serial('COM12', 115200) as ser:
    print('---')
    ser.write(send_binary)
    print('---')

Recevoir


with serial.Serial('COM12', 115200) as ser:
    #Spécifiez le nombre d'octets à lire dans l'argument de lecture.
    b_reply = ser.read(23)
    #Lors de la lecture de tout
    b_reply = ser.read_all()

    print(b_reply)
    # >>> b'\xa5Z\x80\x04\xdb\xa1\x98\x01\xe3\x04\xa5Z\x80\x07\x01\x04\x00\x013<")\x04'

    #Il est nécessaire de spécifier le nombre d'octets et le type à lire à l'aide du module struct.
    #Cette fois, 23 octets sont lus par incréments de 1 octet.
    #23B équivaut à avoir 23 Bs alignés. B est un type char non signé en langage C, et en Python, il s'agit d'un entier de 1 octet.

    reply =struct.unpack('23B',b_reply)

    print(reply)
    # >>> 165, 90, 128, 4, 219, 161, 152, 1, 227, 4, 165, 90, 128, 7, 1, 4, 0, 1, 51, 60, 34, 41, 4
    #Le dernier 4 est(EOT)Caractère de fin de transmission (Fin-of-Transmission character)
    #Analysez selon les spécifications de quel nombre d'octets a quelles informations.

Recommended Posts

Transmission / réception binaire avec Pyserial
Dichotomie avec python
Dichotomie avec Python 3
Communication série avec Raspberry Pi + PySerial