Python3串口16进制读写通讯

2017-10-13 浏览:1457
Python3串口16进制读写通讯
评论:(2)复制地址

最近需要对一个买来的测温探头进行可靠性测试,探头是通过串口方式接受命令传输数据的,使用串口助手接受到的数据还需要进行计算显示不直观,加之准备连续测试几天,所以就想着写一个脚本把接受到的数据直接转换存入记事本中以便后面分析。


python版本:3.6.3

另需要安装serial模块:

pip3 install pyserial   //python3


脚本如下:             https://github.com/zpblog/python3-serial

import serial
import binascii  
import struct 
import time

# 创建serial实例
serialport = serial.Serial()
serialport.port = 'COM3'
serialport.baudrate = 115200
serialport.parity = 'N'
serialport.bytesize = 8
serialport.stopbits = 1
serialport.timeout = 0.2

while 1:
    serialport.open()
    # 发送数据
    d=bytes.fromhex('0B 0B')
    serialport.write(d)
    #print (d)
    # 接收数据  
    str1 = serialport.read(2)
    data= binascii.b2a_hex(str1)
    data1=str((int(data,16)-1000)/10)
    print(data1)
    # 获取日期
    time1=time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))
    #字符串合并
    data2 = time1 + ' ' + data1
    #print(data2)
    # 写入文件
    f1 = open('D:/temprecord.txt','a')
    f1.write(data2 + '\n')
    time.sleep(0.5)
    serialport.close()

再记一个发射率0.1~1可调的验证脚本

import serial
import binascii  
import struct 
import time
# 创建serial实例
serialport = serial.Serial()
serialport.port = 'COM14'
serialport.baudrate = 115200
serialport.parity = 'N'
serialport.bytesize = 8
serialport.stopbits = 1
serialport.timeout = 0.5
#异或校验
def uchar_checkbcc(data, byteorder='little'):  
    ''''' 
    char_checkbcc 按字节计算异或校验。 
    @param data: 字节串 
    @param byteorder: 大/小端 
    '''  
    length = len(data)  
    checkbcc = 0  
    for i in range(0, length):  
        checkbcc ^= int.from_bytes(data[i:i+1], byteorder, signed=False)    
    checkbcc = hex(checkbcc)[2:]
    return checkbcc
#LRC校验
def uchar_checklrc(data, byteorder='little'):  
    ''''' 
    char_checksum 按字节计算校验和补码。
    @param data: 字节串 
    @param byteorder: 大/小端 
    '''  
    length = len(data)  
    checksum = 0  
    for i in range(0, length):  
        checksum += int.from_bytes(data[i:i+1], byteorder, signed=False)
        checksum &= 0xFF # 强制截断
    checklrc = hex(2**8-checksum)[2:]      #补码
    return checklrc   
i = 1000
while (i > 99):
    serialport.open()
    # 发送数据
    #d=bytes.fromhex('0d03ded0')
    value = hex(int(i))[2:]
    if len(value) % 2 != 0:
        value = '0d0' + value
    elif len(value) % 4 != 0:
        value = '0d00' + value
    xx = bytes.fromhex(value)
    yy = uchar_checkbcc(xx)
    if len(yy) % 2 != 0:
        yy = '0' + yy    
    d = value + yy
    d1 = bytes.fromhex(d)
    serialport.write(d1)
    print (d1)
    # 接收数据  
    str1 = serialport.read(2)
    print(str1)
    str2 = str1 + bytes(1)
    data2= binascii.b2a_hex(str2)
    if(int(data2,16) == 0):
        str1 = bytes([1])
    data= binascii.b2a_hex(str1)
    print(data)
    data1=str(int(data,16)/1000)
    print(data1)
    # 获取日期
    time1=time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))
    #字符串合并
    data2 = time1 + ' ' + str(i) + ' '+ str(d) +' ' +data1
    print(data2)
    # 写入文件
    f1 = open('D:/temprecord.txt','a')
    f1.write(data2 + '\n')
    i = i - 10
    time.sleep(3)
    serialport.close()


评论:(2)复制地址
发布:zpblog | 分类:Windows | Tags:脚本

评论列表:

八角网赚站

评论于2017-12-29 22:23:42
虽然看不大懂,但还是支持一下! - 回复该评论

代写英文

评论于2018-07-03 18:36:30
期待楼主的更新 - 回复该评论

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。