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(b'h\x0c\x00@\x02\x01\x06\x02\x00\xe83\x16')
recv bytes:  b'h\x0e\x00\x80\x02\x01\x06\x02\x00\xe8d\x00\xd7\x16'
recv hex b'680e00800201060200e86400d716'
rev chr:  680e00800201060200e86400d716
'''

'''
错误数据
    需要配置
        奇偶校验
        停止位,通知信号何时结束
        数据位,一次接收多少位数据
send bytes:  bytearray(b'h\x0c\x00@\x02\x01\x06\x02\x00\xe83\x16')
recv bytes:  b'h\r\x00\x00\x00\x02\x02\x00\x02\xe8\ts\xb3\xfc'
recv hex b'680d00000002020002e80973b3fc'
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 = b'682222222222226894113333333B33333333333333333433333334AE16'
print(b_arr.decode('utf-8'))
print(binascii.a2b_hex(b_arr))

输出结果

b'682222222222226894113333333B33333333333333333433333334AE16'
682222222222226894113333333B33333333333333333433333334AE16
b'h""""""h\x94\x11333;3333333343334\xae\x16'

python使用serial向串口发送接收数据_第1张图片

效果等同

a1 = binascii.a2b_hex(b'77aa77aa68')
print(a1)
# b'w\xaaw\xaah'

a2 = bytearray([0x77, 0xaa, 0x77, 0xaa, 0x68])
print(a2)
# bytearray(b'w\xaaw\xaah')

bytes 与 str 互转

s = '68222234'
print(s.encode('utf-8'))
# b'68222234'
b = b'68222234'
print(b.decode('utf-8'))
# 68222234

你可能感兴趣的:(其它,python,单片机,stm32)