python 学习笔记 1
下文基于python 2.7.16
-> 默认windows安装完成后,serial不能使用。提示 python import serial ImportError: No module named serial
1 https://github.com/pyserial/pyserial 或者官网下载 https://pypi.org/project/pyserial/3.4/
2 对应的库拷贝进安装目录site-packages即可
-> python2 串口通讯
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")
-> 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")