增加了sever 显示校准和多组分输出

This commit is contained in:
wangxibao 2025-04-15 11:10:43 +08:00
parent 8b1f0f0b7b
commit ee4086e842
24 changed files with 3981 additions and 0 deletions

8
PyMaiHak/.idea/PyMaiHak.iml generated Normal file
View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

8
PyNetAssistant_Sever/.idea/.gitignore generated vendored Normal file
View File

@ -0,0 +1,8 @@
# 默认忽略的文件
/shelf/
/workspace.xml
# 基于编辑器的 HTTP 客户端请求
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="jdk" jdkName="Python 3.11" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

View File

@ -0,0 +1,12 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="PyPep8NamingInspection" enabled="true" level="WEAK WARNING" enabled_by_default="true">
<option name="ignoredErrors">
<list>
<option value="N806" />
</list>
</option>
</inspection_tool>
</profile>
</component>

View File

@ -0,0 +1,6 @@
<component name="InspectionProjectProfileManager">
<settings>
<option name="USE_PROJECT_PROFILE" value="false" />
<version value="1.0" />
</settings>
</component>

7
PyNetAssistant_Sever/.idea/misc.xml generated Normal file
View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Black">
<option name="sdkName" value="Python 3.11" />
</component>
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.11" project-jdk-type="Python SDK" />
</project>

8
PyNetAssistant_Sever/.idea/modules.xml generated Normal file
View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/PyNetAssistant.iml" filepath="$PROJECT_DIR$/.idea/PyNetAssistant.iml" />
</modules>
</component>
</project>

6
PyNetAssistant_Sever/.idea/vcs.xml generated Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/.." vcs="Git" />
</component>
</project>

View File

@ -0,0 +1,72 @@
# -*- coding: utf-8 -*-
"""
Created on Tue May 28 15:40:48 2024
@author: WANGXIBAO
"""
# -*- coding: utf-8 -*-
import csv
import os
import re
import time
class GetDataTF(): # 读取费加罗或者自定义数据
def __init__(self, parent=None):
super().__init__()
self.indOfReturn = 0
self.TIME_FORMAT = "%Y-%m-%d %H:%M:%S"
self.headStr = ""
self.rowTitle = []
self.csv_buffer = []
def SetConfig(self, config_in):
self.regex = re.compile(config_in[0]) # 正则表达
self.headStr = config_in[1]
self.rowTitleStr = config_in[2]
# print(self.rowTitleStr)
self.rowTitle = self.rowTitleStr.split(',')
def Transdata(self, data):
if data[:2] == self.headStr:
self.data2csv = self.regex.findall(data)
returnData = float(self.data2csv[self.indOfReturn])
print("returnData", returnData)
return returnData
else:
return "noNum"
def SaveCsv(self, filenameCsv, num):
# 打开一个文件用于写入,如果文件不存在则创建
# 增加num 写入文件间隔
if os.path.isfile(filenameCsv) == 0:
# 文件为空,需要写入表头
with open(filenameCsv, mode='w', newline='') as file:
writer = csv.writer(file)
writer.writerow(self.rowTitle)
else:
timeCrvt = time.strftime(self.TIME_FORMAT, time.localtime())
self.data2csv.insert(0, timeCrvt)
print(self.data2csv)
self.csv_buffer.append(self.data2csv)
if len(self.csv_buffer) >= num:
with open(filenameCsv, mode='a', newline='') as file:
# 创建一个写入器对象
writer = csv.writer(file)
# 写入数据行
writer.writerows(self.csv_buffer)
self.csv_buffer.clear()
def IndOfReturn(self, ind):
self.indOfReturn = ind
class HexData2Num():
def __init__(self):
super().__init__()

View File

@ -0,0 +1,220 @@
[UI_config]
port = 10086
hex_send = 0
hex_receive = 0
add_date = 0
cr_lf = 2
auto_sav_log = 2
send_sever = 2
[Modbus_config]
funcode = F4
position = 5
alarm_lim = 0
[Server_config]
nir_offset = 0
[DisHex_config]
row00 = |||||0
row01 = |||||0
row02 = |||||0
row03 = |||||0
row04 = |||||0
row05 = |||||0
row06 = |||||0
row07 = |||||0
row08 = |||||0
row09 = |||||0
row10 = |||||0
row11 = |||||0
row12 = |||||0
row13 = |||||0
row14 = |||||0
row15 = |||||0
row16 = |||||0
row17 = |||||0
row18 = |||||0
row19 = |||||0
row20 = |||||0
row21 = |||||0
row22 = |||||0
row23 = |||||0
row24 = |||||0
row25 = |||||0
row26 = |||||0
row27 = |||||0
row28 = |||||0
row29 = |||||0
row30 = |||||0
row31 = |||||0
row32 = |||||0
row33 = |||||0
row34 = |||||0
row35 = |||||0
row36 = |||||0
row37 = |||||0
row38 = |||||0
row39 = |||||0
row40 = |||||0
row41 = |||||0
row42 = |||||0
row43 = |||||0
row44 = |||||0
row45 = |||||0
row46 = |||||0
row47 = |||||0
row48 = |||||0
row49 = |||||0
row50 = |||||0
row51 = |||||0
row52 = |||||0
row53 = |||||0
row54 = |||||0
row55 = |||||0
row56 = |||||0
row57 = |||||0
row58 = |||||0
row59 = |||||0
row60 = |||||0
row61 = |||||0
row62 = |||||0
row63 = |||||0
row64 = |||||0
row65 = |||||0
row66 = |||||0
row67 = |||||0
row68 = |||||0
row69 = |||||0
row70 = |||||0
row71 = |||||0
row72 = |||||0
row73 = |||||0
row74 = |||||0
row75 = |||||0
row76 = |||||0
row77 = |||||0
row78 = |||||0
row79 = |||||0
row80 = |||||0
row81 = |||||0
row82 = |||||0
row83 = |||||0
row84 = |||||0
row85 = |||||0
row86 = |||||0
row87 = |||||0
row88 = |||||0
row89 = |||||0
row90 = |||||0
row91 = |||||0
row92 = |||||0
row93 = |||||0
row94 = |||||0
row95 = |||||0
row96 = |||||0
row97 = |||||0
row98 = |||||0
[Quick_config]
log_time = 10
button00 = |
button01 = |
button02 = |
button03 = |
button04 = |
button05 = |
button06 = |
button07 = |
button08 = |
button09 = |
button10 = |
button11 = |
button12 = |
button13 = |
button14 = |
button15 = |
button16 = |
button17 = |
button18 = |
button19 = |
button20 = |
button21 = |
button22 = |
button23 = |
button24 = |
button25 = |
button26 = |
button27 = |
button28 = |
button29 = |
button30 = |
button31 = |
button32 = |
button33 = |
button34 = |
button35 = |
button36 = |
button37 = |
button38 = |
button39 = |
button40 = |
button41 = |
button42 = |
button43 = |
button44 = |
button45 = |
button46 = |
button47 = |
button48 = |
button49 = |
button50 = |
button51 = |
button52 = |
button53 = |
button54 = |
button55 = |
button56 = |
button57 = |
button58 = |
button59 = |
button60 = |
button61 = |
button62 = |
button63 = |
button64 = |
button65 = |
button66 = |
button67 = |
button68 = |
button69 = |
button70 = |
button71 = |
button72 = |
button73 = |
button74 = |
button75 = |
button76 = |
button77 = |
button78 = |
button79 = |
button80 = |
button81 = |
button82 = |
button83 = |
button84 = |
button85 = |
button86 = |
button87 = |
button88 = |
button89 = |
button90 = |
button91 = |
button92 = |
button93 = |
button94 = |
button95 = |
button96 = |
button97 = |
button98 = |

Binary file not shown.

View File

@ -0,0 +1,761 @@
# -*- coding: utf-8 -*-
"""
Created on Sun Sep 29 09:01:22 2024
@author: WANGXIBAO
"""
import csv
import datetime
import os
import threading
from flask import Flask, render_template
from flask_socketio import SocketIO
os.environ['QT_OPENGL'] = 'software' # 强制使用软件渲染
import re
import socket
import sys
import time
from configparser import ConfigParser
from PyQt5 import QtWidgets
from PyQt5.QtCore import QTimer
from PyQt5.QtWidgets import QMessageBox, QFileDialog, QInputDialog, QTableWidgetItem
from PyNetUi import Ui_UartAssistant
class Pyqt5Net(QtWidgets.QWidget, Ui_UartAssistant):
# %%初始化程序
def __init__(self):
super(Pyqt5Net, self).__init__()
self.setupUi(self)
self.quick_num = 99
self.init() #信号和槽
self.IniPath = "PyNet.ini"
self.log_time = 10
self.funcode = "F4"
self.position = 5
self.CheckCfgIniData() #更改按钮的文字
self.log_count = 0
self.log_buffer = {} #定义成一个字典,键--文件名,值--对于收到的字符串列表
# 设置Logo和标题
#self.setWindowIcon(QIcon('favicon.ico'))
self.setWindowTitle("网口调试助手【服务版】")
# 设置禁止拉伸窗口大小
#self.setFixedSize(self.width(), self.height())
# 发送数据和接收数据数目置零
self.data_num_sended = 0
self.lineEditSendNum.setText(str(self.data_num_sended))
self.data_num_received = 0
self.lineEditReceiveNum.setText(str(self.data_num_received))
# 串口关闭按钮使能关闭
self.pushButton_closeNet.setEnabled(False)
# 发送框、文本框清除
self.textEditReceive.setPlainText("")
self.textEditReceive.setMaximumBlockCount(5000)
self.textEditSend.setText("")
self.get_all_local_ips()
# 定时器接收数据
#self.timer = QTimer()
self.timer: QTimer = QTimer()
#self.timer.timeout.connect(self.data_receive)
timeout_signal = self.timer
timeout_signal.timeout.connect(self.data_receive)
#加载快捷指令
self.widget_6.hide()
#加载快捷指令的按键值
# self.init_flask() #flask
# 初始化 Flask 在后台线程中
threading.Thread(target=self.init_flask, daemon=True).start()
self.methane = 0 # 用于缓存
self.co2 = 0 # 用于缓存
self.ethane = 0 # 用于缓存
self.temperature = 0 # 用于缓存
self.nir_offset = 0 # 用于平移数据
#建立信号与槽
def init(self):
self.pushButton_openNet.clicked.connect(self.open_net)
self.pushButton_closeNet.clicked.connect(self.close_net)
self.pushButtonSend.clicked.connect(lambda: self.data_send(text_quick=None))
# 清除发送按钮
self.pushButtonClearSend.clicked.connect(self.send_data_clear)
# 清除接收按钮
self.pushButtonClearReceive.clicked.connect(self.receive_data_clear)
#
# 定时发送数据
self.timer_send = QTimer()
self.timer_send.timeout.connect(self.data_send)
self.checkBoxReapitSend.stateChanged.connect(self.data_send_timer)
# 快捷指令扩展区域
self.pushButton_expend.clicked.connect(self.adjust_sidebar)
# 清空网络通道列表
self.pushButtonClearChannel.clicked.connect(self.channel_clear)
# 动态创建控件并存储引用
for i in range(self.quick_num): # 从0到20
index_str = f"{i:02}" # 确保编号为两位数字形式
horizontalLayoutName = f"horizontalLayoutQuick_{index_str}"
horizontalLayout = QtWidgets.QHBoxLayout()
horizontalLayout.setObjectName(horizontalLayoutName)
# 创建 QLineEdit 并设置动态属性
lineEditName = f"lineEditQuick_{index_str}"
setattr(self, lineEditName, QtWidgets.QLineEdit(self.layoutWidget1))
getattr(self, lineEditName).setObjectName(lineEditName)
horizontalLayout.addWidget(getattr(self, lineEditName))
# 创建 QPushButton 并设置动态属性
buttonName = f"pushButtonQuick_{index_str}"
setattr(self, buttonName, QtWidgets.QPushButton(self.layoutWidget1))
getattr(self, buttonName).setObjectName(buttonName)
horizontalLayout.addWidget(getattr(self, buttonName))
self.verticalLayout_8.addLayout(horizontalLayout)
# 连接按钮点击事件到槽函数
button = getattr(self, buttonName)
if button:
button.clicked.connect(lambda checked, idx=i: self.onButtonClick(idx))
# 建立表格解析并显示hex
self.tableWidget.setRowCount(self.quick_num)
for i in range(self.quick_num): # 从0到20
item = QtWidgets.QTableWidgetItem()
item.setCheckState(0)
self.tableWidget.setItem(i, 0, item)
self.double_click_timers = {} # 存储双击定时器
#%% 重写关闭按钮
def closeEvent(self, event):
self.SavConfig()
self.close_net()
# 调用父类的关闭事件处理函数
super().closeEvent(event)
#加载本地网络地址
def get_all_local_ips(self):
ip_addresses = []
for interface in socket.getaddrinfo(socket.gethostname(), None):
address = interface[4][0]
if ':' not in address: # IPv6地址包含冒号
ip_addresses.append(address)
print(ip_addresses)
for ip in ip_addresses:
self.comboBox_localAddr.insertItem(0, ip)
self.comboBox_localAddr.setCurrentIndex(0)
# 打开网络连接
def open_net(self):
IP = self.comboBox_localAddr.currentText()
port = self.lineEdit_port.text()
udp_addr = (IP, int(port))
self.udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) #创建接收空socket
print("绑定地址", udp_addr)
try:
self.udp_socket.bind(udp_addr)
print("开始监听。。。")
# 设置套接字为非阻塞模式
self.udp_socket.setblocking(False)
except Exception as e:
print(f"Error reading configuration: {e}")
return None
#使能相关按钮
self.pushButton_closeNet.setEnabled(True)
self.pushButton_openNet.setEnabled(False)
# 打开串口接收定时器周期为1ms
self.timer.start(20)
def close_net(self):
if hasattr(self, 'udp_socket'):
self.timer.stop()
self.udp_socket.close()
#使能相关按钮
self.pushButton_closeNet.setEnabled(False)
self.pushButton_openNet.setEnabled(True)
print("关闭网络连接")
def set_textEditReceive_cursor(self):
# 获取到text光标
textCursor = self.textEditReceive.textCursor()
# 滚动到底部
textCursor.movePosition(textCursor.End)
# 设置光标到text中去
self.textEditReceive.setTextCursor(textCursor)
#接收数据
def data_receive(self):
try:
recv_data = self.udp_socket.recvfrom(1024) # 1024表示本次接收的最大字节数
out_s = ''
# 打印接收到的数据
if self.checkBoxHexReceive.checkState():
line_utf8 = recv_data[0].hex().upper()
out_s = ' '.join(['{:02X}'.format(b) for b in bytes.fromhex(line_utf8)])
else:
line_utf8 = recv_data[0].decode('utf-8', errors='replace')
print("[From %s:%d]:%s" % (recv_data[1][0], recv_data[1][1], line_utf8))
num = len(line_utf8)
# 接收窗口中增加来源地址显示
recv_addr = recv_data[1][0] + ':' + str(recv_data[1][1])
if not self.is_in_comboBox_channel(recv_addr):
self.comboBox_channel.addItem(recv_addr)
# 在接收窗口显示
# 获取到text光标
self.set_textEditReceive_cursor()
#选择要显示的通道
if recv_addr == self.comboBox_channel.currentText() or self.comboBox_channel.currentText() == "ALL":
#self.textEditReceive.insertPlainText('<' + recv_addr+ '> ' )
if self.checkBoxAddDate.isChecked():
nowTime = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")
nowTime = nowTime[:-3]
self.textEditReceive.insertPlainText(nowTime + " ")
#self.add_line_to_textedit(nowTime + " ")
# HEX显示数据
if self.checkBoxHexReceive.checkState():
# line_utf8_bytes = line_utf8.hex() # 编码为 UTF-8 字节串
# for byte in line_utf8_bytes:
# out_s += '{:02X} '.format(byte) # 使用大写字母 X
# self.textEditReceive.insertPlainText(out_s)
self.textEditReceive.insertPlainText('<' + recv_addr + '> ' + out_s)
#self.add_line_to_textedit('<' + recv_addr + '> ' + out_s)
# 解析数据
self.Disp_hex_receive(line_utf8)
# ASCII显示数据
else:
#print("解码前",datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f"))
self.textEditReceive.insertPlainText('<' + recv_addr + '> ' + line_utf8)
#self.add_line_to_textedit('<' + recv_addr + '> ' + line_utf8)
#print("解码数据",datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f"))
# 接收换行
if self.checkBoxCRLF.isChecked():
self.textEditReceive.insertPlainText('\r\n')
# 设置text光标
self.set_textEditReceive_cursor()
# 统计接收字符的数量
self.data_num_received += num
self.lineEditReceiveNum.setText(str(self.data_num_received))
# 自动保存日志
if self.checkBoxAutoSaveLog.isChecked():
if self.checkBoxHexReceive.checkState():
#根据功能码保存数据
if line_utf8[2 * self.position:2 * self.position + 2] == self.funcode:
sav_name = line_utf8[0:8] + '_' + datetime.datetime.now().strftime("%Y-%m-%d") + '.txt'
sav_str = datetime.datetime.now().strftime("%Y-%m-%dT%H:%M:%S.%f")[:23] + " " + out_s[
12:] + "\r\n"
#当表示浓度的字符不为0时 将数据单独记录
if int(line_utf8[14:18], 16) > self.alarm_lim:
sav_name_alarm = 'alarm_' + line_utf8[0:8] + '_' + datetime.datetime.now().strftime(
"%Y-%m-%d") + '.txt'
sav_str_alarm = datetime.datetime.now().strftime("%Y-%m-%dT%H:%M:%S.%f")[:23] + " " + out_s[
12:] + "\r\n"
with open(sav_name_alarm, mode='a', newline='', encoding='utf-8', errors='replace') as file:
file.writelines(sav_str_alarm)
else:
sav_name = datetime.datetime.now().strftime("%Y-%m-%d") + '.log'
sav_str = datetime.datetime.now().strftime("%Y-%m-%dT%H:%M:%S.%f")[:23] + " " + out_s + "\r\n"
# Ascii 数据保存
else:
line = line_utf8.split(',')
if len(line) == 2:
sav_name = line[0] + '_' + datetime.datetime.now().strftime("%Y-%m-%d") + '.txt'
sav_str = datetime.datetime.now().strftime("%Y-%m-%dT%H:%M:%S.%f")[:23] + " " + line[1]
if self.checkBoxSendSever.isChecked():
self.send_data_to_server(line)
else:
sav_name = datetime.datetime.now().strftime("%Y-%m-%d") + '.log'
sav_str = datetime.datetime.now().strftime("%Y-%m-%dT%H:%M:%S.%f")[:23] + " " + line_utf8
# 将日志信息添加到缓冲区
if sav_name not in self.log_buffer:
self.log_buffer[sav_name] = []
self.log_buffer[sav_name].append(sav_str)
# 当缓冲区中的记录达到10条时写入文件
if len(self.log_buffer[sav_name]) >= self.log_time:
with open(sav_name, mode='a', newline='', encoding='utf-8', errors='replace') as file:
file.writelines(self.log_buffer[sav_name])
self.log_buffer[sav_name].clear()
except socket.error as e:
#print(f"Socket error: {e}")
pass
def data_send(self, text_quick=None):
if text_quick == None:
input_s = self.textEditSend.toPlainText()
else:
input_s = text_quick
try:
if input_s != "":
# 时间显示
if self.checkBoxAddDate.isChecked():
self.textEditReceive.insertPlainText((time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) + " ")
# HEX发送
if self.checkBoxHexSend.isChecked():
input_s = input_s.strip()
send_list = []
while input_s != '':
try:
num = int(input_s[0:2], 16)
except ValueError:
QMessageBox.critical(self, '串口异常', '请输入规范十六进制数据,以空格分开!')
return None
input_s = input_s[2:].strip()
send_list.append(num)
input_s = bytes(send_list)
# ASCII发送
else:
input_s = (input_s).encode('utf-8')
input_s = re.sub(b'(?<!\r)\n', b'\r\n', input_s)
# HEX接收显示
if self.checkBoxHexReceive.isChecked():
out_s = ''
for i in range(0, len(input_s)):
out_s = out_s + '{:02X}'.format(input_s[i]) + ' '
print(out_s)
self.textEditReceive.insertPlainText(out_s)
#self.add_line_to_textedit(out_s)
# ASCII接收显示
else:
self.textEditReceive.insertPlainText(input_s.decode('utf-8'))
#self.add_line_to_textedit(input_s.decode('utf-8'))
# 接收换行
if self.checkBoxCRLF.isChecked():
self.textEditReceive.insertPlainText('\r\n')
# 获取到Text光标
textCursor = self.textEditReceive.textCursor()
# 滚动到底部
textCursor.movePosition(textCursor.End)
# 设置光标到Text中去
self.textEditReceive.setTextCursor(textCursor)
# 发送全部通道
if self.checkBoxSendAll.isChecked():
# 弹出确认对话框
if QMessageBox.question(None, "警告", "发送所有通道,是否继续执行?") == QMessageBox.Yes:
for i in range(1, self.comboBox_channel.count()):
# 定义服务器的IP地址和端口号
sever = self.comboBox_channel.itemText(i).split(':')
server_ip = sever[0]
server_port = int(sever[1])
server_address = (server_ip, server_port)
# 将消息发送到服务器
num = self.udp_socket.sendto(input_s, server_address)
# 统计发送字符数量
self.data_num_sended += num
else:
#发送单个通道
#定义服务器的IP地址和端口号
sever = self.comboBox_channel.currentText().split(':')
server_ip = sever[0]
server_port = int(sever[1])
server_address = (server_ip, server_port)
# 将消息发送到服务器
num = self.udp_socket.sendto(input_s, server_address)
# 统计发送字符数量
self.data_num_sended += num
self.lineEditSendNum.setText(str(self.data_num_sended))
except:
pass
# %%定时发送数据
def data_send_timer(self):
try:
if 1 <= int(self.lineEditTime.text()) <= 30000: # 定时时间1ms~30s内
if self.checkBoxReapitSend.isChecked():
self.timer_send.start(int(self.lineEditTime.text()))
self.lineEditTime.setEnabled(False)
else:
self.timer_send.stop()
self.lineEditTime.setEnabled(True)
else:
QMessageBox.critical(self, '定时发送数据异常', '定时发送数据周期仅可设置在30秒内')
except:
QMessageBox.critical(self, '定时发送数据异常', '请设置正确的数值类型!')
# %%保存日志
def savefiles(self):
dlg = QFileDialog()
filenames = dlg.getSaveFileName(None, "保存日志文件", None, "Txt files(*.txt)")
try:
with open(file=filenames[0], mode='w', encoding='utf-8') as file:
file.write(self.textEditReceive.toPlainText())
except:
QMessageBox.critical(self, '日志异常', '保存日志文件失败!')
#%% 加载日志
def openfiles(self):
dlg = QFileDialog()
filenames = dlg.getOpenFileName(None, "加载日志文件", None, "Txt files(*.txt)")
try:
with open(file=filenames[0], mode='r', encoding='utf-8') as file:
self.textEditSend.setPlainText(file.read())
except:
QMessageBox.critical(self, '日志异常', '加载日志文件失败!')
#%% 清除计数
def send_data_clear(self):
self.textEditSend.setText("")
self.data_num_sended = 0
self.lineEditSendNum.setText(str(self.data_num_sended))
# 清除接收数据显示
def receive_data_clear(self):
self.textEditReceive.setPlainText("")
self.data_num_received = 0
self.lineEditSendNum.setText(str(self.data_num_received))
def Disp_hex_receive(self, hexdata):
len = self.tableWidget.rowCount()
try:
for i in range(len):
if self.tableWidget.item(i, 0).checkState() == 2:
start = int(self.tableWidget.item(i, 1).text())
num = int(self.tableWidget.item(i, 2).text())
scale = int(self.tableWidget.item(i, 3).text())
hex_str = hexdata[start * 2:(start + num) * 2]
item = QTableWidgetItem(hex_str)
self.tableWidget.setItem(i, 4, item)
value = int(hex_str, 16) / scale
item = QTableWidgetItem(str(value))
self.tableWidget.setItem(i, 5, item)
except Exception as e:
print(e)
pass
#设置接受区域显示条数
def add_line_to_textedit(self, new_line):
# 获取当前文本并按行分割
current_lines = self.textEditReceive.toPlainText().splitlines()
# 添加新的行到列表中
current_lines.append(new_line)
# 如果行数超过100则删除最早的行直到剩下100行
if len(current_lines) > 1000:
current_lines = current_lines[-1000:] # 只保留最新的100行
# 将更新后的行列表转换回字符串并设置为textEdit的内容
self.textEditReceive.setPlainText('\n'.join(current_lines))
#检查是否在comboBox_channel中
def is_in_comboBox_channel(self, addr_rece):
for i in range(self.comboBox_channel.count()):
if addr_rece == self.comboBox_channel.itemText(i):
return True
return False
def channel_clear(self):
self.comboBox_channel.lineEdit().clear()
for i in range(self.comboBox_channel.count() - 1):
self.comboBox_channel.removeItem(1)
self.comboBox_channel.setCurrentIndex(0)
#开关快捷指令栏
def adjust_sidebar(self):
if self.widget_6.isHidden():
self.widget_6.show()
else:
self.widget_6.hide()
def onPushButtonQuickClicked(self, line_edit):
text = getattr(self, line_edit).text()
#print(f"Button clicked: {text}")
if self.checkBox_return.isChecked():
text = text + "\r\n"
self.data_send(text)
def CheckCfgIniData(self):
if not os.path.exists(self.IniPath):
config = ConfigParser()
#UI_config
config.add_section('UI_config')
config.set('UI_config', 'port', '9000')
config.set('UI_config', 'hex_send', '0')
config.set('UI_config', 'hex_receive', '0')
config.set('UI_config', 'add_date', '0')
config.set('UI_config', 'cr_lf', '0')
config.set('UI_config', 'auto_sav_log', '2')
config.set('UI_config', 'send_sever', '0')
# Modbus_config
config.add_section('Modbus_config')
config.set('Modbus_config', 'funcode', 'F4') #识别码
config.set('Modbus_config', 'position', '5') #识别码所在位置
config.set('Modbus_config', 'alarm_lim', '0')
# Server_config
config.add_section('Server_config')
config.set('Server_config', 'nir_offset','0')
#DisHex_config
config.add_section('DisHex_config')
for i in range(self.quick_num):
idx = f'{i:02}'
rowname = f'row{idx}'
config.set('DisHex_config', rowname, '|||||0')
#Quick_config
config.add_section('Quick_config')
config.set('Quick_config', 'log_time', '10')
for i in range(self.quick_num):
idx = f'{i:02}'
button_name = f'Button{idx}' # 格式化按钮名称,确保两位数
config.set('Quick_config', button_name, '')
with open(self.IniPath, 'w', encoding='utf-8') as f:
config.write(f)
# 读取数据
try:
config = ConfigParser()
config.read(self.IniPath, encoding='utf-8')
# UI_config
port = config.get('UI_config', 'port')
hex_send = int(config.get('UI_config', 'hex_send'))
hex_receive = int(config.get('UI_config', 'hex_receive'))
add_date = int(config.get('UI_config', 'add_date'))
cr_lf = int(config.get('UI_config', 'cr_lf'))
auto_sav_log = int(config.get('UI_config', 'auto_sav_log'))
send_sever = int(config.get('UI_config', 'send_sever'))
self.lineEdit_port.setText(port)
self.checkBoxHexSend.setChecked(hex_send)
self.checkBoxHexReceive.setChecked(hex_receive)
self.checkBoxAddDate.setChecked(add_date)
self.checkBoxCRLF.setChecked(cr_lf)
self.checkBoxAutoSaveLog.setChecked(auto_sav_log)
self.checkBoxSendSever.setChecked(send_sever)
# Modbus_config
self.funcode = config.get('Modbus_config', 'funcode')
self.position = int(config.get('Modbus_config', 'position'))
self.alarm_lim = int(config.get('Modbus_config', 'alarm_lim'))
# Server_config
self.nir_offset = int(config.get('Server_config', 'nir_offset'))
# DisHex_config
for i in range(self.quick_num):
idx = f'{i:02}'
rowname = f'row{idx}'
rowstr = config.get('DisHex_config', rowname)
rowstr_split = rowstr.split('|')
for col in range(len(rowstr_split) - 1):
item = QtWidgets.QTableWidgetItem()
item.setText(rowstr_split[col])
self.tableWidget.setItem(i, col, item)
select = int(rowstr_split[col + 1])
item = self.tableWidget.item(i, 0) # 先反读回来再设置不然text丢失
item.setCheckState(select)
self.tableWidget.setItem(i, 0, item)
# Quick_config
# 创建一个空字典来存储按钮名称和对应的配置
self.log_time = int(config.get('Quick_config', 'log_time'))
# 循环遍历按钮编号从0到19
for i in range(self.quick_num):
idx = f'{i:02}'
button_name = f'Button{idx}' # 格式化按钮名称,确保两位数
# 使用 get 方法安全地获取配置,如果不存在则返回空字符串
config_value = config.get('Quick_config', button_name, fallback='')
config_value_split = config_value.split('|')
# 将按钮名称和配置信息存储在字典中
if len(config_value_split) == 2:
# 打印字典查看结果,并赋值
print(button_name, config_value_split[0], config_value_split[1])
getattr(self, f'pushButtonQuick_{idx}').setText(config_value_split[1])
getattr(self, f'lineEditQuick_{idx}').setText(config_value_split[0])
except Exception as e:
print(f"Error reading configuration: {e}")
QMessageBox.critical(self, "Error", f"Error reading configuration: {e}")
def SavConfig(self):
#关闭界面前保存快捷区域的命令和名称
config = ConfigParser()
config.read(self.IniPath, encoding='utf-8')
# 保存UI_config
config.set('UI_config', 'port', str(self.lineEdit_port.text()))
config.set('UI_config', 'hex_send', str(self.checkBoxHexSend.checkState()))
config.set('UI_config', 'hex_receive', str(self.checkBoxHexReceive.checkState()))
config.set('UI_config', 'add_date', str(self.checkBoxAddDate.checkState()))
config.set('UI_config', 'cr_lf', str(self.checkBoxCRLF.checkState()))
config.set('UI_config', 'auto_sav_log', str(self.checkBoxAutoSaveLog.checkState()))
config.set('UI_config', 'send_sever', str(self.checkBoxSendSever.checkState()))
# 保存DisHex_config
for i in range(self.quick_num):
rowstr = []
idx = f'{i:02}'
rowname = f'row{idx}'
for col in range(self.tableWidget.columnCount() - 1):
item = self.tableWidget.item(i, col)
if item is not None:
rowstr.append(item.text())
else:
rowstr.append('') # 如果单元格为空,则添加空字符串
selectStr = str(self.tableWidget.item(i, 0).checkState())
row_string = '|'.join(rowstr) + f'|{selectStr}'
config.set('DisHex_config', rowname, row_string)
# 保存快捷按钮
for i in range(self.quick_num): # 假设有20个按钮
index_str = f"{i:02}" # 确保编号为两位数字形式
lineEditName = f"lineEditQuick_{index_str}"
buttonName = f"pushButtonQuick_{index_str}" # 格式化按钮名称,确保两位数
button_name = f"button{index_str}"
set_text = getattr(self, lineEditName).text() + "|" + getattr(self, buttonName).text()
config.set('Quick_config', button_name, set_text)
with open(self.IniPath, 'w', encoding='utf-8') as f:
config.write(f)
def onButtonClick(self, idx):
# 槽函数处理按钮点击事件
if idx not in self.double_click_timers:
self.double_click_timers[idx] = None
if self.double_click_timers[idx] is None:
self.double_click_timers[idx] = True
QTimer.singleShot(200, lambda: self.onButtonSigleClick(idx))
else:
self.onButtonDoubleClick(idx)
def onButtonSigleClick(self, idx):
index_str = f"{idx:02}"
if self.double_click_timers[idx]:
self.double_click_timers[idx] = None
lineEdit = getattr(self, f"lineEditQuick_{index_str}")
print(f"Text in lineEdit_{idx}: {lineEdit.text()}")
text = lineEdit.text()
if self.checkBox_return.isChecked():
text = text + "\r\n"
self.data_send(text)
def onButtonDoubleClick(self, idx):
# 槽函数处理按钮双击事件
self.double_click_timers[idx] = None
index_str = f"{idx:02}"
print(f"Double click detected on Button {index_str}.")
button = getattr(self, f"pushButtonQuick_{index_str}")
new_name, ok = QInputDialog.getText(self, 'Button Rename', 'Enter new button name:')
if ok and new_name:
button.setText(new_name)
def init_flask(self):
# 创建Flask应用
self.app = Flask(__name__) # 修改为实例变量
self.app.config['SECRET_KEY'] = 'secret!'
self.socketio = SocketIO(self.app)
# 主页路由
@self.app.route('/')
def index():
return render_template('index.html')
# 启动Flask-SocketIO服务器
self.socketio.run(self.app, host='0.0.0.0', port=8000, allow_unsafe_werkzeug=True)
def send_data_to_server(self, data: list[str]):
if data[0] == 'Z02':
numbers = re.findall(r'-?\d+\.?\d*', data[1])
if numbers:
# 假设我们只发送第一个数字,如果有多个数字可以根据需要处理
self.co2 = float(numbers[0])
self.socketio.emit('co2_data', {'value': self.co2})
print(f"发送二氧化碳数据: {self.co2}")
else:
print("未找到有效的数字")
if data[0] == 'Z03':
numbers = re.findall(r'-?\d+\.?\d*', data[1])
if len(numbers) > 1:
# 假设我们只发送第一个数字,如果有多个数字可以根据需要处理
self.methane = int(float(numbers[0]) * 10000)
self.socketio.emit('methane_data', {'value': self.methane})
print(f"发送甲烷数据: {self.methane}")
self.temperature = float(numbers[1])
self.socketio.emit('temperature_data', {'value': self.temperature})
print(f"发送温度数据: {self.temperature}")
else:
print("未找到有效的数字")
if data[0] == 'Z01':
numbers = re.findall(r'-?\d+\.?\d*', data[1])
if numbers:
# 假设我们只发送第一个数字,如果有多个数字可以根据需要处理 0.6457 0.8
methane_nir = float(numbers[0])
delta = int((methane_nir*0.55 + 2000 - self.methane) /4 + self.nir_offset)
if delta <= 600:
self.ethane = 0
else:
self.ethane = delta
self.socketio.emit('ethane_data', {'value': self.ethane})
print(f"发送乙烷数据: {self.ethane}")
self.sav_multi_csv() # 乙烷数据更新时保存一次数据
else:
print("未找到有效的数字")
def sav_multi_csv(self):
filename = f"{datetime.datetime.now().strftime('%Y-%m-%d')}.csv"
timestamp = datetime.datetime.now().strftime('%Y-%m-%dT%H:%M:%S.%f')[:23]
with open(filename, mode='a', newline='', encoding='utf-8') as file:
writer = csv.writer(file)
# 写入表头
if file.tell() == 0:
writer.writerow(['time', 'Temperature', 'Methane', 'Ethane', 'CO2'])
# 写入数据
writer.writerow([timestamp, self.temperature, self.methane, self.ethane, self.co2])
#执行
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
myshow = Pyqt5Net()
myshow.show()
sys.exit(app.exec_())

View File

@ -0,0 +1,418 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'PyNetUi.ui'
#
# Created by: PyQt5 UI code generator 5.15.10
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_UartAssistant(object):
def setupUi(self, UartAssistant):
UartAssistant.setObjectName("UartAssistant")
UartAssistant.resize(956, 650)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(2)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(UartAssistant.sizePolicy().hasHeightForWidth())
UartAssistant.setSizePolicy(sizePolicy)
UartAssistant.setAcceptDrops(True)
icon = QtGui.QIcon()
icon.addPixmap(QtGui.QPixmap("favicon.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
UartAssistant.setWindowIcon(icon)
self.horizontalLayout_2 = QtWidgets.QHBoxLayout(UartAssistant)
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
self.widget_7 = QtWidgets.QWidget(UartAssistant)
self.widget_7.setObjectName("widget_7")
self.horizontalLayout_14 = QtWidgets.QHBoxLayout(self.widget_7)
self.horizontalLayout_14.setObjectName("horizontalLayout_14")
self.splitter = QtWidgets.QSplitter(self.widget_7)
self.splitter.setMaximumSize(QtCore.QSize(16777215, 16777215))
self.splitter.setOrientation(QtCore.Qt.Horizontal)
self.splitter.setHandleWidth(5)
self.splitter.setObjectName("splitter")
self.widget_4 = QtWidgets.QWidget(self.splitter)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.widget_4.sizePolicy().hasHeightForWidth())
self.widget_4.setSizePolicy(sizePolicy)
self.widget_4.setMinimumSize(QtCore.QSize(230, 0))
self.widget_4.setObjectName("widget_4")
self.horizontalLayout = QtWidgets.QHBoxLayout(self.widget_4)
self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout.setSpacing(0)
self.horizontalLayout.setObjectName("horizontalLayout")
self.widget = QtWidgets.QWidget(self.widget_4)
self.widget.setObjectName("widget")
self.verticalLayout_5 = QtWidgets.QVBoxLayout(self.widget)
self.verticalLayout_5.setObjectName("verticalLayout_5")
self.groupBox = QtWidgets.QGroupBox(self.widget)
self.groupBox.setMinimumSize(QtCore.QSize(0, 0))
self.groupBox.setBaseSize(QtCore.QSize(271, 291))
self.groupBox.setObjectName("groupBox")
self.layoutWidget = QtWidgets.QWidget(self.groupBox)
self.layoutWidget.setGeometry(QtCore.QRect(10, 20, 201, 201))
self.layoutWidget.setObjectName("layoutWidget")
self.verticalLayout = QtWidgets.QVBoxLayout(self.layoutWidget)
self.verticalLayout.setContentsMargins(0, 0, 0, 0)
self.verticalLayout.setObjectName("verticalLayout")
self.label = QtWidgets.QLabel(self.layoutWidget)
self.label.setObjectName("label")
self.verticalLayout.addWidget(self.label)
self.comboBox_protocol = QtWidgets.QComboBox(self.layoutWidget)
self.comboBox_protocol.setObjectName("comboBox_protocol")
self.comboBox_protocol.addItem("")
self.verticalLayout.addWidget(self.comboBox_protocol)
self.label_2 = QtWidgets.QLabel(self.layoutWidget)
self.label_2.setObjectName("label_2")
self.verticalLayout.addWidget(self.label_2)
self.comboBox_localAddr = QtWidgets.QComboBox(self.layoutWidget)
self.comboBox_localAddr.setToolTipDuration(0)
self.comboBox_localAddr.setEditable(True)
self.comboBox_localAddr.setObjectName("comboBox_localAddr")
self.comboBox_localAddr.addItem("")
self.comboBox_localAddr.addItem("")
self.verticalLayout.addWidget(self.comboBox_localAddr)
self.label_3 = QtWidgets.QLabel(self.layoutWidget)
self.label_3.setObjectName("label_3")
self.verticalLayout.addWidget(self.label_3)
self.lineEdit_port = QtWidgets.QLineEdit(self.layoutWidget)
self.lineEdit_port.setObjectName("lineEdit_port")
self.verticalLayout.addWidget(self.lineEdit_port)
self.pushButton_openNet = QtWidgets.QPushButton(self.layoutWidget)
self.pushButton_openNet.setStyleSheet("background-color: rgb(0, 255, 0);")
self.pushButton_openNet.setObjectName("pushButton_openNet")
self.verticalLayout.addWidget(self.pushButton_openNet)
self.pushButton_closeNet = QtWidgets.QPushButton(self.layoutWidget)
self.pushButton_closeNet.setObjectName("pushButton_closeNet")
self.verticalLayout.addWidget(self.pushButton_closeNet)
self.verticalLayout_5.addWidget(self.groupBox)
self.groupBox_2 = QtWidgets.QGroupBox(self.widget)
self.groupBox_2.setMinimumSize(QtCore.QSize(0, 0))
self.groupBox_2.setBaseSize(QtCore.QSize(271, 165))
self.groupBox_2.setObjectName("groupBox_2")
self.layoutWidget_5 = QtWidgets.QWidget(self.groupBox_2)
self.layoutWidget_5.setGeometry(QtCore.QRect(10, 20, 197, 79))
self.layoutWidget_5.setObjectName("layoutWidget_5")
self.verticalLayout_6 = QtWidgets.QVBoxLayout(self.layoutWidget_5)
self.verticalLayout_6.setContentsMargins(0, 0, 0, 0)
self.verticalLayout_6.setObjectName("verticalLayout_6")
self.horizontalLayout_10 = QtWidgets.QHBoxLayout()
self.horizontalLayout_10.setObjectName("horizontalLayout_10")
self.checkBoxHexSend = QtWidgets.QCheckBox(self.layoutWidget_5)
self.checkBoxHexSend.setObjectName("checkBoxHexSend")
self.horizontalLayout_10.addWidget(self.checkBoxHexSend)
self.checkBoxHexReceive = QtWidgets.QCheckBox(self.layoutWidget_5)
self.checkBoxHexReceive.setObjectName("checkBoxHexReceive")
self.horizontalLayout_10.addWidget(self.checkBoxHexReceive)
self.verticalLayout_6.addLayout(self.horizontalLayout_10)
self.horizontalLayout_12 = QtWidgets.QHBoxLayout()
self.horizontalLayout_12.setObjectName("horizontalLayout_12")
self.checkBoxAddDate = QtWidgets.QCheckBox(self.layoutWidget_5)
self.checkBoxAddDate.setObjectName("checkBoxAddDate")
self.horizontalLayout_12.addWidget(self.checkBoxAddDate)
self.checkBoxCRLF = QtWidgets.QCheckBox(self.layoutWidget_5)
self.checkBoxCRLF.setObjectName("checkBoxCRLF")
self.horizontalLayout_12.addWidget(self.checkBoxCRLF)
self.verticalLayout_6.addLayout(self.horizontalLayout_12)
self.layoutWidget_6 = QtWidgets.QWidget(self.groupBox_2)
self.layoutWidget_6.setGeometry(QtCore.QRect(10, 130, 195, 30))
self.layoutWidget_6.setObjectName("layoutWidget_6")
self.horizontalLayout_13 = QtWidgets.QHBoxLayout(self.layoutWidget_6)
self.horizontalLayout_13.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout_13.setObjectName("horizontalLayout_13")
self.pushButtonLogSave = QtWidgets.QPushButton(self.layoutWidget_6)
self.pushButtonLogSave.setObjectName("pushButtonLogSave")
self.horizontalLayout_13.addWidget(self.pushButtonLogSave)
self.pushButtonLogLoad = QtWidgets.QPushButton(self.layoutWidget_6)
self.pushButtonLogLoad.setObjectName("pushButtonLogLoad")
self.horizontalLayout_13.addWidget(self.pushButtonLogLoad)
self.layoutWidget1 = QtWidgets.QWidget(self.groupBox_2)
self.layoutWidget1.setGeometry(QtCore.QRect(12, 100, 191, 31))
self.layoutWidget1.setObjectName("layoutWidget1")
self.horizontalLayout_4 = QtWidgets.QHBoxLayout(self.layoutWidget1)
self.horizontalLayout_4.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout_4.setObjectName("horizontalLayout_4")
self.checkBoxAutoSaveLog = QtWidgets.QCheckBox(self.layoutWidget1)
self.checkBoxAutoSaveLog.setChecked(True)
self.checkBoxAutoSaveLog.setObjectName("checkBoxAutoSaveLog")
self.horizontalLayout_4.addWidget(self.checkBoxAutoSaveLog)
self.checkBoxSendSever = QtWidgets.QCheckBox(self.layoutWidget1)
self.checkBoxSendSever.setChecked(False)
self.checkBoxSendSever.setObjectName("checkBoxSendSever")
self.horizontalLayout_4.addWidget(self.checkBoxSendSever)
self.verticalLayout_5.addWidget(self.groupBox_2)
self.groupBox_3 = QtWidgets.QGroupBox(self.widget)
self.groupBox_3.setMinimumSize(QtCore.QSize(0, 0))
self.groupBox_3.setBaseSize(QtCore.QSize(271, 80))
self.groupBox_3.setObjectName("groupBox_3")
self.checkBoxReapitSend = QtWidgets.QCheckBox(self.groupBox_3)
self.checkBoxReapitSend.setGeometry(QtCore.QRect(10, 30, 91, 19))
self.checkBoxReapitSend.setObjectName("checkBoxReapitSend")
self.label_7 = QtWidgets.QLabel(self.groupBox_3)
self.label_7.setGeometry(QtCore.QRect(170, 30, 51, 16))
self.label_7.setObjectName("label_7")
self.lineEditTime = QtWidgets.QLineEdit(self.groupBox_3)
self.lineEditTime.setGeometry(QtCore.QRect(110, 30, 51, 21))
self.lineEditTime.setObjectName("lineEditTime")
self.verticalLayout_5.addWidget(self.groupBox_3)
spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
self.verticalLayout_5.addItem(spacerItem)
self.groupBox_6 = QtWidgets.QGroupBox(self.widget)
self.groupBox_6.setMinimumSize(QtCore.QSize(0, 0))
self.groupBox_6.setBaseSize(QtCore.QSize(281, 80))
self.groupBox_6.setTitle("")
self.groupBox_6.setObjectName("groupBox_6")
self.label_9 = QtWidgets.QLabel(self.groupBox_6)
self.label_9.setGeometry(QtCore.QRect(120, 20, 72, 15))
self.label_9.setObjectName("label_9")
self.lineEditSendNum = QtWidgets.QLineEdit(self.groupBox_6)
self.lineEditSendNum.setGeometry(QtCore.QRect(40, 20, 61, 21))
self.lineEditSendNum.setObjectName("lineEditSendNum")
self.lineEditReceiveNum = QtWidgets.QLineEdit(self.groupBox_6)
self.lineEditReceiveNum.setGeometry(QtCore.QRect(140, 20, 61, 21))
self.lineEditReceiveNum.setObjectName("lineEditReceiveNum")
self.label_10 = QtWidgets.QLabel(self.groupBox_6)
self.label_10.setGeometry(QtCore.QRect(20, 40, 131, 16))
self.label_10.setObjectName("label_10")
self.label_SendNum = QtWidgets.QLabel(self.groupBox_6)
self.label_SendNum.setGeometry(QtCore.QRect(20, 20, 72, 15))
self.label_SendNum.setObjectName("label_SendNum")
self.verticalLayout_5.addWidget(self.groupBox_6)
self.verticalLayout_5.setStretch(0, 8)
self.verticalLayout_5.setStretch(1, 6)
self.verticalLayout_5.setStretch(2, 2)
self.verticalLayout_5.setStretch(4, 2)
self.horizontalLayout.addWidget(self.widget)
self.widget_5 = QtWidgets.QWidget(self.splitter)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(1)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.widget_5.sizePolicy().hasHeightForWidth())
self.widget_5.setSizePolicy(sizePolicy)
self.widget_5.setMinimumSize(QtCore.QSize(400, 0))
self.widget_5.setObjectName("widget_5")
self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.widget_5)
self.verticalLayout_3.setContentsMargins(0, 0, 0, 0)
self.verticalLayout_3.setObjectName("verticalLayout_3")
self.tabWidget = QtWidgets.QTabWidget(self.widget_5)
self.tabWidget.setObjectName("tabWidget")
self.tab1 = QtWidgets.QWidget()
self.tab1.setFocusPolicy(QtCore.Qt.TabFocus)
self.tab1.setObjectName("tab1")
self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.tab1)
self.verticalLayout_2.setObjectName("verticalLayout_2")
self.textEditReceive = QtWidgets.QPlainTextEdit(self.tab1)
self.textEditReceive.setSizeIncrement(QtCore.QSize(0, 0))
self.textEditReceive.setObjectName("textEditReceive")
self.verticalLayout_2.addWidget(self.textEditReceive)
self.tabWidget.addTab(self.tab1, "")
self.tab2 = QtWidgets.QWidget()
self.tab2.setEnabled(True)
self.tab2.setFocusPolicy(QtCore.Qt.NoFocus)
self.tab2.setObjectName("tab2")
self.verticalLayout_4 = QtWidgets.QVBoxLayout(self.tab2)
self.verticalLayout_4.setObjectName("verticalLayout_4")
self.tableWidget = QtWidgets.QTableWidget(self.tab2)
self.tableWidget.setGridStyle(QtCore.Qt.SolidLine)
self.tableWidget.setRowCount(10)
self.tableWidget.setColumnCount(6)
self.tableWidget.setObjectName("tableWidget")
item = QtWidgets.QTableWidgetItem()
item.setBackground(QtGui.QColor(172, 172, 172))
self.tableWidget.setHorizontalHeaderItem(0, item)
item = QtWidgets.QTableWidgetItem()
item.setBackground(QtGui.QColor(172, 172, 172))
self.tableWidget.setHorizontalHeaderItem(1, item)
item = QtWidgets.QTableWidgetItem()
item.setBackground(QtGui.QColor(172, 172, 172))
self.tableWidget.setHorizontalHeaderItem(2, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(3, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(4, item)
item = QtWidgets.QTableWidgetItem()
item.setBackground(QtGui.QColor(172, 172, 172))
self.tableWidget.setHorizontalHeaderItem(5, item)
self.tableWidget.horizontalHeader().setCascadingSectionResizes(False)
self.tableWidget.horizontalHeader().setDefaultSectionSize(50)
self.tableWidget.horizontalHeader().setMinimumSectionSize(20)
self.tableWidget.horizontalHeader().setSortIndicatorShown(True)
self.tableWidget.horizontalHeader().setStretchLastSection(True)
self.tableWidget.verticalHeader().setVisible(False)
self.tableWidget.verticalHeader().setCascadingSectionResizes(False)
self.tableWidget.verticalHeader().setDefaultSectionSize(25)
self.verticalLayout_4.addWidget(self.tableWidget)
self.tabWidget.addTab(self.tab2, "")
self.verticalLayout_3.addWidget(self.tabWidget)
self.groupBox_7 = QtWidgets.QGroupBox(self.widget_5)
self.groupBox_7.setObjectName("groupBox_7")
self.horizontalLayout_3 = QtWidgets.QHBoxLayout(self.groupBox_7)
self.horizontalLayout_3.setObjectName("horizontalLayout_3")
self.comboBox_channel = QtWidgets.QComboBox(self.groupBox_7)
self.comboBox_channel.setEditable(True)
self.comboBox_channel.setObjectName("comboBox_channel")
self.comboBox_channel.addItem("")
self.horizontalLayout_3.addWidget(self.comboBox_channel)
self.pushButtonClearChannel = QtWidgets.QPushButton(self.groupBox_7)
self.pushButtonClearChannel.setObjectName("pushButtonClearChannel")
self.horizontalLayout_3.addWidget(self.pushButtonClearChannel)
self.horizontalLayout_3.setStretch(0, 8)
self.horizontalLayout_3.setStretch(1, 1)
self.verticalLayout_3.addWidget(self.groupBox_7)
self.groupBox_5 = QtWidgets.QGroupBox(self.widget_5)
self.groupBox_5.setObjectName("groupBox_5")
self.gridLayout = QtWidgets.QGridLayout(self.groupBox_5)
self.gridLayout.setObjectName("gridLayout")
self.textEditSend = QtWidgets.QTextEdit(self.groupBox_5)
self.textEditSend.setObjectName("textEditSend")
self.gridLayout.addWidget(self.textEditSend, 0, 0, 3, 1)
self.pushButton_expend = QtWidgets.QPushButton(self.groupBox_5)
self.pushButton_expend.setObjectName("pushButton_expend")
self.gridLayout.addWidget(self.pushButton_expend, 0, 1, 1, 1)
self.pushButtonClearReceive = QtWidgets.QPushButton(self.groupBox_5)
self.pushButtonClearReceive.setObjectName("pushButtonClearReceive")
self.gridLayout.addWidget(self.pushButtonClearReceive, 1, 1, 1, 1)
self.pushButtonClearSend = QtWidgets.QPushButton(self.groupBox_5)
self.pushButtonClearSend.setObjectName("pushButtonClearSend")
self.gridLayout.addWidget(self.pushButtonClearSend, 2, 1, 2, 1)
self.widget_2 = QtWidgets.QWidget(self.groupBox_5)
self.widget_2.setObjectName("widget_2")
self.horizontalLayout_5 = QtWidgets.QHBoxLayout(self.widget_2)
self.horizontalLayout_5.setObjectName("horizontalLayout_5")
self.checkBoxSendAll = QtWidgets.QCheckBox(self.widget_2)
self.checkBoxSendAll.setObjectName("checkBoxSendAll")
self.horizontalLayout_5.addWidget(self.checkBoxSendAll)
self.checkBoxAddCRC = QtWidgets.QCheckBox(self.widget_2)
self.checkBoxAddCRC.setObjectName("checkBoxAddCRC")
self.horizontalLayout_5.addWidget(self.checkBoxAddCRC)
self.gridLayout.addWidget(self.widget_2, 3, 0, 2, 1)
self.pushButtonSend = QtWidgets.QPushButton(self.groupBox_5)
font = QtGui.QFont()
font.setFamily("3ds")
font.setPointSize(12)
self.pushButtonSend.setFont(font)
self.pushButtonSend.setAutoFillBackground(False)
self.pushButtonSend.setStyleSheet("background-color: rgb(0, 255, 0);")
self.pushButtonSend.setCheckable(False)
self.pushButtonSend.setFlat(False)
self.pushButtonSend.setObjectName("pushButtonSend")
self.gridLayout.addWidget(self.pushButtonSend, 4, 1, 1, 1)
self.verticalLayout_3.addWidget(self.groupBox_5)
self.verticalLayout_3.setStretch(0, 7)
self.verticalLayout_3.setStretch(1, 1)
self.verticalLayout_3.setStretch(2, 2)
self.widget_6 = QtWidgets.QWidget(self.splitter)
self.widget_6.setEnabled(True)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.widget_6.sizePolicy().hasHeightForWidth())
self.widget_6.setSizePolicy(sizePolicy)
self.widget_6.setMinimumSize(QtCore.QSize(280, 0))
self.widget_6.setObjectName("widget_6")
self.horizontalLayout_16 = QtWidgets.QHBoxLayout(self.widget_6)
self.horizontalLayout_16.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout_16.setSpacing(0)
self.horizontalLayout_16.setObjectName("horizontalLayout_16")
self.scrollArea = QtWidgets.QScrollArea(self.widget_6)
self.scrollArea.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)
self.scrollArea.setWidgetResizable(False)
self.scrollArea.setObjectName("scrollArea")
self.scrollAreaWidgetContents = QtWidgets.QWidget()
self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 241, 3000))
self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents")
self.widget_8 = QtWidgets.QWidget(self.scrollAreaWidgetContents)
self.widget_8.setGeometry(QtCore.QRect(12, 2, 221, 34))
self.widget_8.setObjectName("widget_8")
self.horizontalLayout_17 = QtWidgets.QHBoxLayout(self.widget_8)
self.horizontalLayout_17.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout_17.setObjectName("horizontalLayout_17")
self.label_8 = QtWidgets.QLabel(self.widget_8)
self.label_8.setObjectName("label_8")
self.horizontalLayout_17.addWidget(self.label_8)
self.checkBox_return = QtWidgets.QCheckBox(self.widget_8)
self.checkBox_return.setChecked(True)
self.checkBox_return.setObjectName("checkBox_return")
self.horizontalLayout_17.addWidget(self.checkBox_return)
self.widget_9 = QtWidgets.QWidget(self.scrollAreaWidgetContents)
self.widget_9.setGeometry(QtCore.QRect(10, 40, 231, 3000))
self.widget_9.setObjectName("widget_9")
self.layoutWidget2 = QtWidgets.QWidget(self.widget_9)
self.layoutWidget2.setGeometry(QtCore.QRect(12, 12, 218, 2941))
self.layoutWidget2.setObjectName("layoutWidget2")
self.verticalLayout_8 = QtWidgets.QVBoxLayout(self.layoutWidget2)
self.verticalLayout_8.setSizeConstraint(QtWidgets.QLayout.SetMaximumSize)
self.verticalLayout_8.setContentsMargins(0, 0, 0, 0)
self.verticalLayout_8.setObjectName("verticalLayout_8")
self.scrollArea.setWidget(self.scrollAreaWidgetContents)
self.horizontalLayout_16.addWidget(self.scrollArea)
self.horizontalLayout_14.addWidget(self.splitter)
self.horizontalLayout_2.addWidget(self.widget_7)
self.retranslateUi(UartAssistant)
self.comboBox_localAddr.setCurrentIndex(0)
self.tabWidget.setCurrentIndex(0)
QtCore.QMetaObject.connectSlotsByName(UartAssistant)
def retranslateUi(self, UartAssistant):
_translate = QtCore.QCoreApplication.translate
UartAssistant.setWindowTitle(_translate("UartAssistant", "串口助手py版"))
self.groupBox.setTitle(_translate("UartAssistant", "网络设置"))
self.label.setText(_translate("UartAssistant", "协议类型"))
self.comboBox_protocol.setItemText(0, _translate("UartAssistant", "UDP"))
self.label_2.setText(_translate("UartAssistant", "本地主机地址"))
self.comboBox_localAddr.setCurrentText(_translate("UartAssistant", "127.0.0.1"))
self.comboBox_localAddr.setItemText(0, _translate("UartAssistant", "127.0.0.1"))
self.comboBox_localAddr.setItemText(1, _translate("UartAssistant", "0.0.0.0"))
self.label_3.setText(_translate("UartAssistant", "本地主机端口"))
self.lineEdit_port.setText(_translate("UartAssistant", "9000"))
self.pushButton_openNet.setText(_translate("UartAssistant", "打开网络"))
self.pushButton_closeNet.setText(_translate("UartAssistant", "关闭网络"))
self.groupBox_2.setTitle(_translate("UartAssistant", "收发设置"))
self.checkBoxHexSend.setText(_translate("UartAssistant", "HEX发送"))
self.checkBoxHexReceive.setText(_translate("UartAssistant", "HEX接收"))
self.checkBoxAddDate.setText(_translate("UartAssistant", "收/发时间"))
self.checkBoxCRLF.setText(_translate("UartAssistant", "收发换行"))
self.pushButtonLogSave.setText(_translate("UartAssistant", "保存日志"))
self.pushButtonLogLoad.setText(_translate("UartAssistant", "加载日志"))
self.checkBoxAutoSaveLog.setText(_translate("UartAssistant", "自动保存日志"))
self.checkBoxSendSever.setText(_translate("UartAssistant", "启动服务"))
self.groupBox_3.setTitle(_translate("UartAssistant", "定时发送"))
self.checkBoxReapitSend.setText(_translate("UartAssistant", "定时发送"))
self.label_7.setText(_translate("UartAssistant", "ms/次"))
self.lineEditTime.setText(_translate("UartAssistant", "1000"))
self.label_9.setText(_translate("UartAssistant", "Rx"))
self.label_10.setText(_translate("UartAssistant", "Powerd by Byan"))
self.label_SendNum.setText(_translate("UartAssistant", "Tx"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab1), _translate("UartAssistant", "数据"))
item = self.tableWidget.horizontalHeaderItem(0)
item.setText(_translate("UartAssistant", "select"))
item = self.tableWidget.horizontalHeaderItem(1)
item.setText(_translate("UartAssistant", "start"))
item = self.tableWidget.horizontalHeaderItem(2)
item.setText(_translate("UartAssistant", "num"))
item = self.tableWidget.horizontalHeaderItem(3)
item.setText(_translate("UartAssistant", "scale"))
item = self.tableWidget.horizontalHeaderItem(4)
item.setText(_translate("UartAssistant", "hex"))
item = self.tableWidget.horizontalHeaderItem(5)
item.setText(_translate("UartAssistant", "value"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab2), _translate("UartAssistant", "解析"))
self.groupBox_7.setTitle(_translate("UartAssistant", "选择通道"))
self.comboBox_channel.setItemText(0, _translate("UartAssistant", "ALL"))
self.pushButtonClearChannel.setText(_translate("UartAssistant", "清空"))
self.groupBox_5.setTitle(_translate("UartAssistant", "数据发送区"))
self.pushButton_expend.setText(_translate("UartAssistant", "快捷指令"))
self.pushButtonClearReceive.setText(_translate("UartAssistant", "清除接收"))
self.pushButtonClearSend.setText(_translate("UartAssistant", "清除发送"))
self.checkBoxSendAll.setText(_translate("UartAssistant", "发送全部通道"))
self.checkBoxAddCRC.setText(_translate("UartAssistant", "附加校验"))
self.pushButtonSend.setText(_translate("UartAssistant", "发送"))
self.label_8.setText(_translate("UartAssistant", "快捷指令"))
self.checkBox_return.setText(_translate("UartAssistant", "添加\"\\r\\n\""))

View File

@ -0,0 +1,853 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>UartAssistant</class>
<widget class="QWidget" name="UartAssistant">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>956</width>
<height>650</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>2</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="acceptDrops">
<bool>true</bool>
</property>
<property name="windowTitle">
<string>串口助手py版</string>
</property>
<property name="windowIcon">
<iconset>
<normaloff>favicon.ico</normaloff>favicon.ico</iconset>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QWidget" name="widget_7" native="true">
<layout class="QHBoxLayout" name="horizontalLayout_14" stretch="0">
<item>
<widget class="QSplitter" name="splitter">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="handleWidth">
<number>5</number>
</property>
<widget class="QWidget" name="widget_4" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>230</width>
<height>0</height>
</size>
</property>
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QWidget" name="widget" native="true">
<layout class="QVBoxLayout" name="verticalLayout_5" stretch="8,6,2,0,2">
<item>
<widget class="QGroupBox" name="groupBox">
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="baseSize">
<size>
<width>271</width>
<height>291</height>
</size>
</property>
<property name="title">
<string>网络设置</string>
</property>
<widget class="QWidget" name="layoutWidget">
<property name="geometry">
<rect>
<x>10</x>
<y>20</y>
<width>201</width>
<height>201</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>协议类型</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="comboBox_protocol">
<item>
<property name="text">
<string>UDP</string>
</property>
</item>
</widget>
</item>
<item>
<widget class="QLabel" name="label_2">
<property name="text">
<string>本地主机地址</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="comboBox_localAddr">
<property name="toolTipDuration">
<number>0</number>
</property>
<property name="editable">
<bool>true</bool>
</property>
<property name="currentText">
<string>127.0.0.1</string>
</property>
<property name="currentIndex">
<number>0</number>
</property>
<item>
<property name="text">
<string>127.0.0.1</string>
</property>
</item>
<item>
<property name="text">
<string>0.0.0.0</string>
</property>
</item>
</widget>
</item>
<item>
<widget class="QLabel" name="label_3">
<property name="text">
<string>本地主机端口</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_port">
<property name="text">
<string>9000</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pushButton_openNet">
<property name="styleSheet">
<string notr="true">background-color: rgb(0, 255, 0);</string>
</property>
<property name="text">
<string>打开网络</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pushButton_closeNet">
<property name="text">
<string>关闭网络</string>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_2">
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="baseSize">
<size>
<width>271</width>
<height>165</height>
</size>
</property>
<property name="title">
<string>收发设置</string>
</property>
<widget class="QWidget" name="layoutWidget_5">
<property name="geometry">
<rect>
<x>10</x>
<y>20</y>
<width>197</width>
<height>79</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_6">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_10">
<item>
<widget class="QCheckBox" name="checkBoxHexSend">
<property name="text">
<string>HEX发送</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="checkBoxHexReceive">
<property name="text">
<string>HEX接收</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_12">
<item>
<widget class="QCheckBox" name="checkBoxAddDate">
<property name="text">
<string>收/发时间</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="checkBoxCRLF">
<property name="text">
<string>收发换行</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<widget class="QWidget" name="layoutWidget_6">
<property name="geometry">
<rect>
<x>10</x>
<y>130</y>
<width>195</width>
<height>30</height>
</rect>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_13">
<item>
<widget class="QPushButton" name="pushButtonLogSave">
<property name="text">
<string>保存日志</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pushButtonLogLoad">
<property name="text">
<string>加载日志</string>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="layoutWidget">
<property name="geometry">
<rect>
<x>12</x>
<y>100</y>
<width>191</width>
<height>31</height>
</rect>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QCheckBox" name="checkBoxAutoSaveLog">
<property name="text">
<string>自动保存日志</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="checkBoxSendSever">
<property name="text">
<string>启动服务</string>
</property>
<property name="checked">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_3">
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="baseSize">
<size>
<width>271</width>
<height>80</height>
</size>
</property>
<property name="title">
<string>定时发送</string>
</property>
<widget class="QCheckBox" name="checkBoxReapitSend">
<property name="geometry">
<rect>
<x>10</x>
<y>30</y>
<width>91</width>
<height>19</height>
</rect>
</property>
<property name="text">
<string>定时发送</string>
</property>
</widget>
<widget class="QLabel" name="label_7">
<property name="geometry">
<rect>
<x>170</x>
<y>30</y>
<width>51</width>
<height>16</height>
</rect>
</property>
<property name="text">
<string>ms/次</string>
</property>
</widget>
<widget class="QLineEdit" name="lineEditTime">
<property name="geometry">
<rect>
<x>110</x>
<y>30</y>
<width>51</width>
<height>21</height>
</rect>
</property>
<property name="text">
<string>1000</string>
</property>
</widget>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QGroupBox" name="groupBox_6">
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="baseSize">
<size>
<width>281</width>
<height>80</height>
</size>
</property>
<property name="title">
<string/>
</property>
<widget class="QLabel" name="label_9">
<property name="geometry">
<rect>
<x>120</x>
<y>20</y>
<width>72</width>
<height>15</height>
</rect>
</property>
<property name="text">
<string>Rx</string>
</property>
</widget>
<widget class="QLineEdit" name="lineEditSendNum">
<property name="geometry">
<rect>
<x>40</x>
<y>20</y>
<width>61</width>
<height>21</height>
</rect>
</property>
</widget>
<widget class="QLineEdit" name="lineEditReceiveNum">
<property name="geometry">
<rect>
<x>140</x>
<y>20</y>
<width>61</width>
<height>21</height>
</rect>
</property>
</widget>
<widget class="QLabel" name="label_10">
<property name="geometry">
<rect>
<x>20</x>
<y>40</y>
<width>131</width>
<height>16</height>
</rect>
</property>
<property name="text">
<string>Powerd by Byan</string>
</property>
</widget>
<widget class="QLabel" name="label_SendNum">
<property name="geometry">
<rect>
<x>20</x>
<y>20</y>
<width>72</width>
<height>15</height>
</rect>
</property>
<property name="text">
<string>Tx</string>
</property>
</widget>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="widget_5" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>1</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>400</width>
<height>0</height>
</size>
</property>
<layout class="QVBoxLayout" name="verticalLayout_3" stretch="7,1,2">
<item>
<widget class="QTabWidget" name="tabWidget">
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="tab1">
<property name="focusPolicy">
<enum>Qt::TabFocus</enum>
</property>
<attribute name="title">
<string>数据</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QPlainTextEdit" name="textEditReceive">
<property name="sizeIncrement">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="tab2">
<property name="enabled">
<bool>true</bool>
</property>
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<attribute name="title">
<string>解析</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_4">
<item>
<widget class="QTableWidget" name="tableWidget">
<property name="gridStyle">
<enum>Qt::SolidLine</enum>
</property>
<property name="rowCount">
<number>10</number>
</property>
<property name="columnCount">
<number>6</number>
</property>
<attribute name="horizontalHeaderCascadingSectionResizes">
<bool>false</bool>
</attribute>
<attribute name="horizontalHeaderMinimumSectionSize">
<number>20</number>
</attribute>
<attribute name="horizontalHeaderDefaultSectionSize">
<number>50</number>
</attribute>
<attribute name="horizontalHeaderShowSortIndicator" stdset="0">
<bool>true</bool>
</attribute>
<attribute name="horizontalHeaderStretchLastSection">
<bool>true</bool>
</attribute>
<attribute name="verticalHeaderVisible">
<bool>false</bool>
</attribute>
<attribute name="verticalHeaderCascadingSectionResizes">
<bool>false</bool>
</attribute>
<attribute name="verticalHeaderDefaultSectionSize">
<number>25</number>
</attribute>
<row/>
<row/>
<row/>
<row/>
<row/>
<row/>
<row/>
<row/>
<row/>
<row/>
<column>
<property name="text">
<string>select</string>
</property>
<property name="background">
<color>
<red>172</red>
<green>172</green>
<blue>172</blue>
</color>
</property>
</column>
<column>
<property name="text">
<string>start</string>
</property>
<property name="background">
<color>
<red>172</red>
<green>172</green>
<blue>172</blue>
</color>
</property>
</column>
<column>
<property name="text">
<string>num</string>
</property>
<property name="background">
<color>
<red>172</red>
<green>172</green>
<blue>172</blue>
</color>
</property>
</column>
<column>
<property name="text">
<string>scale</string>
</property>
</column>
<column>
<property name="text">
<string>hex</string>
</property>
</column>
<column>
<property name="text">
<string>value</string>
</property>
<property name="background">
<color>
<red>172</red>
<green>172</green>
<blue>172</blue>
</color>
</property>
</column>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_7">
<property name="title">
<string>选择通道</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_3" stretch="8,1">
<item>
<widget class="QComboBox" name="comboBox_channel">
<property name="editable">
<bool>true</bool>
</property>
<item>
<property name="text">
<string>ALL</string>
</property>
</item>
</widget>
</item>
<item>
<widget class="QPushButton" name="pushButtonClearChannel">
<property name="text">
<string>清空</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_5">
<property name="title">
<string>数据发送区</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0" rowspan="3">
<widget class="QTextEdit" name="textEditSend"/>
</item>
<item row="0" column="1">
<widget class="QPushButton" name="pushButton_expend">
<property name="text">
<string>快捷指令</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QPushButton" name="pushButtonClearReceive">
<property name="text">
<string>清除接收</string>
</property>
</widget>
</item>
<item row="2" column="1" rowspan="2">
<widget class="QPushButton" name="pushButtonClearSend">
<property name="text">
<string>清除发送</string>
</property>
</widget>
</item>
<item row="3" column="0" rowspan="2">
<widget class="QWidget" name="widget_2" native="true">
<layout class="QHBoxLayout" name="horizontalLayout_5">
<item>
<widget class="QCheckBox" name="checkBoxSendAll">
<property name="text">
<string>发送全部通道</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="checkBoxAddCRC">
<property name="text">
<string>附加校验</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="4" column="1">
<widget class="QPushButton" name="pushButtonSend">
<property name="font">
<font>
<family>3ds</family>
<pointsize>12</pointsize>
</font>
</property>
<property name="autoFillBackground">
<bool>false</bool>
</property>
<property name="styleSheet">
<string notr="true">background-color: rgb(0, 255, 0);</string>
</property>
<property name="text">
<string>发送</string>
</property>
<property name="checkable">
<bool>false</bool>
</property>
<property name="flat">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="widget_6" native="true">
<property name="enabled">
<bool>true</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>280</width>
<height>0</height>
</size>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_16" stretch="0">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QScrollArea" name="scrollArea">
<property name="verticalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOn</enum>
</property>
<property name="widgetResizable">
<bool>false</bool>
</property>
<widget class="QWidget" name="scrollAreaWidgetContents">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>241</width>
<height>3000</height>
</rect>
</property>
<widget class="QWidget" name="widget_8" native="true">
<property name="geometry">
<rect>
<x>12</x>
<y>2</y>
<width>221</width>
<height>34</height>
</rect>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_17">
<item>
<widget class="QLabel" name="label_8">
<property name="text">
<string>快捷指令</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="checkBox_return">
<property name="text">
<string>添加&quot;\r\n&quot;</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="widget_9" native="true">
<property name="geometry">
<rect>
<x>10</x>
<y>40</y>
<width>231</width>
<height>3000</height>
</rect>
</property>
<widget class="QWidget" name="layoutWidget">
<property name="geometry">
<rect>
<x>12</x>
<y>12</y>
<width>218</width>
<height>2941</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_8">
<property name="sizeConstraint">
<enum>QLayout::SetMaximumSize</enum>
</property>
</layout>
</widget>
</widget>
</widget>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -0,0 +1,670 @@
# -*- coding: utf-8 -*-
"""
Created on Mon May 27 14:31:38 2024
@author: WANGXIBAO
"""
import sys
import serial,re
import serial.tools.list_ports
import time,datetime
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QMessageBox ,QFileDialog,QInputDialog
from PyQt5.QtCore import QTimer
from PyUartUi import Ui_UartAssistant
from PyQt5.QtGui import QIcon
class PyQt5Serial(QtWidgets.QWidget,Ui_UartAssistant):
# %%初始化程序
def __init__(self):
super(PyQt5Serial, self).__init__()
self.setupUi(self)
self.init()
self.ser = serial.Serial() #创建一个空对象
self.port_check()
# 设置Logo和标题
self.setWindowIcon(QIcon('./favicon.ico'))
self.setWindowTitle("调试助手")
# 设置禁止拉伸窗口大小
#self.setFixedSize(self.width(), self.height())
# 发送数据和接收数据数目置零
self.data_num_sended = 0
self.lineEditSendNum.setText(str(self.data_num_sended))
self.data_num_received = 0
self.lineEditReceiveNum.setText(str(self.data_num_received))
# 串口关闭按钮使能关闭
self.pushButtonCloseSerial.setEnabled(False)
# 发送框、文本框清除
self.textEditReceive.setText("")
self.textEditSend.setText("")
# %%第二个TAB 初始化画图页面表格
# 加载Qchart波形界面
#加载快捷指令
self.widget_6.hide()
#加载快捷指令的按键值
# 用于暂存接收的串口数据
self.buffer = b''
# 用于暂存解码数据
self.lineUtf8 = ""
# 用于标志是否开始存CSV
self.CsvFlag = 0
# =============================================================================
# def wheelEvent(self, event):
# if self.plot_view.underMouse:
# # 鼠标滚轮:缩放Qchart波形
# if event.angleDelta().y() >= 0:
# # 鼠标滚轮向上
# if event.x() < (
# self.plot_view.width() + self.plot_view.x()) and event.x() > self.plot_view.x():
# if event.y() < (
# self.plot_view.height() + self.plot_view.y()) and event.y() > self.plot_view.y():
# self.plot_qchart.zoomIn()
# else:
# # 鼠标滚轮向下
# if event.x() < (
# self.plot_view.width() + self.plot_view.x()) and event.x() > self.plot_view.x():
# if event.y() < (
# self.plot_view.height() + self.plot_view.y()) and event.y() > self.plot_view.y():
# self.plot_qchart.zoomOut()
# =============================================================================
#%% 重写关闭按钮
def closeEvent(self, event):
self.update_data_thread.stop()
# 可选:加入超时判断,防止线程未能正常退出导致程序无法关闭
if not self.update_data_thread.wait(1000): # 等待5秒
print("线程未在指定时间内退出,可能需要进一步处理")
# 如果串口已经打开,则关闭串口
if self.ser.is_open:
self.port_close()
#关闭界面前保存快捷区域的命令和名称
for i in range(20): # 假设有20个按钮
button_name = f'Button{i:02}' # 格式化按钮名称,确保两位数
set_text = getattr(self, f'lineEditQuick_{i+1}').text()+ "|" + getattr(self, f'pushButtonQuick_{i+1}').text()
self.get_data_tf.SetCfgIniData(button_name, set_text)
# 调用父类的关闭事件处理函数
super().closeEvent(event)
# %%建立控件信号与槽关系
def init(self):
# 串口检测按钮
self.pushButtonTestSerial.clicked.connect(self.port_check)
# 串口打开按钮
self.pushButtonOpenSerial.clicked.connect(self.port_open)
# 串口关闭按钮
self.pushButtonCloseSerial.clicked.connect(self.port_close)
# 定时发送数据
self.timer_send = QTimer()
self.timer_send.timeout.connect(self.data_send)
self.checkBoxReapitSend.stateChanged.connect(self.data_send_timer)
# 发送数据按钮
self.pushButtonSend.clicked.connect(lambda:self.data_send(text_quick= None))
# 保存日志
self.pushButtonLogSave.clicked.connect(self.savefiles)
# 加载日志
self.pushButtonLogLoad.clicked.connect(self.openfiles)
# 跳转链接
#self.commandLinkButton1.clicked.connect(self.link)
# 清除发送按钮
self.pushButtonClearSend.clicked.connect(self.send_data_clear)
# 清除接收按钮
self.pushButtonClearReceive.clicked.connect(self.receive_data_clear)
# 快捷指令扩展区域
self.pushButton_expend.clicked.connect(self.adjust_sidebar)
# 创建一个通用的槽函数来处理所有按钮
# 例如使用lambda表达式传递额外的参数
for i in range(1, 21): # 假设有20个按钮
# getattr(self, f'pushButtonQuick_{i}').clicked.connect(
# lambda checked, line_edit=f'lineEditQuick_{i}': self.onPushButtonQuickClicked(line_edit)
# )
# 连接左键点击事件
button = getattr(self, f'pushButtonQuick_{i}')
line_edit = f'lineEditQuick_{i}'
button.clicked.connect(lambda checked, line_edit=line_edit: self.onPushButtonQuickClicked(line_edit))
# 连接右键点击事件
# button_id = f'pushButtonQuick_{i}'
# button.setContextMenuPolicy(Qt.CustomContextMenu)
# button.customContextMenuRequested.connect(lambda position, button_id=button_id: self.onButtonRightClicked(button_id))
# %% 串口检测
def port_check(self):
# 检测所有存在的串口,将信息存储在字典中
self.Com_Dict = {}
port_list = list(serial.tools.list_ports.comports())
self.comboBoxSerial.clear()
for port in port_list:
self.Com_Dict["%s" % port[0]] = "%s" % port[1]
self.comboBoxSerial.addItem(port[0])
# 无串口判断
if len(self.Com_Dict) == 0:
self.comboBoxSerial.addItem("无串口")
# %%打开串口
def port_open(self):
self.ser.port = self.comboBoxSerial.currentText() # 串口号
self.ser.baudrate = int(self.comboBoxBaudrate.currentText()) # 波特率
self.ser.timeout = 0.01
flag_data = int(self.comboBoxDataBits.currentText()) # 数据位
if flag_data == 5:
self.ser.bytesize = serial.FIVEBITS
elif flag_data == 6:
self.ser.bytesize = serial.SIXBITS
elif flag_data == 7:
self.ser.bytesize = serial.SEVENBITS
else:
self.ser.bytesize = serial.EIGHTBITS
flag_data = self.comboBoxCheckBit.currentText() # 校验位
if flag_data == "None":
self.ser.parity = serial.PARITY_NONE
elif flag_data == "Odd":
self.ser.parity = serial.PARITY_ODD
else:
self.ser.parity = serial.PARITY_EVEN
flag_data = int(self.comboBoxStopBit.currentText()) # 停止位
if flag_data == 1:
self.ser.stopbits = serial.STOPBITS_ONE
else:
self.ser.stopbits = serial.STOPBITS_TWO
flag_data = self.comboBoxFlow.currentText() # 流控
if flag_data == "No Ctrl Flow":
self.ser.xonxoff = False #软件流控
self.ser.dsrdtr = False #硬件流控 DTR
self.ser.rtscts = False #硬件流控 RTS
elif flag_data == "SW Ctrl Flow":
self.ser.xonxoff = True #软件流控
else:
if self.checkBoxDTR.isChecked():
self.ser.dsrdtr = True #硬件流控 DTR
if self.checkBoxRTS.isChecked():
self.ser.rtscts = True #硬件流控 RTS
try:
time.sleep(0.1)
if self.ser.is_open:
self.ser.close()
self.ser.open()
except:
QMessageBox.critical(self, "串口异常", "此串口不能被打开!")
return None
# 串口打开后,切换开关串口按钮使能状态,防止失误操作
if self.ser.isOpen():
self.pushButtonOpenSerial.setEnabled(False)
self.pushButtonCloseSerial.setEnabled(True)
self.comboBoxBaudrate.setEnabled(False)
self.comboBoxSerial.setEnabled(False)
self.pushButton_expend.setEnabled(True)
#self.formGroupBox1.setTitle("串口状态(开启)")
#日志保存
# 格式化日期时间字符串,用于文件名
# 例如2024-05-28_12-34-56.txt
self.file = self.ser.port+"-"+time.strftime("%Y%m%d%H%M%S", time.localtime())
self.filename = self.file + ".txt"
# 定时器接收数据
self.timer = QTimer()
self.timer.timeout.connect(self.data_receive)
# 打开串口接收定时器周期为1ms
self.timer.start(20)
# %%接收数据
def data_receive(self):
try:
num = self.ser.inWaiting()
if num>0 :
#print("接收数据",datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f"))
try:
data = self.ser.read(num)
except:
QMessageBox.critical(self, '串口异常')
self.buffer+=data
#print("接收完成",datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f"))
if self.checkBoxAddDate.isChecked():
nowTime = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")
nowTime = nowTime[:-3]
self.textEditReceive.insertPlainText(nowTime + " ")
# HEX显示数据
if self.checkBoxHexReceive.checkState():
out_s = ''
for i in range(0, len(data)):
out_s = out_s + '{:02X}'.format(data[i]) + ' '
self.textEditReceive.insertPlainText(out_s)
# ASCII显示数据
else:
#print("解码前",datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f"))
self.textEditReceive.insertPlainText(data.decode('utf-8',errors='replace'))
#print("解码数据",datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f"))
# 接收换行
if self.checkBoxCRLF.isChecked():
self.textEditReceive.insertPlainText('\r\n')
# 获取到text光标
textCursor = self.textEditReceive.textCursor()
# 滚动到底部
textCursor.movePosition(textCursor.End)
# 设置光标到text中去
self.textEditReceive.setTextCursor(textCursor)
# 统计接收字符的数量
self.data_num_received += num
self.lineEditReceiveNum.setText(str(self.data_num_received))
# 自动保存日志
if self.checkBoxAutoSaveLog.isChecked():
self.AutoSaveLog()
except:
# QMessageBox.critical(self, '串口异常', '串口接收数据异常,请重新连接设备!')
# 获取到text光标
textCursor = self.textEditReceive.textCursor()
# 滚动到底部
textCursor.movePosition(textCursor.End)
# 设置光标到text中去
self.textEditReceive.setTextCursor(textCursor)
self.textEditReceive.insertPlainText("串口断开,重连中...\r\n")
self.ser.close()
try:
print("重连中...")
time.sleep(1)
if not self.ser.is_open:
self.ser.open()
print("重连成功")
else:
print("串口已连接,无需重连")
except Exception as e:
print(f"重连失败{e}")
# %%定时发送数据
def data_send_timer(self):
try:
if 1<= int(self.lineEditTime.text()) <= 30000: # 定时时间1ms~30s内
if self.checkBoxReapitSend.isChecked():
self.timer_send.start(int(self.lineEditTime.text()))
self.lineEditTime.setEnabled(False)
else:
self.timer_send.stop()
self.lineEditTime.setEnabled(True)
else:
QMessageBox.critical(self, '定时发送数据异常', '定时发送数据周期仅可设置在30秒内')
except:
QMessageBox.critical(self, '定时发送数据异常', '请设置正确的数值类型!')
# %%发送数据
def data_send(self,text_quick = None):
if self.ser.isOpen():
if text_quick== None:
input_s = self.textEditSend.toPlainText()
else:
input_s = text_quick
# 判断是否为非空字符串
if input_s != "":
# 时间显示
if self.checkBoxAddDate.isChecked():
self.textEditReceive.insertPlainText((time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) + " ")
# HEX发送
if self.checkBoxHexSend.isChecked():
input_s = input_s.strip()
send_list = []
while input_s != '':
try:
num = int(input_s[0:2], 16)
except ValueError:
QMessageBox.critical(self, '串口异常', '请输入规范十六进制数据,以空格分开!')
return None
input_s = input_s[2:].strip()
send_list.append(num)
input_s = bytes(send_list)
# ASCII发送
else:
input_s = (input_s).encode('utf-8')
input_s = re.sub(b'(?<!\r)\n', b'\r\n', input_s)
# HEX接收显示
if self.checkBoxHexReceive.isChecked():
out_s = ''
for i in range(0, len(input_s)):
out_s = out_s + '{:02X}'.format(input_s[i]) + ' '
self.textEditReceive.insertPlainText(out_s)
# ASCII接收显示
else:
self.textEditReceive.insertPlainText(input_s.decode('utf-8'))
# 接收换行
if self.checkBoxCRLF.isChecked():
self.textEditReceive.insertPlainText('\r\n')
# 获取到Text光标
textCursor = self.textEditReceive.textCursor()
# 滚动到底部
textCursor.movePosition(textCursor.End)
# 设置光标到Text中去
self.textEditReceive.setTextCursor(textCursor)
# 统计发送字符数量
num = self.ser.write(input_s)
self.data_num_sended += num
self.lineEditSendNum.setText(str(self.data_num_sended))
else:
pass
# %%保存日志
def savefiles(self):
dlg = QFileDialog()
filenames = dlg.getSaveFileName(None, "保存日志文件", None, "Txt files(*.txt)")
try:
with open(file = filenames[0], mode='w', encoding='utf-8') as file:
file.write(self.textEditReceive.toPlainText())
except:
QMessageBox.critical(self, '日志异常', '保存日志文件失败!')
#%% 加载日志
def openfiles(self):
dlg = QFileDialog()
filenames = dlg.getOpenFileName(None, "加载日志文件", None, "Txt files(*.txt)")
try:
with open(file = filenames[0], mode='r', encoding='utf-8') as file:
self.textEditSend.setPlainText(file.read())
except:
QMessageBox.critical(self, '日志异常', '加载日志文件失败!')
# %%打开博客链接和公众号二维码
#webbrowser.open('https://blog.csdn.net/m0_38106923')
# %%清除发送数据显示
# 自动保存日志 log he csv
def AutoSaveLog(self):
try:
lines = self.buffer.split(b'\n') # 或者使用 b'\r\n' 根据你的需要
# 最后一个元素可能不包含完整的行,所以将其保留作为新的缓存
self.buffer = lines.pop()
# 处理每一行数据
for line in lines:
# 注意:每行数据可能不包含结尾的换行符,所以在处理前检查一下
if line.endswith(b'\r'):
line = line[:-1] # 移除回车
# 写入当前日期的文件,打开文件,如果文件不存在则创建,如果存在则追加内容
with open(self.filename, 'a', encoding='utf-8',newline='') as file:
#print (data.decode('utf-8'))
self.lineUtf8 = line.decode('utf-8')
saveData = (time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) + " " + self.lineUtf8 + "\r\n"
#print("saveData:",saveData)
file.write(saveData) # 写入内容
#判断选择的何种格式数据
if self.radioButtonCH4QX.isChecked() and self.lineUtf8[:2]=="A+":
print(self.lineUtf8)
dataSplit = self.get_data_qx.Transdata(self.lineUtf8)
self.filenameCsv= self.file + ".csv"
if self.checkBoxAutoSaveCsv.isChecked() and self.CsvFlag: #写入CSV文件
try:
self.get_data_qx.SaveCsv(self.filenameCsv)
except:
print("写入CSV失败")
pass
self.update_data_thread.SetFlag(1)
self.update_data_thread.SetReceiveData(dataSplit)
#更新当前数据
self.lineEditCurrentValue.setText(str(round(dataSplit,3)))
self.lineEditWindowMean.setText (str(round(self.plot_qchart.windowAverage,3)))
self.lineEditWindowMSE.setText (str(round(self.plot_qchart.windowStd,3)))
#print(dataSplit)
#print("接收发数",datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f"))
elif self.radioButtonCH4TF.isChecked() :
print(self.lineUtf8)
dataSplit = self.get_data_tf.Transdata(self.lineUtf8)
#print("dataSplit",type(dataSplit))
if isinstance(dataSplit, (float, int)):
self.filenameCsv= self.file + ".csv"
if self.checkBoxAutoSaveCsv.isChecked() and self.CsvFlag: #写入CSV文件
try:
self.get_data_tf.SaveCsv(self.filenameCsv)
except:
print("写入CSV失败")
pass
self.update_data_thread.SetFlag(1)
#print("dataSplit",dataSplit)
self.update_data_thread.SetReceiveData(dataSplit)
#更新当前数据
self.lineEditCurrentValue.setText(str(round(dataSplit,3)))
self.lineEditWindowMean.setText (str(round(self.plot_qchart.windowAverage,3)))
self.lineEditWindowMSE.setText (str(round(self.plot_qchart.windowStd,3)))
else:
print("dataSplit type:",type(dataSplit))
elif self.radioButtonOtherData.isChecked() :
print(self.lineUtf8)
dataSplit = self.get_data_other.Transdata(self.lineUtf8)
#print("dataSplit",type(dataSplit))
if isinstance(dataSplit, (float, int)):
self.filenameCsv= self.file + ".csv"
if self.checkBoxAutoSaveCsv.isChecked() and self.CsvFlag: #写入CSV文件
try:
self.get_data_other.SaveCsv(self.filenameCsv)
except:
print("写入CSV失败")
pass
self.update_data_thread.SetFlag(1)
#print("dataSplit",dataSplit)
self.update_data_thread.SetReceiveData(dataSplit)
#更新当前数据
self.lineEditCurrentValue.setText(str(round(dataSplit,3)))
self.lineEditWindowMean.setText (str(round(self.plot_qchart.windowAverage,3)))
self.lineEditWindowMSE.setText (str(round(self.plot_qchart.windowStd,3)))
else:
print("dataSplit type:",type(dataSplit))
except Exception as e:
print(f"Error reading configuration: {e}")
print("自动保存日志失败")
pass
def send_data_clear(self):
self.textEditSend.setText("")
self.data_num_sended = 0
self.lineEditSendNum.setText(str(self.data_num_sended))
# 清除接收数据显示
def receive_data_clear(self):
self.textEditReceive.setText("")
self.data_num_received = 0
self.lineEditSendNum.setText(str(self.data_num_received))
# 关闭串口
def port_close(self):
try:
self.timer.stop()
self.timer_send.stop()
self.btn_stop_clicked() #执行停止绘图操作
self.ser.close()
except:
QMessageBox.critical(self, '串口异常', '关闭串口失败,请重启程序!')
return None
# 切换开关串口按钮使能状态和定时发送使能状态
self.pushButtonOpenSerial.setEnabled(True)
self.pushButtonCloseSerial.setEnabled(False)
self.lineEditTime.setEnabled(True)
self.comboBoxBaudrate.setEnabled(True)
self.comboBoxSerial.setEnabled(True)
self.pushButton_expend.setEnabled(False)
# 发送数据和接收数据数目置零
self.data_num_sended = 0
self.lineEditSendNum.setText(str(self.data_num_sended))
self.data_num_received = 0
self.lineEditReceiveNum.setText(str(self.data_num_received))
#self.formGroupBox1.setTitle("串口状态(关闭)")
def btn_start_clicked(self):
#开启按钮
self.update_data_thread.start()
self.update_data_thread.restart()
self.pushButtonStartPlot.setEnabled(False)
self.pushButtonStopPlot.setEnabled(True)
self.radioButtonCH4QX.setEnabled(False)
self.radioButtonCH4TF.setEnabled(False)
self.radioButtonOtherData.setEnabled(False)
self.checkBoxAutoSaveCsv.setEnabled(True)
if self.radioButtonCH4QX.isChecked():
self.comboBoxPlot.addItems(["甲烷浓度","环境温度","激光器温度","激光强度"])
self.comboBoxPlot.setCurrentText("甲烷浓度")
self.get_data_qx.IndOfReturn(0)
elif self.radioButtonCH4TF.isChecked():
iterm = self.get_data_tf.rowTitle[1:]
print("iterm",iterm)
self.comboBoxPlot.addItems(iterm)
elif self.radioButtonOtherData.isChecked():
iterm = self.get_data_other.rowTitle[1:]
print("iterm",iterm)
self.comboBoxPlot.addItems(iterm)
#self.update_data_thread.SetPlotItem(0)
self.update_data_thread.restart()
self.CsvFlag = 1
def btn_stop_clicked(self):
self.update_data_thread.stop()
self.pushButtonStartPlot.setEnabled(True)
self.pushButtonStopPlot.setEnabled(False)
self.radioButtonCH4QX.setEnabled(True)
self.radioButtonCH4TF.setEnabled(True)
self.radioButtonOtherData.setEnabled(True)
self.checkBoxAutoSaveCsv.setEnabled(False)
self.comboBoxPlot.clear()
self.CsvFlag = 0
def update_data_thread_slot(self, data):
# 线程回调函数
#data = json.loads(data)
self.plot_qchart.handle_update(float(data))
#print("thread ",data)
def plot_item_changed(self,index):
print(index)
self.plot_qchart.clearSeries()
#self.update_data_thread.SetPlotItem(index)
self.get_data_qx.IndOfReturn(index)
#self.plot_qchart.series.replace([])
self.get_data_tf.IndOfReturn(index)
self.get_data_other.IndOfReturn(index)
def plot_reset(self):
self.plot_qchart.zoomReset()
#开关快捷指令栏
def adjust_sidebar(self):
if self.widget_6.isHidden():
self.widget_6.show()
else:
self.widget_6.hide()
def onPushButtonQuickClicked(self, line_edit):
text = getattr(self, line_edit).text()
#print(f"Button clicked: {text}")
if self.checkBox_return.isChecked():
text = text + "\r\n"
self.data_send(text)
def onButtonRightClicked(self, button_id):
# 弹出一个对话框让用户输入新的按钮名称
button = getattr(self, button_id)
new_name, ok = QInputDialog.getText(self, 'Button Rename', 'Enter new button name:')
if ok and new_name:
button.setText(new_name)
#执行
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
myshow = PyQt5Serial()
myshow.show()
sys.exit(app.exec_())

View File

@ -0,0 +1,611 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'PyUartUi.ui'
#
# Created by: PyQt5 UI code generator 5.15.10
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_UartAssistant(object):
def setupUi(self, UartAssistant):
UartAssistant.setObjectName("UartAssistant")
UartAssistant.resize(996, 694)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(2)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(UartAssistant.sizePolicy().hasHeightForWidth())
UartAssistant.setSizePolicy(sizePolicy)
UartAssistant.setAcceptDrops(True)
icon = QtGui.QIcon()
icon.addPixmap(QtGui.QPixmap("favicon.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
UartAssistant.setWindowIcon(icon)
self.horizontalLayout_15 = QtWidgets.QHBoxLayout(UartAssistant)
self.horizontalLayout_15.setObjectName("horizontalLayout_15")
self.widget_7 = QtWidgets.QWidget(UartAssistant)
self.widget_7.setObjectName("widget_7")
self.horizontalLayout_14 = QtWidgets.QHBoxLayout(self.widget_7)
self.horizontalLayout_14.setObjectName("horizontalLayout_14")
self.splitter = QtWidgets.QSplitter(self.widget_7)
self.splitter.setMaximumSize(QtCore.QSize(16777215, 16777215))
self.splitter.setOrientation(QtCore.Qt.Horizontal)
self.splitter.setHandleWidth(5)
self.splitter.setObjectName("splitter")
self.widget_4 = QtWidgets.QWidget(self.splitter)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(1)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.widget_4.sizePolicy().hasHeightForWidth())
self.widget_4.setSizePolicy(sizePolicy)
self.widget_4.setObjectName("widget_4")
self.horizontalLayout = QtWidgets.QHBoxLayout(self.widget_4)
self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout.setSpacing(0)
self.horizontalLayout.setObjectName("horizontalLayout")
self.widget = QtWidgets.QWidget(self.widget_4)
self.widget.setObjectName("widget")
self.verticalLayout_5 = QtWidgets.QVBoxLayout(self.widget)
self.verticalLayout_5.setObjectName("verticalLayout_5")
self.groupBox = QtWidgets.QGroupBox(self.widget)
self.groupBox.setMinimumSize(QtCore.QSize(220, 291))
self.groupBox.setBaseSize(QtCore.QSize(271, 291))
self.groupBox.setObjectName("groupBox")
self.pushButtonTestSerial = QtWidgets.QPushButton(self.groupBox)
self.pushButtonTestSerial.setGeometry(QtCore.QRect(10, 210, 93, 28))
self.pushButtonTestSerial.setObjectName("pushButtonTestSerial")
self.pushButtonOpenSerial = QtWidgets.QPushButton(self.groupBox)
self.pushButtonOpenSerial.setGeometry(QtCore.QRect(120, 210, 93, 28))
self.pushButtonOpenSerial.setStyleSheet("background-color: rgb(0, 255, 0);")
self.pushButtonOpenSerial.setObjectName("pushButtonOpenSerial")
self.pushButtonCloseSerial = QtWidgets.QPushButton(self.groupBox)
self.pushButtonCloseSerial.setGeometry(QtCore.QRect(10, 240, 201, 28))
self.pushButtonCloseSerial.setObjectName("pushButtonCloseSerial")
self.layoutWidget_3 = QtWidgets.QWidget(self.groupBox)
self.layoutWidget_3.setGeometry(QtCore.QRect(10, 30, 74, 171))
self.layoutWidget_3.setObjectName("layoutWidget_3")
self.verticalLayout = QtWidgets.QVBoxLayout(self.layoutWidget_3)
self.verticalLayout.setContentsMargins(0, 0, 0, 0)
self.verticalLayout.setObjectName("verticalLayout")
self.label = QtWidgets.QLabel(self.layoutWidget_3)
self.label.setObjectName("label")
self.verticalLayout.addWidget(self.label)
self.label_2 = QtWidgets.QLabel(self.layoutWidget_3)
self.label_2.setObjectName("label_2")
self.verticalLayout.addWidget(self.label_2)
self.label_3 = QtWidgets.QLabel(self.layoutWidget_3)
self.label_3.setObjectName("label_3")
self.verticalLayout.addWidget(self.label_3)
self.label_4 = QtWidgets.QLabel(self.layoutWidget_3)
self.label_4.setObjectName("label_4")
self.verticalLayout.addWidget(self.label_4)
self.label_5 = QtWidgets.QLabel(self.layoutWidget_3)
self.label_5.setObjectName("label_5")
self.verticalLayout.addWidget(self.label_5)
self.label_6 = QtWidgets.QLabel(self.layoutWidget_3)
self.label_6.setObjectName("label_6")
self.verticalLayout.addWidget(self.label_6)
self.layoutWidget_4 = QtWidgets.QWidget(self.groupBox)
self.layoutWidget_4.setGeometry(QtCore.QRect(80, 30, 128, 171))
self.layoutWidget_4.setObjectName("layoutWidget_4")
self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.layoutWidget_4)
self.verticalLayout_2.setContentsMargins(0, 0, 0, 0)
self.verticalLayout_2.setObjectName("verticalLayout_2")
self.comboBoxSerial = QtWidgets.QComboBox(self.layoutWidget_4)
self.comboBoxSerial.setObjectName("comboBoxSerial")
self.verticalLayout_2.addWidget(self.comboBoxSerial)
self.comboBoxBaudrate = QtWidgets.QComboBox(self.layoutWidget_4)
self.comboBoxBaudrate.setToolTipDuration(0)
self.comboBoxBaudrate.setEditable(True)
self.comboBoxBaudrate.setObjectName("comboBoxBaudrate")
self.comboBoxBaudrate.addItem("")
self.comboBoxBaudrate.addItem("")
self.comboBoxBaudrate.addItem("")
self.comboBoxBaudrate.addItem("")
self.comboBoxBaudrate.addItem("")
self.comboBoxBaudrate.addItem("")
self.comboBoxBaudrate.addItem("")
self.comboBoxBaudrate.addItem("")
self.comboBoxBaudrate.addItem("")
self.comboBoxBaudrate.addItem("")
self.comboBoxBaudrate.addItem("")
self.verticalLayout_2.addWidget(self.comboBoxBaudrate)
self.comboBoxDataBits = QtWidgets.QComboBox(self.layoutWidget_4)
self.comboBoxDataBits.setEditable(True)
self.comboBoxDataBits.setObjectName("comboBoxDataBits")
self.comboBoxDataBits.addItem("")
self.comboBoxDataBits.addItem("")
self.comboBoxDataBits.addItem("")
self.comboBoxDataBits.addItem("")
self.verticalLayout_2.addWidget(self.comboBoxDataBits)
self.comboBoxCheckBit = QtWidgets.QComboBox(self.layoutWidget_4)
self.comboBoxCheckBit.setEditable(True)
self.comboBoxCheckBit.setObjectName("comboBoxCheckBit")
self.comboBoxCheckBit.addItem("")
self.comboBoxCheckBit.addItem("")
self.comboBoxCheckBit.addItem("")
self.verticalLayout_2.addWidget(self.comboBoxCheckBit)
self.comboBoxStopBit = QtWidgets.QComboBox(self.layoutWidget_4)
self.comboBoxStopBit.setEditable(True)
self.comboBoxStopBit.setObjectName("comboBoxStopBit")
self.comboBoxStopBit.addItem("")
self.comboBoxStopBit.addItem("")
self.verticalLayout_2.addWidget(self.comboBoxStopBit)
self.comboBoxFlow = QtWidgets.QComboBox(self.layoutWidget_4)
self.comboBoxFlow.setEditable(True)
self.comboBoxFlow.setObjectName("comboBoxFlow")
self.comboBoxFlow.addItem("")
self.comboBoxFlow.addItem("")
self.verticalLayout_2.addWidget(self.comboBoxFlow)
self.verticalLayout_5.addWidget(self.groupBox)
self.groupBox_2 = QtWidgets.QGroupBox(self.widget)
self.groupBox_2.setMinimumSize(QtCore.QSize(220, 165))
self.groupBox_2.setBaseSize(QtCore.QSize(271, 165))
self.groupBox_2.setObjectName("groupBox_2")
self.layoutWidget_5 = QtWidgets.QWidget(self.groupBox_2)
self.layoutWidget_5.setGeometry(QtCore.QRect(10, 20, 197, 79))
self.layoutWidget_5.setObjectName("layoutWidget_5")
self.verticalLayout_6 = QtWidgets.QVBoxLayout(self.layoutWidget_5)
self.verticalLayout_6.setContentsMargins(0, 0, 0, 0)
self.verticalLayout_6.setObjectName("verticalLayout_6")
self.horizontalLayout_10 = QtWidgets.QHBoxLayout()
self.horizontalLayout_10.setObjectName("horizontalLayout_10")
self.checkBoxHexSend = QtWidgets.QCheckBox(self.layoutWidget_5)
self.checkBoxHexSend.setObjectName("checkBoxHexSend")
self.horizontalLayout_10.addWidget(self.checkBoxHexSend)
self.checkBoxHexReceive = QtWidgets.QCheckBox(self.layoutWidget_5)
self.checkBoxHexReceive.setObjectName("checkBoxHexReceive")
self.horizontalLayout_10.addWidget(self.checkBoxHexReceive)
self.verticalLayout_6.addLayout(self.horizontalLayout_10)
self.horizontalLayout_11 = QtWidgets.QHBoxLayout()
self.horizontalLayout_11.setObjectName("horizontalLayout_11")
self.checkBoxDTR = QtWidgets.QCheckBox(self.layoutWidget_5)
self.checkBoxDTR.setObjectName("checkBoxDTR")
self.horizontalLayout_11.addWidget(self.checkBoxDTR)
self.checkBoxRTS = QtWidgets.QCheckBox(self.layoutWidget_5)
self.checkBoxRTS.setObjectName("checkBoxRTS")
self.horizontalLayout_11.addWidget(self.checkBoxRTS)
self.verticalLayout_6.addLayout(self.horizontalLayout_11)
self.horizontalLayout_12 = QtWidgets.QHBoxLayout()
self.horizontalLayout_12.setObjectName("horizontalLayout_12")
self.checkBoxAddDate = QtWidgets.QCheckBox(self.layoutWidget_5)
self.checkBoxAddDate.setObjectName("checkBoxAddDate")
self.horizontalLayout_12.addWidget(self.checkBoxAddDate)
self.checkBoxCRLF = QtWidgets.QCheckBox(self.layoutWidget_5)
self.checkBoxCRLF.setObjectName("checkBoxCRLF")
self.horizontalLayout_12.addWidget(self.checkBoxCRLF)
self.verticalLayout_6.addLayout(self.horizontalLayout_12)
self.layoutWidget_6 = QtWidgets.QWidget(self.groupBox_2)
self.layoutWidget_6.setGeometry(QtCore.QRect(10, 130, 195, 30))
self.layoutWidget_6.setObjectName("layoutWidget_6")
self.horizontalLayout_13 = QtWidgets.QHBoxLayout(self.layoutWidget_6)
self.horizontalLayout_13.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout_13.setObjectName("horizontalLayout_13")
self.pushButtonLogSave = QtWidgets.QPushButton(self.layoutWidget_6)
self.pushButtonLogSave.setObjectName("pushButtonLogSave")
self.horizontalLayout_13.addWidget(self.pushButtonLogSave)
self.pushButtonLogLoad = QtWidgets.QPushButton(self.layoutWidget_6)
self.pushButtonLogLoad.setObjectName("pushButtonLogLoad")
self.horizontalLayout_13.addWidget(self.pushButtonLogLoad)
self.checkBoxAutoSaveLog = QtWidgets.QCheckBox(self.groupBox_2)
self.checkBoxAutoSaveLog.setGeometry(QtCore.QRect(12, 103, 90, 16))
self.checkBoxAutoSaveLog.setChecked(True)
self.checkBoxAutoSaveLog.setObjectName("checkBoxAutoSaveLog")
self.verticalLayout_5.addWidget(self.groupBox_2)
self.groupBox_3 = QtWidgets.QGroupBox(self.widget)
self.groupBox_3.setMinimumSize(QtCore.QSize(220, 80))
self.groupBox_3.setBaseSize(QtCore.QSize(271, 80))
self.groupBox_3.setObjectName("groupBox_3")
self.checkBoxReapitSend = QtWidgets.QCheckBox(self.groupBox_3)
self.checkBoxReapitSend.setGeometry(QtCore.QRect(10, 30, 91, 19))
self.checkBoxReapitSend.setObjectName("checkBoxReapitSend")
self.label_7 = QtWidgets.QLabel(self.groupBox_3)
self.label_7.setGeometry(QtCore.QRect(170, 30, 51, 16))
self.label_7.setObjectName("label_7")
self.lineEditTime = QtWidgets.QLineEdit(self.groupBox_3)
self.lineEditTime.setGeometry(QtCore.QRect(110, 30, 51, 21))
self.lineEditTime.setObjectName("lineEditTime")
self.verticalLayout_5.addWidget(self.groupBox_3)
spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
self.verticalLayout_5.addItem(spacerItem)
self.groupBox_6 = QtWidgets.QGroupBox(self.widget)
self.groupBox_6.setMinimumSize(QtCore.QSize(220, 80))
self.groupBox_6.setBaseSize(QtCore.QSize(281, 80))
self.groupBox_6.setTitle("")
self.groupBox_6.setObjectName("groupBox_6")
self.label_9 = QtWidgets.QLabel(self.groupBox_6)
self.label_9.setGeometry(QtCore.QRect(120, 20, 72, 15))
self.label_9.setObjectName("label_9")
self.lineEditSendNum = QtWidgets.QLineEdit(self.groupBox_6)
self.lineEditSendNum.setGeometry(QtCore.QRect(40, 20, 61, 21))
self.lineEditSendNum.setObjectName("lineEditSendNum")
self.lineEditReceiveNum = QtWidgets.QLineEdit(self.groupBox_6)
self.lineEditReceiveNum.setGeometry(QtCore.QRect(140, 20, 61, 21))
self.lineEditReceiveNum.setObjectName("lineEditReceiveNum")
self.label_10 = QtWidgets.QLabel(self.groupBox_6)
self.label_10.setGeometry(QtCore.QRect(20, 40, 131, 16))
self.label_10.setObjectName("label_10")
self.label_SendNum = QtWidgets.QLabel(self.groupBox_6)
self.label_SendNum.setGeometry(QtCore.QRect(20, 20, 72, 15))
self.label_SendNum.setObjectName("label_SendNum")
self.verticalLayout_5.addWidget(self.groupBox_6)
self.horizontalLayout.addWidget(self.widget)
self.widget_5 = QtWidgets.QWidget(self.splitter)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(1)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.widget_5.sizePolicy().hasHeightForWidth())
self.widget_5.setSizePolicy(sizePolicy)
self.widget_5.setObjectName("widget_5")
self.horizontalLayout_9 = QtWidgets.QHBoxLayout(self.widget_5)
self.horizontalLayout_9.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout_9.setSpacing(0)
self.horizontalLayout_9.setObjectName("horizontalLayout_9")
self.tabWidget = QtWidgets.QTabWidget(self.widget_5)
self.tabWidget.setMouseTracking(False)
self.tabWidget.setObjectName("tabWidget")
self.tab = QtWidgets.QWidget()
self.tab.setObjectName("tab")
self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.tab)
self.verticalLayout_3.setObjectName("verticalLayout_3")
self.groupBox_4 = QtWidgets.QGroupBox(self.tab)
self.groupBox_4.setObjectName("groupBox_4")
self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.groupBox_4)
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
self.textEditReceive = QtWidgets.QTextEdit(self.groupBox_4)
self.textEditReceive.setSizeIncrement(QtCore.QSize(1, 1))
self.textEditReceive.setObjectName("textEditReceive")
self.horizontalLayout_2.addWidget(self.textEditReceive)
self.verticalLayout_3.addWidget(self.groupBox_4)
self.groupBox_5 = QtWidgets.QGroupBox(self.tab)
self.groupBox_5.setObjectName("groupBox_5")
self.gridLayout = QtWidgets.QGridLayout(self.groupBox_5)
self.gridLayout.setObjectName("gridLayout")
self.pushButtonClearReceive = QtWidgets.QPushButton(self.groupBox_5)
self.pushButtonClearReceive.setObjectName("pushButtonClearReceive")
self.gridLayout.addWidget(self.pushButtonClearReceive, 1, 1, 1, 1)
self.pushButtonSend = QtWidgets.QPushButton(self.groupBox_5)
font = QtGui.QFont()
font.setFamily("3ds")
font.setPointSize(12)
self.pushButtonSend.setFont(font)
self.pushButtonSend.setAutoFillBackground(False)
self.pushButtonSend.setStyleSheet("background-color: rgb(0, 255, 0);")
self.pushButtonSend.setCheckable(False)
self.pushButtonSend.setFlat(False)
self.pushButtonSend.setObjectName("pushButtonSend")
self.gridLayout.addWidget(self.pushButtonSend, 3, 1, 1, 1)
self.pushButtonClearSend = QtWidgets.QPushButton(self.groupBox_5)
self.pushButtonClearSend.setObjectName("pushButtonClearSend")
self.gridLayout.addWidget(self.pushButtonClearSend, 2, 1, 1, 1)
self.pushButton_expend = QtWidgets.QPushButton(self.groupBox_5)
self.pushButton_expend.setObjectName("pushButton_expend")
self.gridLayout.addWidget(self.pushButton_expend, 0, 1, 1, 1)
self.textEditSend = QtWidgets.QTextEdit(self.groupBox_5)
self.textEditSend.setObjectName("textEditSend")
self.gridLayout.addWidget(self.textEditSend, 0, 0, 4, 1)
self.verticalLayout_3.addWidget(self.groupBox_5)
self.verticalLayout_3.setStretch(0, 6)
self.verticalLayout_3.setStretch(1, 2)
self.tabWidget.addTab(self.tab, "")
self.horizontalLayout_9.addWidget(self.tabWidget)
self.widget_6 = QtWidgets.QWidget(self.splitter)
self.widget_6.setEnabled(True)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(2)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.widget_6.sizePolicy().hasHeightForWidth())
self.widget_6.setSizePolicy(sizePolicy)
self.widget_6.setMinimumSize(QtCore.QSize(260, 0))
self.widget_6.setObjectName("widget_6")
self.horizontalLayout_16 = QtWidgets.QHBoxLayout(self.widget_6)
self.horizontalLayout_16.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout_16.setSpacing(0)
self.horizontalLayout_16.setObjectName("horizontalLayout_16")
self.scrollArea = QtWidgets.QScrollArea(self.widget_6)
self.scrollArea.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)
self.scrollArea.setWidgetResizable(False)
self.scrollArea.setObjectName("scrollArea")
self.scrollAreaWidgetContents = QtWidgets.QWidget()
self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 241, 1000))
self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents")
self.widget_8 = QtWidgets.QWidget(self.scrollAreaWidgetContents)
self.widget_8.setGeometry(QtCore.QRect(12, 2, 221, 34))
self.widget_8.setObjectName("widget_8")
self.horizontalLayout_17 = QtWidgets.QHBoxLayout(self.widget_8)
self.horizontalLayout_17.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout_17.setObjectName("horizontalLayout_17")
self.label_8 = QtWidgets.QLabel(self.widget_8)
self.label_8.setObjectName("label_8")
self.horizontalLayout_17.addWidget(self.label_8)
self.checkBox_return = QtWidgets.QCheckBox(self.widget_8)
self.checkBox_return.setChecked(True)
self.checkBox_return.setObjectName("checkBox_return")
self.horizontalLayout_17.addWidget(self.checkBox_return)
self.widget_9 = QtWidgets.QWidget(self.scrollAreaWidgetContents)
self.widget_9.setGeometry(QtCore.QRect(12, 42, 236, 1000))
self.widget_9.setObjectName("widget_9")
self.layoutWidget = QtWidgets.QWidget(self.widget_9)
self.layoutWidget.setGeometry(QtCore.QRect(12, 12, 218, 616))
self.layoutWidget.setObjectName("layoutWidget")
self.verticalLayout_8 = QtWidgets.QVBoxLayout(self.layoutWidget)
self.verticalLayout_8.setContentsMargins(0, 0, 0, 0)
self.verticalLayout_8.setObjectName("verticalLayout_8")
self.horizontalLayoutQuick_1 = QtWidgets.QHBoxLayout()
self.horizontalLayoutQuick_1.setObjectName("horizontalLayoutQuick_1")
self.lineEditQuick_1 = QtWidgets.QLineEdit(self.layoutWidget)
self.lineEditQuick_1.setObjectName("lineEditQuick_1")
self.horizontalLayoutQuick_1.addWidget(self.lineEditQuick_1)
self.pushButtonQuick_1 = QtWidgets.QPushButton(self.layoutWidget)
self.pushButtonQuick_1.setObjectName("pushButtonQuick_1")
self.horizontalLayoutQuick_1.addWidget(self.pushButtonQuick_1)
self.verticalLayout_8.addLayout(self.horizontalLayoutQuick_1)
self.horizontalLayoutQuick_2 = QtWidgets.QHBoxLayout()
self.horizontalLayoutQuick_2.setObjectName("horizontalLayoutQuick_2")
self.lineEditQuick_2 = QtWidgets.QLineEdit(self.layoutWidget)
self.lineEditQuick_2.setObjectName("lineEditQuick_2")
self.horizontalLayoutQuick_2.addWidget(self.lineEditQuick_2)
self.pushButtonQuick_2 = QtWidgets.QPushButton(self.layoutWidget)
self.pushButtonQuick_2.setObjectName("pushButtonQuick_2")
self.horizontalLayoutQuick_2.addWidget(self.pushButtonQuick_2)
self.verticalLayout_8.addLayout(self.horizontalLayoutQuick_2)
self.horizontalLayoutQuick_3 = QtWidgets.QHBoxLayout()
self.horizontalLayoutQuick_3.setObjectName("horizontalLayoutQuick_3")
self.lineEditQuick_3 = QtWidgets.QLineEdit(self.layoutWidget)
self.lineEditQuick_3.setObjectName("lineEditQuick_3")
self.horizontalLayoutQuick_3.addWidget(self.lineEditQuick_3)
self.pushButtonQuick_3 = QtWidgets.QPushButton(self.layoutWidget)
self.pushButtonQuick_3.setObjectName("pushButtonQuick_3")
self.horizontalLayoutQuick_3.addWidget(self.pushButtonQuick_3)
self.verticalLayout_8.addLayout(self.horizontalLayoutQuick_3)
self.horizontalLayoutQuick_4 = QtWidgets.QHBoxLayout()
self.horizontalLayoutQuick_4.setObjectName("horizontalLayoutQuick_4")
self.lineEditQuick_4 = QtWidgets.QLineEdit(self.layoutWidget)
self.lineEditQuick_4.setObjectName("lineEditQuick_4")
self.horizontalLayoutQuick_4.addWidget(self.lineEditQuick_4)
self.pushButtonQuick_4 = QtWidgets.QPushButton(self.layoutWidget)
self.pushButtonQuick_4.setObjectName("pushButtonQuick_4")
self.horizontalLayoutQuick_4.addWidget(self.pushButtonQuick_4)
self.verticalLayout_8.addLayout(self.horizontalLayoutQuick_4)
self.horizontalLayoutQuick_5 = QtWidgets.QHBoxLayout()
self.horizontalLayoutQuick_5.setObjectName("horizontalLayoutQuick_5")
self.lineEditQuick_5 = QtWidgets.QLineEdit(self.layoutWidget)
self.lineEditQuick_5.setObjectName("lineEditQuick_5")
self.horizontalLayoutQuick_5.addWidget(self.lineEditQuick_5)
self.pushButtonQuick_5 = QtWidgets.QPushButton(self.layoutWidget)
self.pushButtonQuick_5.setObjectName("pushButtonQuick_5")
self.horizontalLayoutQuick_5.addWidget(self.pushButtonQuick_5)
self.verticalLayout_8.addLayout(self.horizontalLayoutQuick_5)
self.horizontalLayoutQuick_6 = QtWidgets.QHBoxLayout()
self.horizontalLayoutQuick_6.setObjectName("horizontalLayoutQuick_6")
self.lineEditQuick_6 = QtWidgets.QLineEdit(self.layoutWidget)
self.lineEditQuick_6.setObjectName("lineEditQuick_6")
self.horizontalLayoutQuick_6.addWidget(self.lineEditQuick_6)
self.pushButtonQuick_6 = QtWidgets.QPushButton(self.layoutWidget)
self.pushButtonQuick_6.setObjectName("pushButtonQuick_6")
self.horizontalLayoutQuick_6.addWidget(self.pushButtonQuick_6)
self.verticalLayout_8.addLayout(self.horizontalLayoutQuick_6)
self.horizontalLayoutQuick_7 = QtWidgets.QHBoxLayout()
self.horizontalLayoutQuick_7.setObjectName("horizontalLayoutQuick_7")
self.lineEditQuick_7 = QtWidgets.QLineEdit(self.layoutWidget)
self.lineEditQuick_7.setObjectName("lineEditQuick_7")
self.horizontalLayoutQuick_7.addWidget(self.lineEditQuick_7)
self.pushButtonQuick_7 = QtWidgets.QPushButton(self.layoutWidget)
self.pushButtonQuick_7.setObjectName("pushButtonQuick_7")
self.horizontalLayoutQuick_7.addWidget(self.pushButtonQuick_7)
self.verticalLayout_8.addLayout(self.horizontalLayoutQuick_7)
self.horizontalLayoutQuick_8 = QtWidgets.QHBoxLayout()
self.horizontalLayoutQuick_8.setObjectName("horizontalLayoutQuick_8")
self.lineEditQuick_8 = QtWidgets.QLineEdit(self.layoutWidget)
self.lineEditQuick_8.setObjectName("lineEditQuick_8")
self.horizontalLayoutQuick_8.addWidget(self.lineEditQuick_8)
self.pushButtonQuick_8 = QtWidgets.QPushButton(self.layoutWidget)
self.pushButtonQuick_8.setObjectName("pushButtonQuick_8")
self.horizontalLayoutQuick_8.addWidget(self.pushButtonQuick_8)
self.verticalLayout_8.addLayout(self.horizontalLayoutQuick_8)
self.horizontalLayoutQuick_9 = QtWidgets.QHBoxLayout()
self.horizontalLayoutQuick_9.setObjectName("horizontalLayoutQuick_9")
self.lineEditQuick_9 = QtWidgets.QLineEdit(self.layoutWidget)
self.lineEditQuick_9.setObjectName("lineEditQuick_9")
self.horizontalLayoutQuick_9.addWidget(self.lineEditQuick_9)
self.pushButtonQuick_9 = QtWidgets.QPushButton(self.layoutWidget)
self.pushButtonQuick_9.setObjectName("pushButtonQuick_9")
self.horizontalLayoutQuick_9.addWidget(self.pushButtonQuick_9)
self.verticalLayout_8.addLayout(self.horizontalLayoutQuick_9)
self.horizontalLayoutQuick_10 = QtWidgets.QHBoxLayout()
self.horizontalLayoutQuick_10.setObjectName("horizontalLayoutQuick_10")
self.lineEditQuick_10 = QtWidgets.QLineEdit(self.layoutWidget)
self.lineEditQuick_10.setObjectName("lineEditQuick_10")
self.horizontalLayoutQuick_10.addWidget(self.lineEditQuick_10)
self.pushButtonQuick_10 = QtWidgets.QPushButton(self.layoutWidget)
self.pushButtonQuick_10.setObjectName("pushButtonQuick_10")
self.horizontalLayoutQuick_10.addWidget(self.pushButtonQuick_10)
self.verticalLayout_8.addLayout(self.horizontalLayoutQuick_10)
self.horizontalLayoutQuick_11 = QtWidgets.QHBoxLayout()
self.horizontalLayoutQuick_11.setObjectName("horizontalLayoutQuick_11")
self.lineEditQuick_11 = QtWidgets.QLineEdit(self.layoutWidget)
self.lineEditQuick_11.setObjectName("lineEditQuick_11")
self.horizontalLayoutQuick_11.addWidget(self.lineEditQuick_11)
self.pushButtonQuick_11 = QtWidgets.QPushButton(self.layoutWidget)
self.pushButtonQuick_11.setObjectName("pushButtonQuick_11")
self.horizontalLayoutQuick_11.addWidget(self.pushButtonQuick_11)
self.verticalLayout_8.addLayout(self.horizontalLayoutQuick_11)
self.horizontalLayoutQuick_12 = QtWidgets.QHBoxLayout()
self.horizontalLayoutQuick_12.setObjectName("horizontalLayoutQuick_12")
self.lineEditQuick_12 = QtWidgets.QLineEdit(self.layoutWidget)
self.lineEditQuick_12.setObjectName("lineEditQuick_12")
self.horizontalLayoutQuick_12.addWidget(self.lineEditQuick_12)
self.pushButtonQuick_12 = QtWidgets.QPushButton(self.layoutWidget)
self.pushButtonQuick_12.setObjectName("pushButtonQuick_12")
self.horizontalLayoutQuick_12.addWidget(self.pushButtonQuick_12)
self.verticalLayout_8.addLayout(self.horizontalLayoutQuick_12)
self.horizontalLayoutQuick_13 = QtWidgets.QHBoxLayout()
self.horizontalLayoutQuick_13.setObjectName("horizontalLayoutQuick_13")
self.lineEditQuick_13 = QtWidgets.QLineEdit(self.layoutWidget)
self.lineEditQuick_13.setObjectName("lineEditQuick_13")
self.horizontalLayoutQuick_13.addWidget(self.lineEditQuick_13)
self.pushButtonQuick_13 = QtWidgets.QPushButton(self.layoutWidget)
self.pushButtonQuick_13.setObjectName("pushButtonQuick_13")
self.horizontalLayoutQuick_13.addWidget(self.pushButtonQuick_13)
self.verticalLayout_8.addLayout(self.horizontalLayoutQuick_13)
self.horizontalLayoutQuick_14 = QtWidgets.QHBoxLayout()
self.horizontalLayoutQuick_14.setObjectName("horizontalLayoutQuick_14")
self.lineEditQuick_14 = QtWidgets.QLineEdit(self.layoutWidget)
self.lineEditQuick_14.setObjectName("lineEditQuick_14")
self.horizontalLayoutQuick_14.addWidget(self.lineEditQuick_14)
self.pushButtonQuick_14 = QtWidgets.QPushButton(self.layoutWidget)
self.pushButtonQuick_14.setObjectName("pushButtonQuick_14")
self.horizontalLayoutQuick_14.addWidget(self.pushButtonQuick_14)
self.verticalLayout_8.addLayout(self.horizontalLayoutQuick_14)
self.horizontalLayoutQuick_15 = QtWidgets.QHBoxLayout()
self.horizontalLayoutQuick_15.setObjectName("horizontalLayoutQuick_15")
self.lineEditQuick_15 = QtWidgets.QLineEdit(self.layoutWidget)
self.lineEditQuick_15.setObjectName("lineEditQuick_15")
self.horizontalLayoutQuick_15.addWidget(self.lineEditQuick_15)
self.pushButtonQuick_15 = QtWidgets.QPushButton(self.layoutWidget)
self.pushButtonQuick_15.setObjectName("pushButtonQuick_15")
self.horizontalLayoutQuick_15.addWidget(self.pushButtonQuick_15)
self.verticalLayout_8.addLayout(self.horizontalLayoutQuick_15)
self.horizontalLayoutQuick_16 = QtWidgets.QHBoxLayout()
self.horizontalLayoutQuick_16.setObjectName("horizontalLayoutQuick_16")
self.lineEditQuick_16 = QtWidgets.QLineEdit(self.layoutWidget)
self.lineEditQuick_16.setObjectName("lineEditQuick_16")
self.horizontalLayoutQuick_16.addWidget(self.lineEditQuick_16)
self.pushButtonQuick_16 = QtWidgets.QPushButton(self.layoutWidget)
self.pushButtonQuick_16.setObjectName("pushButtonQuick_16")
self.horizontalLayoutQuick_16.addWidget(self.pushButtonQuick_16)
self.verticalLayout_8.addLayout(self.horizontalLayoutQuick_16)
self.horizontalLayoutQuick_17 = QtWidgets.QHBoxLayout()
self.horizontalLayoutQuick_17.setObjectName("horizontalLayoutQuick_17")
self.lineEditQuick_17 = QtWidgets.QLineEdit(self.layoutWidget)
self.lineEditQuick_17.setObjectName("lineEditQuick_17")
self.horizontalLayoutQuick_17.addWidget(self.lineEditQuick_17)
self.pushButtonQuick_17 = QtWidgets.QPushButton(self.layoutWidget)
self.pushButtonQuick_17.setObjectName("pushButtonQuick_17")
self.horizontalLayoutQuick_17.addWidget(self.pushButtonQuick_17)
self.verticalLayout_8.addLayout(self.horizontalLayoutQuick_17)
self.horizontalLayoutQuick_18 = QtWidgets.QHBoxLayout()
self.horizontalLayoutQuick_18.setObjectName("horizontalLayoutQuick_18")
self.lineEditQuick_18 = QtWidgets.QLineEdit(self.layoutWidget)
self.lineEditQuick_18.setObjectName("lineEditQuick_18")
self.horizontalLayoutQuick_18.addWidget(self.lineEditQuick_18)
self.pushButtonQuick_18 = QtWidgets.QPushButton(self.layoutWidget)
self.pushButtonQuick_18.setObjectName("pushButtonQuick_18")
self.horizontalLayoutQuick_18.addWidget(self.pushButtonQuick_18)
self.verticalLayout_8.addLayout(self.horizontalLayoutQuick_18)
self.horizontalLayoutQuick_19 = QtWidgets.QHBoxLayout()
self.horizontalLayoutQuick_19.setObjectName("horizontalLayoutQuick_19")
self.lineEditQuick_19 = QtWidgets.QLineEdit(self.layoutWidget)
self.lineEditQuick_19.setObjectName("lineEditQuick_19")
self.horizontalLayoutQuick_19.addWidget(self.lineEditQuick_19)
self.pushButtonQuick_19 = QtWidgets.QPushButton(self.layoutWidget)
self.pushButtonQuick_19.setObjectName("pushButtonQuick_19")
self.horizontalLayoutQuick_19.addWidget(self.pushButtonQuick_19)
self.verticalLayout_8.addLayout(self.horizontalLayoutQuick_19)
self.horizontalLayoutQuick_20 = QtWidgets.QHBoxLayout()
self.horizontalLayoutQuick_20.setObjectName("horizontalLayoutQuick_20")
self.lineEditQuick_20 = QtWidgets.QLineEdit(self.layoutWidget)
self.lineEditQuick_20.setObjectName("lineEditQuick_20")
self.horizontalLayoutQuick_20.addWidget(self.lineEditQuick_20)
self.pushButtonQuick_20 = QtWidgets.QPushButton(self.layoutWidget)
self.pushButtonQuick_20.setObjectName("pushButtonQuick_20")
self.horizontalLayoutQuick_20.addWidget(self.pushButtonQuick_20)
self.verticalLayout_8.addLayout(self.horizontalLayoutQuick_20)
self.scrollArea.setWidget(self.scrollAreaWidgetContents)
self.horizontalLayout_16.addWidget(self.scrollArea)
self.horizontalLayout_14.addWidget(self.splitter)
self.horizontalLayout_15.addWidget(self.widget_7)
self.retranslateUi(UartAssistant)
self.comboBoxBaudrate.setCurrentIndex(0)
self.comboBoxDataBits.setCurrentIndex(3)
self.comboBoxCheckBit.setCurrentIndex(0)
self.tabWidget.setCurrentIndex(0)
QtCore.QMetaObject.connectSlotsByName(UartAssistant)
def retranslateUi(self, UartAssistant):
_translate = QtCore.QCoreApplication.translate
UartAssistant.setWindowTitle(_translate("UartAssistant", "串口助手py版"))
self.groupBox.setTitle(_translate("UartAssistant", "串口设置"))
self.pushButtonTestSerial.setText(_translate("UartAssistant", "检测串口"))
self.pushButtonOpenSerial.setText(_translate("UartAssistant", "打开串口"))
self.pushButtonCloseSerial.setText(_translate("UartAssistant", "关闭串口"))
self.label.setText(_translate("UartAssistant", "串口号"))
self.label_2.setText(_translate("UartAssistant", "波特率"))
self.label_3.setText(_translate("UartAssistant", "数据位"))
self.label_4.setText(_translate("UartAssistant", "校验位"))
self.label_5.setText(_translate("UartAssistant", "停止位"))
self.label_6.setText(_translate("UartAssistant", "流控方式"))
self.comboBoxBaudrate.setCurrentText(_translate("UartAssistant", "4800"))
self.comboBoxBaudrate.setItemText(0, _translate("UartAssistant", "4800"))
self.comboBoxBaudrate.setItemText(1, _translate("UartAssistant", "9600"))
self.comboBoxBaudrate.setItemText(2, _translate("UartAssistant", "14400"))
self.comboBoxBaudrate.setItemText(3, _translate("UartAssistant", "19200"))
self.comboBoxBaudrate.setItemText(4, _translate("UartAssistant", "115200"))
self.comboBoxBaudrate.setItemText(5, _translate("UartAssistant", "921600"))
self.comboBoxBaudrate.setItemText(6, _translate("UartAssistant", "1500000"))
self.comboBoxBaudrate.setItemText(7, _translate("UartAssistant", "新建项目"))
self.comboBoxBaudrate.setItemText(8, _translate("UartAssistant", "新建项目"))
self.comboBoxBaudrate.setItemText(9, _translate("UartAssistant", "新建项目"))
self.comboBoxBaudrate.setItemText(10, _translate("UartAssistant", "自定义"))
self.comboBoxDataBits.setCurrentText(_translate("UartAssistant", "8"))
self.comboBoxDataBits.setItemText(0, _translate("UartAssistant", "5"))
self.comboBoxDataBits.setItemText(1, _translate("UartAssistant", "6"))
self.comboBoxDataBits.setItemText(2, _translate("UartAssistant", "7"))
self.comboBoxDataBits.setItemText(3, _translate("UartAssistant", "8"))
self.comboBoxCheckBit.setItemText(0, _translate("UartAssistant", "None"))
self.comboBoxCheckBit.setItemText(1, _translate("UartAssistant", "Odd"))
self.comboBoxCheckBit.setItemText(2, _translate("UartAssistant", "Even"))
self.comboBoxStopBit.setItemText(0, _translate("UartAssistant", "1"))
self.comboBoxStopBit.setItemText(1, _translate("UartAssistant", "2"))
self.comboBoxFlow.setItemText(0, _translate("UartAssistant", "No Ctrl Flow"))
self.comboBoxFlow.setItemText(1, _translate("UartAssistant", "SW Ctrl Flow"))
self.groupBox_2.setTitle(_translate("UartAssistant", "收发设置"))
self.checkBoxHexSend.setText(_translate("UartAssistant", "HEX发送"))
self.checkBoxHexReceive.setText(_translate("UartAssistant", "HEX接收"))
self.checkBoxDTR.setText(_translate("UartAssistant", "DTR"))
self.checkBoxRTS.setText(_translate("UartAssistant", "RTS"))
self.checkBoxAddDate.setText(_translate("UartAssistant", "收/发时间"))
self.checkBoxCRLF.setText(_translate("UartAssistant", "收发换行"))
self.pushButtonLogSave.setText(_translate("UartAssistant", "保存日志"))
self.pushButtonLogLoad.setText(_translate("UartAssistant", "加载日志"))
self.checkBoxAutoSaveLog.setText(_translate("UartAssistant", "自动保存日志"))
self.groupBox_3.setTitle(_translate("UartAssistant", "定时发送"))
self.checkBoxReapitSend.setText(_translate("UartAssistant", "定时发送"))
self.label_7.setText(_translate("UartAssistant", "ms/次"))
self.lineEditTime.setText(_translate("UartAssistant", "1000"))
self.label_9.setText(_translate("UartAssistant", "Rx"))
self.label_10.setText(_translate("UartAssistant", "Powerd by Byan"))
self.label_SendNum.setText(_translate("UartAssistant", "Tx"))
self.groupBox_4.setTitle(_translate("UartAssistant", "数据接收区"))
self.groupBox_5.setTitle(_translate("UartAssistant", "数据发送区"))
self.pushButtonClearReceive.setText(_translate("UartAssistant", "清除接收"))
self.pushButtonSend.setText(_translate("UartAssistant", "发送"))
self.pushButtonClearSend.setText(_translate("UartAssistant", "清除发送"))
self.pushButton_expend.setText(_translate("UartAssistant", "快捷指令"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("UartAssistant", "串口数据"))
self.label_8.setText(_translate("UartAssistant", "快捷指令"))
self.checkBox_return.setText(_translate("UartAssistant", "添加\"回车换行\""))
self.pushButtonQuick_1.setText(_translate("UartAssistant", "Button01"))
self.pushButtonQuick_2.setText(_translate("UartAssistant", "Button02"))
self.pushButtonQuick_3.setText(_translate("UartAssistant", "Button03"))
self.pushButtonQuick_4.setText(_translate("UartAssistant", "Button04"))
self.pushButtonQuick_5.setText(_translate("UartAssistant", "Button05"))
self.pushButtonQuick_6.setText(_translate("UartAssistant", "Button06"))
self.pushButtonQuick_7.setText(_translate("UartAssistant", "Button07"))
self.pushButtonQuick_8.setText(_translate("UartAssistant", "Button08"))
self.pushButtonQuick_9.setText(_translate("UartAssistant", "Button09"))
self.pushButtonQuick_10.setText(_translate("UartAssistant", "Button10"))
self.pushButtonQuick_11.setText(_translate("UartAssistant", "Button11"))
self.pushButtonQuick_12.setText(_translate("UartAssistant", "Button12"))
self.pushButtonQuick_13.setText(_translate("UartAssistant", "Button13"))
self.pushButtonQuick_14.setText(_translate("UartAssistant", "Button14"))
self.pushButtonQuick_15.setText(_translate("UartAssistant", "Button15"))
self.pushButtonQuick_16.setText(_translate("UartAssistant", "Button16"))
self.pushButtonQuick_17.setText(_translate("UartAssistant", "Button17"))
self.pushButtonQuick_18.setText(_translate("UartAssistant", "Button18"))
self.pushButtonQuick_19.setText(_translate("UartAssistant", "Button19"))
self.pushButtonQuick_20.setText(_translate("UartAssistant", "Button20"))

View File

@ -0,0 +1,35 @@
# -*- coding: utf-8 -*-
"""
Created on Thu Sep 26 13:37:14 2024
@author: WANGXIBAO
"""
import socket
def main():
# 1.创建一个udp套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 2.绑定本地的相关信息,如果一个网络程序不绑定,则系统会随机分配
# 30000 表示本地的端口 ip一般不用写
local_addr = ("", 30000)
udp_socket.bind(local_addr)
# 3. 等待接收对方发送的数据
recv_data = udp_socket.recvfrom(1024)
# 1024表示本次接收的最大字节数
# 6. 显示对方发送的数据
# 接收到的数据recv_data是一个元组
# 第1个元素是对方发送的数据
# 第2个元素是对方的ip和端口
print(recv_data[0].decode('utf-8'))
print(recv_data[1])
# 3.关闭套接字
udp_socket.close()
if __name__ == "__main__":
main()

View File

@ -0,0 +1,76 @@
# -*- coding: utf-8 -*-
"""
Created on Thu Sep 26 13:44:27 2024
@author: WANGXIBAO
"""
import socket, os,datetime
from configparser import ConfigParser
def main():
udp = "udp.ini" # 配置文件默认路径
# 检测配置文件
CheckCfgIniData(udp)
# 从配置文件中读取IP和端口
config = ConfigParser()
config.read(udp, encoding='utf-8')
IP = config.get('NetConfig', 'IP')
port = config.get('NetConfig', 'port')
udp_addr = (IP, int(port))
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
print("绑定地址", udp_addr)
# 绑定端口
try:
udp_socket.bind(udp_addr)
print("开始监听。。。")
except Exception as e:
print(f"Error reading configuration: {e}")
return None
# 等待接收对方发送的数据
while True:
try:
recv_data = udp_socket.recvfrom(1024) # 1024表示本次接收的最大字节数
# 打印接收到的数据
line_utf8 = recv_data[0].decode('utf-8',errors='replace')
print("[From %s:%d]:%s" % (recv_data[1][0], recv_data[1][1], line_utf8))
line = line_utf8.split(',')
if len(line) ==2:
sav_name = line[0] +'_'+ datetime.datetime.now().strftime("%Y-%m-%d")+'.txt'
sav_str = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")[:23] +" " +line[1]
with open(sav_name, mode='a', newline='',encoding='utf-8', errors='replace') as file:
file.write(sav_str)
else:
sav_name = datetime.datetime.now().strftime("%Y-%m-%d")+'.log'
sav_str = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")[:23] +" " +line_utf8
with open(sav_name, mode='a', newline='',encoding='utf-8', errors='replace') as file:
file.write(sav_str)
except socket.error as e:
print(f"Socket error: {e}")
break # 处理错误后退出循环
def CheckCfgIniData(udp):
if not os.path.exists(udp):
config = ConfigParser()
config.add_section('NetConfig')
config.set('NetConfig', 'IP', '127.0.0.1')
config.set('NetConfig', 'port', '9000')
with open(udp, 'w', encoding='utf-8') as f:
config.write(f)
config = ConfigParser()
try:
config.read(udp, encoding='utf-8')
IP = config.get('NetConfig', 'IP')
port = config.get('NetConfig', 'port')
print(f"Configuration read successfully: {IP}, {port}")
except Exception as e:
print(f"Error reading configuration: {e}")
if __name__ == '__main__':
main()

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

View File

@ -0,0 +1,38 @@
# -*- coding: utf-8 -*-
"""
Created on Sun May 26 21:10:12 2024
@author: wxb51
"""
#使用Python脚本的方式将UI文件转换为Python文件
import os
import os.path
dir ='./' #文件所在的路径
#找出路径下所有的.ui文件
def listUiFile():
list = []
files = os.listdir(dir)
for filename in files:
#print(filename)
if os.path.splitext(filename)[1] == '.ui':
list.append(filename)
return list
#把扩展名未.ui的转换成.py的文件
def transPyFile(filename):
return os.path.splitext(filename)[0] + '.py'
#通过命令把.ui文件转换成.py文件
def runMain():
list = listUiFile()
for uifile in list:
pyfile = transPyFile(uifile)
cmd = 'pyuic5 -o {pyfile} {uifile}'.format(pyfile=pyfile, uifile=uifile)
os.system(cmd)
if __name__ =="__main__":
runMain()

View File

@ -0,0 +1,101 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>气体浓度和温度实时显示</title>
<style>
body {
font-family: Arial, sans-serif;
margin: 20px;
display: flex;
flex-direction: column;
align-items: center;
}
.container {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 20px;
max-width: 800px;
}
.data-box {
border: 1px solid #ccc;
border-radius: 5px;
padding: 15px;
background-color: #f9f9f9;
text-align: center;
}
.data-title {
font-weight: bold;
margin-bottom: 10px;
}
.data-value {
font-size: 24px;
margin-bottom: 5px;
}
.data-unit {
color: #666;
}
</style>
</head>
<body>
<h1>气体浓度和温度实时显示</h1>
<div class="container">
<div class="data-box">
<div class="data-title">甲烷浓度</div>
<div class="data-value" id="methane-value">0</div>
<div class="data-unit">ppm</div>
</div>
<div class="data-box">
<div class="data-title">乙烷浓度</div>
<div class="data-value" id="ethane-value">0</div>
<div class="data-unit">ppm</div>
</div>
<div class="data-box">
<div class="data-title">二氧化碳浓度</div>
<div class="data-value" id="co2-value">0</div>
<div class="data-unit">ppm</div>
</div>
<div class="data-box">
<div class="data-title">温度</div>
<div class="data-value" id="temperature-value">0</div>
<div class="data-unit">°C</div>
</div>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.0.1/socket.io.js"></script>
<script>
// 连接到Flask-SocketIO服务器
const socket = io('http://127.0.0.1:8000');
// 获取DOM元素
const methaneValue = document.getElementById('methane-value');
const ethaneValue = document.getElementById('ethane-value');
const co2Value = document.getElementById('co2-value');
const temperatureValue = document.getElementById('temperature-value');
// 接收甲烷浓度数据
socket.on('methane_data', function(data) {
methaneValue.textContent = data.value;
console.log('接收到甲烷浓度数据:', data.value);
});
// 接收乙烷浓度数据
socket.on('ethane_data', function(data) {
ethaneValue.textContent = data.value;
console.log('接收到乙烷浓度数据:', data.value);
});
// 接收二氧化碳浓度数据
socket.on('co2_data', function(data) {
co2Value.textContent = data.value;
console.log('接收到二氧化碳浓度数据:', data.value);
});
// 接收温度数据
socket.on('temperature_data', function(data) {
temperatureValue.textContent = data.value;
console.log('接收到温度数据:', data.value);
});
</script>
</body>
</html>

View File

@ -0,0 +1,4 @@
[NetConfig]
ip = 127.0.0.1
port = 9000

View File

@ -0,0 +1,49 @@
# -*- coding: utf-8 -*-
"""
Created on Sun Sep 29 21:35:04 2024
@author: wxb51
"""
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QHBoxLayout, QVBoxLayout, QLineEdit, QPushButton
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
# 创建一个垂直布局
self.verticalLayout = QVBoxLayout()
# 创建一个放置布局的小部件
self.layoutWidget = QWidget(self)
# 循环创建水平布局、文本输入框和按钮
for i in range(21): # 从0到20
horizontalLayout = QHBoxLayout()
horizontalLayout.setObjectName(f"horizontalLayout_{i}")
lineEdit = QLineEdit(self.layoutWidget)
lineEdit.setObjectName(f"lineEdit_{i}")
horizontalLayout.addWidget(lineEdit)
pushButton = QPushButton(self.layoutWidget)
pushButton.setObjectName(f"pushButton_{i}")
horizontalLayout.addWidget(pushButton)
self.verticalLayout.addLayout(horizontalLayout)
# 将垂直布局设置为主布局
self.setLayout(self.verticalLayout)
# 设置窗口标题
self.setWindowTitle('Multiple Layouts Example')
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
ex.show()
sys.exit(app.exec_())

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/.venv" />
</content>
<orderEntry type="jdk" jdkName="Python 3.11" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>