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. 组装一台100TB全闪存100G光纤网络海景房幻彩RGB文件服务器【翼王】

    视频地址: https://www.youtube.com/watch?v=lzPSIzbYrlU

  2. 树莓派开机自启动热点(使用有线eth0上网,使用wlan0进行热点)

    一.背景内容 其实就是接了一单,有人需要我帮忙配置一下树莓派开机启动热点.这边做个记录,该方式树莓派4B.3B都可以使用. 二.实际操作 1.使用网线连接路由器和树莓派 树莓派的网络接口一共有三个,分 ...

  3. Codeforces 777 题目研讨

    题目连接 A B C D E 题目分析 A 难度:普及− 题面翻译: 给你三张牌:\(0\),\(1\),\(2\). 最初选一张,然后依次进行 \(n\) 次交换,交换规则为:中间一张和左边的一张, ...

  4. python之执行shell命令

    python 执行shell命令,且执行完后将shell端的输出返回 subprocess import subprocess # 要执行的命令 command = "ls -lrt&quo ...

  5. 19.使用kubeadm-ha脚本一键安装K8S

    使用kubeadm-ha脚本一键安装K8S 前情提示 以前安装k8s集群的时候使用的是k8s官网的教程 使用的镜像源都是国外的 速度慢就不说了 还有一些根本就下载不动 导致安装失败 ,使用一个开源的一 ...

  6. 2023NOIP A层联测28 T3 大眼鸹猫

    2023NOIP A层联测28 T3 大眼鸹猫 比赛做出来了,但是文抄-- 思路 分析每一个 \(i\),发现其一定需要上升或下降 \(|a_i-b_i|\). 如果求出最小操作次数,然后在此基础上, ...

  7. Spring MVC 3.2 技术预览(三):动手写一个异步Controller方法

    原文地址:http://blog.springsource.org/2012/05/10/spring-mvc-3-2-preview-making-a-controller-method-async ...

  8. ANTLR语法层的选项及动作 - ANTLR

    ANTLR语法层的选项 ANTLR语法层的选项中可以设置一系列的键值从而影响ANTLR输出的代码.这些选项是全局的,除非在某条规 则中覆盖了这些选项,否则这些选项会影响到该语法中的所有元素.选项应该紧 ...

  9. 反编译工具之Jadx

    jadx 是一款功能强大的反编译工具,使用起来简单方便(拖拽式操作),不光提供了命令行程序,还提供了 GUI 程序.一般情况下,我们直接使用 GUI 程序就可以了. jadx 支持 Windows.L ...

  10. Prometheus之系统安装,启动

    Prometheus简介Prometheus是最初在SoundCloud上构建的开源系统监视和警报工具包. 自2012年成立以来,许多公司和组织都采用了Prometheus,该项目拥有非常活跃的开发人 ...