Python实现dk-51e1单相交直流标准源RS232通信

使用RS232,信号源DK51e1的协议帧格式如下:

注意点

配置串口波特率为115200

Check异或和不需要加上第一个0x81的字段

接受终端和发送终端默认的设备ID号都是0

进行直流或交流发送前都必须先打开直流或者交流

给信号源发送直流电压的流程如下:

from DK import DK

dk = DK('COM8')#改成自己的串口号
dk.ConnectS() #连接串口
dk.openZLDY() #打开直流电压 电流换成openZLDL()
dk.writeZL(100,0x55)#发送100V直流电压,电流这里改成0x49
# 等待电压发送完毕
user_input = input("按下任意键后关闭\n")
dk.closeZLDY() #关闭直流电压输出 电流换成 closeZLDL()
dk.CloseSer() #关闭串口

给信号源发送交流流电压的流程如下:

from DK import DK
import time
dk = DK('COM8')
dk.ConnectS() #连接串口
dk.openJL() #打开交流
dk.writeJLDY(100) #发送100V交流电压
# dk.writeJLDL(10) #发送10A交流电流
# 等待电压发送完毕
user_input = input("按下任意键后关闭\n")
dk.closeJL() #关闭交流
dk.CloseSer() #关闭串口

python实现DK通信的代码如下:

# DK 信号源 DK.py文件
import operator
from functools import reduce
import struct
import serial
import time
from PyQt5.QtCore import QByteArray, QIODevice
import binascii class DK:
RS232_Command = {
'getOs': b'\x81\x00\x00\x07\x00\x4C\x4B', #获取信号源参数
'closeJLiu': b'\x81\x00\x00\x07\x00\x4F\x48', #关闭交流源
'openJLiu' : b'\x81\x00\x00\x07\x00\x54\x53', #打开交流源
'openZLDY':b'\x81\x00\x00\x08\x00\x67\x55\x3a',# 打开直流源-电压
'openZLDL':b'\x81\x00\x00\x08\x00\x67\x49\x26',# 打开直流源-电流
'setZLDY':b'\x81\x00\x00\x09\x00\x66\xff\x55\xc5', #设置直流电压参数
'setZLDL':b'\x81\x00\x00\x09\x00\x66\xff\x49\xd9', #设置直流电流参数
'closeZLDY':b'\x81\x00\x00\x08\x00\x68\x55\x35', #关闭直流电压源
'closeZLDL':b'\x81\x00\x00\x08\x00\x68\x49\x29', #关闭直流电流源 #切换 直流显示界面 12-30
'openZLUI':b'\x81\x00\x00\x08\x00\x4A\x06\x44', #切换 交流显示界面
'openJLUI':b'\x81\x00\x00\x08\x00\x4A\x01\x43',
# 显示主界面
'openMainUI': b'\x81\x00\x00\x08\x00\x4A\x00\x42' } btl=115200 #波特率
def __init__(self,COM) -> None:
self.COM=COM
pass #测试信号源的连接
def Test(self):
self.ser1.write(self.RS232_Command['getOs'])
data = self.ser1.readline() # 读取一行数据
return str(data) #串口连接
def ConnectS(self):
self.ser1 = serial.Serial(self.COM,self.btl)
time.sleep(1)
if self.ser1.isOpen(): # 判断串口是否成功打开
print("打开串口成功。")
return True
else:
print("打开串口失败。")
return False
pass
# 串口关闭
def CloseSer(self):
self.ser1.close()
pass def split_int_to_high_low_bytes(self,num):
"""
将一个整数分割成高八位和低八位。
Returns:
一个元组,包含高八位和低八位的十六进制表示。
"""
# 将整数转换为二进制字符串,并补全位数
binary_str = bin(num)[2:].zfill(8) # 分割高低八位
high_part = binary_str[:4]
low_part = binary_str[4:] # 转换为十六进制
high_hex = hex(int(high_part, 2))[2:]
low_hex = hex(int(low_part, 2))[2:] return high_hex, low_hex # 将list中数据依次异或
def xor_sum(self,arr):
return reduce(operator.xor, arr) # 浮点数打包成四个字节
def float_to_hex(self,f):
# 将浮点数打包成4个字节
packed = struct.pack('f', f) # 将字节转换为十六进制字符串
hex_str = ''.join('{:02x}'.format(x) for x in packed) # 每两个字符一组,并用空格分隔
hex_groups = ' '.join(hex_str[i:i+2] for i in range(0, len(hex_str), 2)) return hex_groups def hex_to_decimal(self,hex_string):
"""将十六进制字符串转换为十进制数列表"""
hex_list = hex_string.split()
decimal_list = [int(hex_num, 16) for hex_num in hex_list]
return decimal_list # =====================================================
# 直流 设置 #关闭直流源电流
def closeZLDL(self):
self.ser1.write(self.RS232_Command['closeZLDL']) # 关闭直流源电压
def closeZLDY(self):
self.ser1.write(self.RS232_Command['closeZLDY']) # 打开直流设置直流电流
def openZLDL(self):
self.ser1.write(self.RS232_Command['openMainUI'])
time.sleep(1)
self.ser1.write(self.RS232_Command['openZLUI']) #12-28新增切换ui
time.sleep(1)
self.ser1.write(self.RS232_Command['openZLDL'])
time.sleep(1)
self.ser1.write(self.RS232_Command['setZLDL'])
time.sleep(2) #打开后必须等五秒再发电流大小 pass # 打开直流设置直流电压
def openZLDY(self):
self.ser1.write(self.RS232_Command['openMainUI'])
time.sleep(1)
self.ser1.write(self.RS232_Command['openZLUI']) #12-28新增切换ui
time.sleep(1)
self.ser1.write(self.RS232_Command['openZLDY'])
time.sleep(1)
self.ser1.write(self.RS232_Command['setZLDY'])
time.sleep(2) #打开后必须等五秒再发电流大小
pass # 写入直流值 val1 写入的值 val2是0x55为电压 0x49为电流
def writeZL(self , value, value2):
floats = self.hex_to_decimal( self.float_to_hex(value))
command=[0x0,0x0,0xd,0x0,0x69,0xFF]
for f in floats:
command.append(f)
command.append( value2 )
checked = self.xor_sum(command)
command.append( checked )
commands="129 "
for comm in command:
commands=commands+str(comm)+' '
# print(commands)
# return commands
commandstr = commands.split(' ') numbers =[]
for comm in commandstr[0:13]:
numbers.append( int(comm))
my_bytes = bytes(numbers[0:13])
self.ser1.write(my_bytes)
return numbers[0:13] # =====================================================
# 交流 设置 #打开交流
def openJL(self):
self.ser1.write(self.RS232_Command['openMainUI'])
time.sleep(1)
self.ser1.write(self.RS232_Command['openJLUI']) #12-28新增切换ui
time.sleep(1)
self.ser1.write(self.RS232_Command['openJLiu'])
time.sleep(1) # 关闭交流源
def closeJL(self):
self.ser1.write(self.RS232_Command['closeJLiu'])
time.sleep(1) # 写入交流电压的值 def writeJLDY(self , value):
length=11
floats = self.hex_to_decimal( self.float_to_hex(value))
command=[0x0,0x0,length,0x0,0x32 ]
for f in floats:
command.append(f)
checked = self.xor_sum(command)
command.append( checked )
commands="129 "
for comm in command:
commands=commands+str(comm)+' ' commandstr = commands.split(' ') numbers =[]
for comm in commandstr[0:length]:
numbers.append( int(comm))
# for r in numbers:
# print(hex(r)) my_bytes = bytes(numbers[0:length])
self.ser1.write(my_bytes)
return numbers[0:length] # 添加交流电流
def writeJLDL(self , value):
length=31
floats = self.hex_to_decimal( self.float_to_hex(value))
command=[0x0,0x0,length,0x0,0x32 ]
for i in range(0,12):
command.append(0x00)
for f in floats: #添加交流电流值
command.append(f)
for i in range(0,8):
command.append(0) checked = self.xor_sum(command) #计算最后一位的出校验位
command.append( checked ) #把校验位添加到末尾
commands="129 " #所有命令的头部肯定都是0x81==129
for comm in command:
commands=commands+str(comm)+' '
commandstr = commands.split(' ')
numbers =[]
for comm in commandstr[0:length]:
numbers.append( int(comm)) my_bytes = bytes(numbers[0:length]) #转换成字节数组发送出去
self.ser1.write(my_bytes)
return numbers[0:length]

Python串口实现dk-51e1单相交直流标准源通信的更多相关文章

  1. raspi串口、python串口模块pyserial

    一.安装 1.下载软件包pyserial-2.7.tar.gz   网址:https://pypi.python.org/pypi/pyserial 2.8uftp上传至/usr/local/src/ ...

  2. python串口助手

    最近项目中要使用模拟数据源通过向外发送数据,以前都是用C#编写,最近在研究python,所以就用python写了一个串口助手,方便以后的测试. 在电脑上通过虚拟串口助手产生两个虚拟串口,运行编写的串口 ...

  3. Python串口编程

    python的串口网上有很多例子,这里了只是把认为好的整理到一起. 首先,应该安装serial模块,还能开始后续的操作.我用的python2.6,serial模块可以在这里下载安装serial模块下载 ...

  4. python串口调试,M3650B-HA调试

    使用python serial与M3650B-HA(RFID读写器)串口通信 环境:py3.6 模块:pyserial 1.serial模块安装2.废话不多说,直接上代码,测试环境py3.6 # co ...

  5. Python 串口通信 GUI 开发

    在项目中遇到树莓派串口通信问题.由于本人一直从事.net 开发,希望将树莓派系统换成Win10 IOT版.但是在测试过程中出现无法找到串口的问题.最终也没有解决.最终按照领导要求,linux (了解不 ...

  6. Python 串口通讯

    摘要: pyserial module: https://github.com/tbusf/pyserial Python使用pyserial进行串口通信:http://blog.csdn.net/l ...

  7. python 串口 透传

    python正常情况通过串口 serial  传输数据的时候,都是以字符串的形式发送的 str = ‘abcd’ ser.write(str.encode())#直接发送str报错,需要发送byte类 ...

  8. Python 串口通信操作

    下载  pyserial包 https://pypi.python.org/packages/source/p/pyserial/pyserial-2.7.tar.gz#md5=794506184df ...

  9. python串口工具的使用!!!!一定要加timeout=!!!!

    不指定timeout参数的话,就各种报错,如下: 而前面的串口,波特率则不需要指明.

  10. Python串口操作纸币器1

    公司需要纸币器开发,参考纸币器文档和网上的一篇vb版本,代码如下: # -*- coding:utf-8 -*- # Author: Pete Yim<xpHook@gmail.com> ...

随机推荐

  1. C++处理系统相关权限问题

    1.给某个文件或文件夹赋予特定用户的特定访问权限 /* 给文件(夹)szPath设置用户名为pszAccount的可读可写可修改权限 */ bool GiveTheAccountPrivToFile( ...

  2. 文件上传日志包含详解与CTF实战

    1. 日志简介 1.1 日志介绍 日志是记录系统或应用程序运行时事件的文件.这些记录可以包括错误信息.用户活动.系统性能指标等,帮助开发者和管理员监控和排查问题. 日志通常会记录多种内容,包括: 时间 ...

  3. FPGA开发中的复位问题

    一.为什么需要复位? 在FPGA上电时,需要对reg.fifo等器件进行复位,以确保系统处于已知的状态,同时可以通过复位清除系统的错误异常状态. 二.复位的方式 从是否与时钟同步与否可以分为异步复位和 ...

  4. 一键SSH免密脚本

    大型项目一键SSH免密脚本 #!/usr/bin/env bash root=$( cd $(dirname $0)/.. pwd ) source ${root}/dragonrc read -p ...

  5. 《JVM第9课》垃圾回收器

    先来看一张图,串行代表两个垃圾回收器按顺序执行,并行代表同时执行.STW代表工作线程暂停,Stop The World的意思. 垃圾回收器 执行顺序 执行方式 作用区域 使用算法 说明 Serial ...

  6. SQL Server如何定期自动备份数据库

    打开SQL Server代理服务 实现自动备份功能,首先要保证SQL Server的"SQL Server(代理)"服务已经打开. 如果没有看到这个"SQL Server ...

  7. .NET 创建动态方法方案及 Natasha V9

    前言 本篇文章前面客观评估了 .NET 创建动态方方案多个方面的优劣,后半部分是 Natasha V9 的新版特性. .NET 中创建动态方法的方案 创建动态方法的不同选择 以下陈列了几种创建动态方法 ...

  8. CSS3实现放大镜效果

    市面上基本上所有的购物平台.商城上的商品详情页,对于商品的图片都是有放大功能.那么这个功能主要是怎么实现的呢?CSS3实现放大镜效果主要依赖于CSS的一些高级特性,如transform.transit ...

  9. Java虚拟机深入研究

    文章来自:http://www.qqread.com/java/w872354600.html Java技术与Java虚拟机  说起Java,人们首先想到的是Java编程语言,然而事实上,Java是一 ...

  10. Linux系统之Ubuntu

    常用命令: #查看安装包 dpkg -l 1)切换镜像源 本身的镜像都是国外的,下载依赖包太慢, 需要替换成国内镜像地址 国内镜像源推荐阿里 OPSX 源: https://opsx.alibaba. ...