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
经验分享 程序员 微信小程序 职场和发展