La communication série (UART) est effectuée entre mac et python3 à l'aide d'un pilote série USB ou similaire.
Vous pouvez le faire en installant pyserial avec pip et en important serial. J'ai trouvé beaucoup d'articles dans la recherche que je ne pouvais pas faire avec python3, mais à partir du 29 février 2020, je pouvais le faire avec python3.
install.sh
$ pip install pyserial
Le code est le suivant, qui reçoit 1 octet en série, le convertit en notation décimale et le convertit en sortie standard.
serial_read.py
import serial
import struct
ser = serial.Serial(
port = "/dev/cu.usbserial-XXXXXXXX",
baudrate = 115200,
#parity = serial.PARITY_NONE,
#bytesize = serial.EIGHTBITS,
#stopbits = serial.STOPBITS_ONE,
#timeout = None,
#xonxoff = 0,
#rtscts = 0,
)
while True:
if ser.in_waiting > 0:
recv_data = ser.read(1)
print(type(recv_data))
a = struct.unpack_from("B",recv_data ,0)
print( a )
La chaîne de port doit être ls / dev / cu. *
, Et sélectionnez le périphérique approprié parmi les périphériques qui apparaissent comme ʻusbserial -... `. La partie commentée conserve les paramètres par défaut, alors commentez et définissez les paramètres appropriés si nécessaire.
Vous pouvez vérifier s'il y a des données reçues dans le tampon série (le nombre d'octets contenus dans le tampon) en vous référant à ser.in_waiting
.
Les données reçues seront traitées comme une chaîne de caractères même s'il s'agit de données binaires. Si les données reçues sont binaires, vous devez les convertir en nombre en utilisant struct_unpack_from ()
comme dans le code ci-dessus. Pour les chaînes utf8, vous devez décoder. S'il s'agit d'une soi-disant chaîne de caractères 7 bits, elle peut être traitée telle quelle sans décodage ni déballage.
Envoyez n'importe quelle chaîne d'octets (buf).
serial_write.py
import serial
import struct
def send( buf ):
while True:
if ser.out_waiting == 0:
break
for b in buf:
a = struct.pack( "B", b )
ser.write(a)
ser.flush()
ser = serial.Serial(
port = "/dev/cu.usbserial-XXXXXXXX",
baudrate = 115200,
#parity = serial.PARITY_NONE,
#bytesize = serial.EIGHTBITS,
#stopbits = serial.STOPBITS_ONE,
#timeout = None,
#xonxoff = 0,
#rtscts = 0,
)
x = [ 0x01, 0xFF, 0x02, 0xFE, 0x03]
send( x )
Si vous ne videz pas vous-même, il semble qu'il ne sera pas envoyé tant que certaines données de transmission ne seront pas mises en mémoire tampon. Si vous ne cochez pas ser.out_waiting
, il semble que parfois il ne puisse pas être envoyé normalement.
Si vous souhaitez envoyer une chaîne (alphabétique) au lieu d'un binaire, vous pouvez le faire ci-dessous.
serial_str_write.py
x = b'abcdef'
ser.write( x )
Si vous souhaitez envoyer une chaîne utf8, vous devez l'encoder.
Je pensais que ce serait plus facile que d'écrire en langage C ou rapide, mais j'avais beaucoup de choses à faire en dehors de la partie communication, donc j'avais du mal à découvrir comment déballer et encoder.
Recommended Posts