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> ...
随机推荐
- python面向对象复习
1.类的语法 # 类的语法 # 定义类 class Dog(object): # 类的属性或者类变量,一般是公共属性,存在类的内存空间,所有实例对象共享 d_type = "京巴" ...
- ESP8266 + MQTT + 土壤湿度传感器
ESP8266 + MQTT + 土壤湿度传感器 连线 #include <Arduino.h> #include <Ticker.h> #include <ESP826 ...
- Ubuntu中Conda建立环境和删除环境
网上说的很全面了,这里我把我遇到的一些问题和解决方案罗列出来,以便未来的学习和了解. 博客的好处就体现出来了,下次你再用这个东西,就直接打开你的博客照抄就行了,不用东搜西搜了,及其方便,这种碎片化的东 ...
- Webshell流量分析之哥斯拉Godzilla&冰蝎Behinder
目录 哥斯拉 冰蝎 哥斯拉和冰蝎相较于菜刀蚁剑,它们的通信流量是加密的,有比较好的抗检测能力. 菜刀和蚁剑流量分析:Webshell流量分析之菜刀Chopper&蚁剑AntSword 哥斯拉 ...
- golang之常用方法/函数
1. io.Reader转化为字符串, byte切片 import "bytes" func StreamToByte(stream io.Reader) []byte { buf ...
- Git commit注释规范
指定规范的提交格式, 方便后期版本的回滚与记录的查询 格式规范: <type>(<scope>): <subject> // 空一行 <body> 范例 ...
- yum安装PHP,Redis,mysql,nginx
线上PHP环境的安装一般使用编译的方式,但是需要手动一个一个安装,这次使用yum来进行安装 一.PHP 1.安装EPEL源 rpm -ivh https://dl.fedoraproject.org/ ...
- groovy 内存回收测试
问题 在使用我们的开发平台时,客户怀疑我们的动态执行脚本会导致系统内存回收的问题,导致系统不响应,为此我专门针对这个问题,做一下详细的测试,看看是不是到底有什么影响. 测试步骤 1.使用编写一个控制器 ...
- Vue.js 事件绑定
1.事件监听 v-on:eventName可以简写成@eventName 事件对象:在HTML中,事件参数为$event,但是即使不传递,在回调函数中也可以直接使用event读取 <div id ...
- S2P彩蝶流向数据管理穿透到终端才有意义
这两年我们也是在医药行业服务当中见证了行业的变化和趋势,流向管理系统,至少到目前,在行业当中将会是很大的趋势. 01过去粗放的流向管理方式 早在十年前,整个医药行业,特别是外资企业.对实时流向管理,流 ...