Python串口实现dk-51e1单相交直流标准源通信
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单相交直流标准源通信的更多相关文章
- raspi串口、python串口模块pyserial
一.安装 1.下载软件包pyserial-2.7.tar.gz 网址:https://pypi.python.org/pypi/pyserial 2.8uftp上传至/usr/local/src/ ...
- python串口助手
最近项目中要使用模拟数据源通过向外发送数据,以前都是用C#编写,最近在研究python,所以就用python写了一个串口助手,方便以后的测试. 在电脑上通过虚拟串口助手产生两个虚拟串口,运行编写的串口 ...
- Python串口编程
python的串口网上有很多例子,这里了只是把认为好的整理到一起. 首先,应该安装serial模块,还能开始后续的操作.我用的python2.6,serial模块可以在这里下载安装serial模块下载 ...
- python串口调试,M3650B-HA调试
使用python serial与M3650B-HA(RFID读写器)串口通信 环境:py3.6 模块:pyserial 1.serial模块安装2.废话不多说,直接上代码,测试环境py3.6 # co ...
- Python 串口通信 GUI 开发
在项目中遇到树莓派串口通信问题.由于本人一直从事.net 开发,希望将树莓派系统换成Win10 IOT版.但是在测试过程中出现无法找到串口的问题.最终也没有解决.最终按照领导要求,linux (了解不 ...
- Python 串口通讯
摘要: pyserial module: https://github.com/tbusf/pyserial Python使用pyserial进行串口通信:http://blog.csdn.net/l ...
- python 串口 透传
python正常情况通过串口 serial 传输数据的时候,都是以字符串的形式发送的 str = ‘abcd’ ser.write(str.encode())#直接发送str报错,需要发送byte类 ...
- Python 串口通信操作
下载 pyserial包 https://pypi.python.org/packages/source/p/pyserial/pyserial-2.7.tar.gz#md5=794506184df ...
- python串口工具的使用!!!!一定要加timeout=!!!!
不指定timeout参数的话,就各种报错,如下: 而前面的串口,波特率则不需要指明.
- Python串口操作纸币器1
公司需要纸币器开发,参考纸币器文档和网上的一篇vb版本,代码如下: # -*- coding:utf-8 -*- # Author: Pete Yim<xpHook@gmail.com> ...
随机推荐
- C++处理系统相关权限问题
1.给某个文件或文件夹赋予特定用户的特定访问权限 /* 给文件(夹)szPath设置用户名为pszAccount的可读可写可修改权限 */ bool GiveTheAccountPrivToFile( ...
- 文件上传日志包含详解与CTF实战
1. 日志简介 1.1 日志介绍 日志是记录系统或应用程序运行时事件的文件.这些记录可以包括错误信息.用户活动.系统性能指标等,帮助开发者和管理员监控和排查问题. 日志通常会记录多种内容,包括: 时间 ...
- FPGA开发中的复位问题
一.为什么需要复位? 在FPGA上电时,需要对reg.fifo等器件进行复位,以确保系统处于已知的状态,同时可以通过复位清除系统的错误异常状态. 二.复位的方式 从是否与时钟同步与否可以分为异步复位和 ...
- 一键SSH免密脚本
大型项目一键SSH免密脚本 #!/usr/bin/env bash root=$( cd $(dirname $0)/.. pwd ) source ${root}/dragonrc read -p ...
- 《JVM第9课》垃圾回收器
先来看一张图,串行代表两个垃圾回收器按顺序执行,并行代表同时执行.STW代表工作线程暂停,Stop The World的意思. 垃圾回收器 执行顺序 执行方式 作用区域 使用算法 说明 Serial ...
- SQL Server如何定期自动备份数据库
打开SQL Server代理服务 实现自动备份功能,首先要保证SQL Server的"SQL Server(代理)"服务已经打开. 如果没有看到这个"SQL Server ...
- .NET 创建动态方法方案及 Natasha V9
前言 本篇文章前面客观评估了 .NET 创建动态方方案多个方面的优劣,后半部分是 Natasha V9 的新版特性. .NET 中创建动态方法的方案 创建动态方法的不同选择 以下陈列了几种创建动态方法 ...
- CSS3实现放大镜效果
市面上基本上所有的购物平台.商城上的商品详情页,对于商品的图片都是有放大功能.那么这个功能主要是怎么实现的呢?CSS3实现放大镜效果主要依赖于CSS的一些高级特性,如transform.transit ...
- Java虚拟机深入研究
文章来自:http://www.qqread.com/java/w872354600.html Java技术与Java虚拟机 说起Java,人们首先想到的是Java编程语言,然而事实上,Java是一 ...
- Linux系统之Ubuntu
常用命令: #查看安装包 dpkg -l 1)切换镜像源 本身的镜像都是国外的,下载依赖包太慢, 需要替换成国内镜像地址 国内镜像源推荐阿里 OPSX 源: https://opsx.alibaba. ...