之前写过Ubuntu下python实现串口通信的配置过程,
ubuntu16.04 下PL2303串口通信配置、读取、python编程读取
这一篇把win10下分别用python2 和python3实现串口通信的代码分享下。
python3 和python2主要是在字节转换这一块的处理不同。详情见代码
win10下,python3串口通信
import serial
import time
def gbk_2_number(strsrc):
result = []
for i in range(0,len(strsrc),2):
tmp = strsrc[i:i+2]
result.append(tmp)
#print(tmp, result)
tmp1 = ''
for i in range(len(result)):
if result[i]== '2e':
tmp1 += '.'
else:
tmp1 += str(int(result[i]) - 30)
#print('tmp: ',tmp1)
return tmp1
ser = serial.Serial("com5", 57600) # 选择串口,并设置波特率
if ser.is_open:
print("port open success")
# hex(16进制)转换为bytes(2进制),应注意Python3.7与Python2.7此处转换的不同
send_data = bytes.fromhex('65 0d 05 00 FF FF FF FF') # 发送数据转换为b'\xff\x01\x00U\x00\x00V'
ser.write(send_data) # 发送命令
time.sleep(0.1) # 延时,否则len_return_data将返回0,此处易忽视!!!
len_return_data = ser.inWaiting()
if len_return_data:
#print("enter receive data: ")
return_data = ser.read(len_return_data) # 读取缓冲数据
print('16hex rx: ',return_data.hex())
# bytes(2进制)转换为hex(16进制),应注意Python3.7与Python2.7此处转换的不同,并转为字符串后截取所需数据字段,再转为10进制
str_return_data = str(return_data.hex())
#十六进制字符转换为汉字(str_return_data)
rece_Chinese = bytes.fromhex(str_return_data).decode('gbk')
print('rx: ', rece_Chinese)
start_l = str_return_data.find('22')
end_r = str_return_data.rfind('22')
number_x = str_return_data[start_l+2:end_r]
number_result = gbk_2_number(number_x)
print('number_result: ',number_result)
feedback_data = int(str_return_data[-6:-2], 16)
#print(feedback_data)
else:
print("port open failed")
win10下,python2串口通信
# -*- coding: utf-8 -*-
import serial
import time
def gbk_2_number(strsrc):
result = []
for i in range(0,len(strsrc),2):
tmp = strsrc[i:i+2]
result.append(tmp)
#print(tmp, result)
tmp1 = ''
for i in range(len(result)):
if result[i]== '2e':
tmp1 += '.'
else:
tmp1 += str(int(result[i]) - 30)
#print('tmp: ',tmp1)
return tmp1
ser = serial.Serial("com5", 57600) # 选择串口,并设置波特率
if ser.is_open:
print("port open success")
# hex(16进制)转换为bytes(2进制),应注意Python3.7与Python2.7此处转换的不同
send_data = '650d0500FFFFFFFF' # 发送数据转换为b'\xff\x01\x00U\x00\x00V'
send_data = send_data.decode('hex')
ser.write(send_data) # 发送命令
time.sleep(0.1) # 延时,否则len_return_data将返回0,此处易忽视!!!
len_return_data = ser.inWaiting()
if len_return_data:
#print("enter receive data: ")
return_data = ser.read(len_return_data) # 读取缓冲数据
print('16hex rx: ',return_data) #return_data.encode('hex')
#十六进制字符转换为汉字(return_data)
print(return_data)
# bytes(2进制)转换为hex(16进制),应注意Python3.7与Python2.7此处转换的不同,并转为字符串后截取所需数据字段,再转为10进制
str_return_data = str(return_data.encode('hex'))
print('rx: ',str_return_data)
start_l = str_return_data.find('22')
end_r = str_return_data.rfind('22')
number_x = str_return_data[start_l+2:end_r]
number_result = gbk_2_number(number_x)
print('number_result: ',number_result)
#b = str_return_data.encode('utf-8').decode('unicode_escape')
#print('b: ,',b)
feedback_data = int(str_return_data[-6:-2], 16)
#print(feedback_data)
else:
print("port open failed")