python 学习笔记 1

作者:    提交时间:2020-03-02    点击:2906    TAGS:python

下文基于python 2.7.16


 -> 默认windows安装完成后,serial不能使用。提示 python import serial ImportError: No module named serial

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")