软件介绍
可以通过加载python脚本的方式,适配任何设备的任何协议,比如我今天调试 moudbus 协议的电表,调试时需要将mac处理后组装进报文中,我之前用的串口调试助手是无能无力的,只能在其他程序中组装好报文黏贴过来再发送,费时费力,但我们可以通过python脚本,预先将组装报文的功能定义成按钮,我们甚至可以创建动态表单来添加组装报文的参数,这样一来灵活性大大提高。
而且我们调试另一种设备时,无需再度修改脚本,而是直接再写一个新的脚本,定义为B插件,程序可以通过插件切换的方式为每种设备做定制化协议,另外我可以将报文解析方式写在脚本中,将报文解析成我们能看懂的中文,而不是16进制报文,插件还可触发自动任务,比如设备上电后,对设备时间进行修正,或是设备初始化配置等,至于更多功能,大家可下载软件进行探索。
插件示例
import binascii
必须导入这个包
from super_serial_sdk.plugin_base import PluginBase
class ExamplePlugin(PluginBase):
def init(self):
super().init()
“””插件名称务必唯一”””
self.name = “示例插件”
self.initialized = False
self.main_window = None
def send_data(self, fc, data, mode):
"""发送数据到串口, 只是简化了方法名, 与直接调用下面的方法一样"""
self.main_window.send_to_serial(fc, data, mode)
"""收到串口上报的二进制字节后, 在此方法中进行逻辑处理, 如解析, 解析完成后可将消息添加到聊天框中"""
def on_received_data(self, byte_data: bytes):
"""
接收到串口数据后由主程序调用
这里实现插件的处理逻辑
"""
if not self.initialized:
self.initialize()
# 示例处理:将接收到的hex数据显示为可读格式
try:
# 如果设备报文编码是ascii用这套
# start_index = byte_data.find(b'+') + 1
# imei_bytes = byte_data[start_index:]
# mes = imei_bytes.decode('ascii') # 将字节转换为10进制字符串
# 如果设备报文是十六进制, 则注释上面那几行, 解除下面这三行注释
hex_string = binascii.hexlify(byte_data).decode('utf-8')
hex_string_separated = ' '.join([hex_string[i:i + 2] for i in range(0, len(hex_string), 2)])
mes = hex_string_separated.replace(' ', '')
"""后续会开放获取主页面中的编码复选框, 用户可视情况选择写死还是根据复选框来判断编码,
但一般情况下, 插件针对某种设备编码是一样的, 所以仍推荐插件中写死编码格式"""
# 显示到对话框中
if self.main_window:
self.main_window.add_message_for_plugin(f"[{self.name}] 接收到的数据: {mes}", 1)
except Exception as e:
print(f"[示例插件] 处理数据时出错: {e}")
# 无需关注
def initialize(self):
"""
插件初始化,如注册命令、设置参数等
"""
print("示例插件已初始化")
self.initialized = True
# main_window = self.main_window
def get_input_text(self):
"""获取主窗口中输入的文本"""
return self.main_window.input_text.toPlainText()
def clear_input_text(self):
"""清空主窗口输入框中的文本"""
self.main_window.input_text.clear()
def on_reset_button_clicked(self):
# 处理重置按钮点击事件
self.main_window.add_message_for_plugin("正在重置设备...", 2)
# 执行重置逻辑...
"""插件卸载时调用, 插件开发者无需关注"""
def cleanup(self):
# 插件卸载时清理按钮
if hasattr(self, 'main_window'):
self.main_window.clear_plugin_buttons(self.get_name())
#无需关注
def get_name(self) -> str:
"""
返回插件名称,用于下拉菜单显示
"""
return self.name
# 创建一个动态表单(示例, 若需要输入参数, 可参考此方法创建动态表单)
def getDict(self, data):
print(12321321)
self.main_window.add_message_for_plugin(f"[{self.name}] 接收到数据: {data}", 1)
def create_dialog(self, params, callback):
"""创建弹窗"""
self.main_window.createDialog(params, callback)
"""添加自定义按钮"""
def set_main_window(self, main_window):
"""
设置主窗口引用,以便插件可以调用主窗口的方法
"""
self.main_window = main_window
print("已设置主窗口引用")
# 添加一个自定义按钮
# 添加自定义按钮
buttons_config = [
("创建表单", self.createDialogTest, "b5"),
("拉闸", self.on_test_button_clicked, "b6"),
("解析输入框报文", self.jiexiInput, "b7")
]
for text, callback, button_id in buttons_config:
main_window.add_plugin_button(
plugin_name=self.get_name(),
button_text=text,
callback=callback,
button_id=button_id
)
# 解析输入框报文
def jiexiInput(self):
# 获取输入框数据
text = self.get_input_text()
# 清空输入框数据
self.cleanup()
# 这里可以写解析输入框数据的逻辑
"""这是点击事件的示例, 用户可参考本方法自行定义, 绑定到按钮上"""
def on_test_button_clicked(self):
zhiling = "ab ac ad 01 00 00 00 00" # 示例报文
# 向串口发送报文的方法, 这里基本都是组装报文的, 如果是写死的报文, 就不必处理, 直接发送到主窗口
# 这里可以做很多事情, 如将动态表单获取的数据组装进报文, 获取输入框中的数据等等
zhiling = zhiling.replace(" ", "")
mac = self.get_input_text().replace(" ", "")
if mac is not None and len(mac) == 6:
zhiling = zhiling.replace("abacfd", mac)
# 组装, 加减替换, 怎么操作都可以
# 发送报文到串口, 这里我封装了处理指令的方法, 第一个参数是 指令描述, 第二个参数是报文, 第三个参数是报文编码方式 hex或 ascii
self.main_window.send_to_serial("拉闸", zhiling, "hex")
def createDialogTest(self):
params = [
{
"title": "command",
"placeholder": "请输入命令"
},
{
"title": "description",
"placeholder": "请输入命令描述"
},
{
"title": "interval",
"placeholder": "请输入时间间隔(s)"
}
]
self.create_dialog(params, self.getDict)


隐藏内容需要回复可以看见