python使用serial向串口发送接收数据
import serial,time import threading import binascii # 接收错误需要设置串口详细 ser = serial.Serial(com3, 9600, parity=E, stopbits=1, bytesize=8, timeout=0.5) def com_read(): while True: rev_num = ser.inWaiting() data = b while rev_num: #1111 data += ser.read(rev_num) time.sleep(0.1) rev_num = ser.inWaiting() if data: print(recv bytes: , data) print(recv hex, binascii.hexlify(data)) d = for c in binascii.hexlify(data): d += chr(c) print(rev chr: , d) break read_t = threading.Thread(target=com_read) read_t.start() int_list = [104, 12, 0, 64, 2, 1, 6, 2, 0, 232, 51, 22] byte_data = bytearray(int_list) print(send bytes: , byte_data) ser.write(byte_data) parity=E, stopbits=1, bytesize=8 正确数据 send bytes: bytearray(bhx0cx00@x02x01x06x02x00xe83x16) recv bytes: bhx0ex00x80x02x01x06x02x00xe8dx00xd7x16 recv hex b680e00800201060200e86400d716 rev chr: 680e00800201060200e86400d716 错误数据 需要配置 奇偶校验 停止位,通知信号何时结束 数据位,一次接收多少位数据 send bytes: bytearray(bhx0cx00@x02x01x06x02x00xe83x16) recv bytes: bh x00x00x00x02x02x00x02xe8 sxb3xfc recv hex b680d00000002020002e80973b3fc rev chr: 680d00000002020002e80973b3fc
其中需要注意的问题 1、串口通信最中要的几个参数是:波特率、数据位、停止位和奇偶校验,确定一个数据是否完整与正确,需要与相应的硬件上的发送端匹配。 2、当 ser.inWaiting() 中读取串口接收到数据信息不能代表一次就能把串口返回完整数据读取完毕,可能只返回了期待完整数据的头几个数据长度,因此需要使用 while 进行循环判断接收的一串数据是否完成,因为串口的发送频率位 9600,电脑的运行速度比着快很多,因此可以使用 time.sleep() 暂停一段时间待串口多读入一些数据再循环,否则可能一个循环只读入一两个字符的数据,依据自己情况而定。
数据转换
import binascii arr = 68 22 22 22 22 22 22 68 94 11 33 33 33 3B 33 33 33 33 33 33 33 33 34 33 33 33 34 AE 16 arr = arr.split( ) print(.join(arr).encode(utf-8)) b_arr = b682222222222226894113333333B33333333333333333433333334AE16 print(b_arr.decode(utf-8)) print(binascii.a2b_hex(b_arr))
输出结果
b682222222222226894113333333B33333333333333333433333334AE16 682222222222226894113333333B33333333333333333433333334AE16 bh""""""hx94x11333;3333333343334xaex16
效果等同
a1 = binascii.a2b_hex(b77aa77aa68) print(a1) # bwxaawxaah a2 = bytearray([0x77, 0xaa, 0x77, 0xaa, 0x68]) print(a2) # bytearray(bwxaawxaah)
bytes 与 str 互转
s = 68222234 print(s.encode(utf-8)) # b68222234 b = b68222234 print(b.decode(utf-8)) # 68222234