diff --git a/PyMaiHak/PyHex.exe b/PyMaiHak/PyHex.exe
index 4874a2f..413c3c6 100644
Binary files a/PyMaiHak/PyHex.exe and b/PyMaiHak/PyHex.exe differ
diff --git a/PyMaiHak/PyHex.py b/PyMaiHak/PyHex.py
index 1a023af..40cf826 100644
--- a/PyMaiHak/PyHex.py
+++ b/PyMaiHak/PyHex.py
@@ -27,6 +27,9 @@ class PyHexQT(QtWidgets.QWidget,Ui_Form):
self.bytes_length = int(config.get('NetConfig', 'bytes_length'))
self.num_scale = int(config.get('NetConfig', 'num_scale'))
self.log_time = int(config.get('NetConfig', 'log_time'))
+ windowTitle = config.get('NetConfig', 'window_title')
+ self.setWindowTitle(windowTitle)
+
self.log_count = 0
self.log_buffer = []
# 定时器接收数据
@@ -55,6 +58,7 @@ class PyHexQT(QtWidgets.QWidget,Ui_Form):
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
@@ -72,6 +76,8 @@ class PyHexQT(QtWidgets.QWidget,Ui_Form):
out_s = ''
out_s = ' '.join(['{:02X}'.format(b) for b in bytes.fromhex(line_utf8)])
+ # %% 在界面上更新
+ self.add_line_to_textedit(out_s)
# 获取到text光标
textCursor = self.textEdit.textCursor()
# 滚动到底部
@@ -79,11 +85,12 @@ class PyHexQT(QtWidgets.QWidget,Ui_Form):
# 设置光标到text中去
self.textEdit.setTextCursor(textCursor)
- self.textEdit.insertPlainText(out_s)
- self.textEdit.insertPlainText('\r\n')
+ # self.textEdit.insertPlainText(out_s)
+ # self.textEdit.insertPlainText('\r\n')
+
print("[From %s:%d]:%s" % (recv_data[1][0], recv_data[1][1], out_s))
-
+ #%%保存数据到log
sav_str = datetime.datetime.now().strftime("%Y-%m-%dT%H:%M:%S.%f")[:23] +" " +out_s +"\r\n"
#将数据加入缓存区域
self.log_buffer.append(sav_str)
@@ -92,20 +99,20 @@ class PyHexQT(QtWidgets.QWidget,Ui_Form):
if self.log_count>self.log_time:
self.data_save()
- #数据转化
+ #%% 数据转化,并显示在框中
num_hex_str = line_utf8[self.bytes_start*2:(self.bytes_start*2 +self.bytes_length*2 )]
- num_out = int(num_hex_str,16)/self.num_scale
+ if num_hex_str:
+ num_out = int(num_hex_str,16)/self.num_scale
+ self.textBrowser.clear()
+ # 设置字体和颜色
+ char_format = QtGui.QTextCharFormat()
+ char_format.setFont(QtGui.QFont("SimSun", 28)) # 设置字体为 SimSun,字号为 28
+ char_format.setForeground(QtGui.QBrush(QtGui.QColor("red"))) # 设置文字颜色为红色
+ # 创建 QTextCursor 对象
+ cursor = self.textBrowser.textCursor() # 插入带有格式的文本
+ cursor.insertText(str(num_out), char_format)
- self.textBrowser.clear()
-
- # 设置字体和颜色
- char_format = QtGui.QTextCharFormat()
- char_format.setFont(QtGui.QFont("SimSun", 28)) # 设置字体为 SimSun,字号为 28
- char_format.setForeground(QtGui.QBrush(QtGui.QColor("red"))) # 设置文字颜色为红色
- # 创建 QTextCursor 对象
- cursor = self.textBrowser.textCursor() # 插入带有格式的文本
- cursor.insertText(str(num_out), char_format)
except socket.error as e:
#print(f"Socket error: {e}")
pass
@@ -116,6 +123,18 @@ class PyHexQT(QtWidgets.QWidget,Ui_Form):
file.writelines(self.log_buffer)
self.log_buffer.clear()
self.log_count = 0
+
+ def add_line_to_textedit(self, new_line):
+ # 获取当前文本并按行分割
+ current_lines = self.textEdit.toPlainText().splitlines()
+ # 添加新的行到列表中
+ current_lines.append(new_line)
+ # 如果行数超过100,则删除最早的行,直到剩下100行
+ if len(current_lines) > 100:
+ current_lines = current_lines[-100:] # 只保留最新的100行
+ # 将更新后的行列表转换回字符串并设置为textEdit的内容
+ self.textEdit.setPlainText('\n'.join(current_lines))
+
def CheckCfgIniData(self):
if not os.path.exists(self.udp):
@@ -127,6 +146,7 @@ class PyHexQT(QtWidgets.QWidget,Ui_Form):
config.set('NetConfig', 'bytes_length', '4')
config.set('NetConfig', 'num_scale', '1000')
config.set('NetConfig', 'log_time', '1')
+ config.set('NetConfig', 'window_title', 'Hex数据解调工具')
with open(self.udp, 'w', encoding='utf-8') as f:
config.write(f)
diff --git a/PyMaiHak/pyHex.ini b/PyMaiHak/pyHex.ini
index 45ed700..eadfd7e 100644
--- a/PyMaiHak/pyHex.ini
+++ b/PyMaiHak/pyHex.ini
@@ -4,5 +4,6 @@ port = 9000
bytes_start = 3
bytes_length = 4
num_scale = 1000
-log_time= 10
+log_time = 1
+window_title = Hex数据解调工具
diff --git a/PyUartAssistant/PyUart.py b/PyUartAssistant/PyUart.py
index 984e16e..07f13ac 100644
--- a/PyUartAssistant/PyUart.py
+++ b/PyUartAssistant/PyUart.py
@@ -5,7 +5,7 @@ Created on Mon May 27 14:31:38 2024
@author: WANGXIBAO
"""
-import sys
+import sys,os
import serial,re
import serial.tools.list_ports
import time,datetime
@@ -13,28 +13,35 @@ import time,datetime
from PyQt5 import QtWidgets
from PyQt5.Qt import QPainter
from PyQt5.QtWidgets import QMessageBox ,QFileDialog,QInputDialog
-from PyQt5.QtCore import QTimer ,Qt
+from PyQt5.QtCore import QTimer
from PyUartUi import Ui_UartAssistant
-from UartDataPolt import QChartViewPlot,UpdateDataThread,GetDataQX,GetDataTF,GetDataOther
+from UartDataPolt import QChartViewPlot,UpdateDataThread,GetDataTF
from PyQt5.QtChart import QChartView
from PyQt5.QtGui import QIcon
-
+from configparser import ConfigParser
class PyQt5Serial(QtWidgets.QWidget,Ui_UartAssistant):
# %%初始化程序
def __init__(self):
super(PyQt5Serial, self).__init__()
self.setupUi(self)
+ self.quick_num = 99
+ self.IniPath = "PyUart.ini"
+ self.log_time = 10
+ self.log_buffer = {} #定义成一个字典,键--文件名,值--对于收到的字符串列表
+ self.qxCfg=()
+ self.tfCfg=()
+ self.otCfg=()
+ self.current_lines = [] #定义一个空列表,存储待显示数据
+
self.update_data_thread = UpdateDataThread() # 创建更新波形数据线程
- self.get_data_qx = GetDataQX()
- self.get_data_qx.IndOfReturn(0) #根据数据特点给一个初始值
self.get_data_tf = GetDataTF()
self.get_data_tf.IndOfReturn(0) #根据数据特点给一个初始值
- self.get_data_other = GetDataOther()
- self.get_data_other.IndOfReturn(0) #根据数据特点给一个初始值
self.init()
+ self.CheckCfgIniData() #更改按钮的文字
+
self.ser = serial.Serial() #创建一个空对象
self.port_check()
@@ -73,23 +80,14 @@ class PyQt5Serial(QtWidgets.QWidget,Ui_UartAssistant):
#加载快捷指令
self.widget_6.hide()
#加载快捷指令的按键值
-
- for i in range(1, 21): # 假设有20个按钮
- getattr(self, f'pushButtonQuick_{i}').setText(self.get_data_tf.buttons_config[i-1][2])
- getattr(self, f'lineEditQuick_{i}').setText(self.get_data_tf.buttons_config[i-1][1])
-
- # (
- # lambda checked, line_edit=f'lineEditQuick_{i}': self.onPushButtonQuickClicked(line_edit)
- # )
-
-
# 用于暂存接收的串口数据
self.buffer = b''
# 用于暂存解码数据
self.lineUtf8 = ""
# 用于标志是否开始存CSV
- self.CsvFlag = 0
+ self.flag_draw = 0
+ self.double_click_timers = {} # 存储双击定时器
# =============================================================================
# def wheelEvent(self, event):
# if self.plot_view.underMouse:
@@ -122,10 +120,13 @@ class PyQt5Serial(QtWidgets.QWidget,Ui_UartAssistant):
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)
+ 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()
+ self.SetCfgIniData(button_name, set_text)
@@ -158,8 +159,8 @@ class PyQt5Serial(QtWidgets.QWidget,Ui_UartAssistant):
# 加载日志
self.pushButtonLogLoad.clicked.connect(self.openfiles)
- # 跳转链接
- #self.commandLinkButton1.clicked.connect(self.link)
+ # hexRecevie与savCsv的按键关联
+ self.checkBoxHexReceive.stateChanged.connect(self.hex_link_savCsv)
# 清除发送按钮
self.pushButtonClearSend.clicked.connect(self.send_data_clear)
@@ -180,20 +181,28 @@ class PyQt5Serial(QtWidgets.QWidget,Ui_UartAssistant):
# 快捷指令扩展区域
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))
+ # 动态创建控件并存储引用
+ 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))
# %% 串口检测
def port_check(self):
@@ -213,7 +222,7 @@ class PyQt5Serial(QtWidgets.QWidget,Ui_UartAssistant):
def port_open(self):
self.ser.port = self.comboBoxSerial.currentText() # 串口号
self.ser.baudrate = int(self.comboBoxBaudrate.currentText()) # 波特率
- self.ser.timeout = 0.01
+ self.ser.timeout = 0.001
@@ -304,23 +313,26 @@ class PyQt5Serial(QtWidgets.QWidget,Ui_UartAssistant):
if self.checkBoxAddDate.isChecked():
nowTime = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")
nowTime = nowTime[:-3]
- self.textEditReceive.insertPlainText(nowTime + " ")
-
+ #self.textEditReceive.insertPlainText(nowTime + " ")
+ self.add_line_to_textedit(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)
+ #self.textEditReceive.insertPlainText(out_s)
+ self.add_line_to_textedit(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'))
+ #self.textEditReceive.insertPlainText(data.decode('utf-8',errors='replace'))
+ self.add_line_to_textedit(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')
+ #self.textEditReceive.insertPlainText('\r\n')
+ self.add_line_to_textedit('\r\n')
# 获取到text光标
textCursor = self.textEditReceive.textCursor()
@@ -422,7 +434,7 @@ class PyQt5Serial(QtWidgets.QWidget,Ui_UartAssistant):
self.textEditReceive.insertPlainText(out_s)
# ASCII接收显示
else:
- self.textEditReceive.insertPlainText(input_s.decode('utf-8'))
+ self.textEditReceive.insertPlainText(input_s.decode('utf-8',errors='replace'))
# 接收换行
if self.checkBoxCRLF.isChecked():
@@ -483,48 +495,48 @@ class PyQt5Serial(QtWidgets.QWidget,Ui_UartAssistant):
# 注意:每行数据可能不包含结尾的换行符,所以在处理前检查一下
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.checkBoxHexReceive.checkState():
+ lineUtf8 = line.hex()
+ out_s = ' '.join(['{:02X}'.format(b) for b in bytes.fromhex(lineUtf8)])
+ saveData = datetime.datetime.now().strftime("%Y-%m-%dT%H:%M:%S.%f")[:23] +" " +out_s +"\r\n"
+ else:
+ lineUtf8 = line.decode('utf-8',errors='replace')
+ saveData = (time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) + " " + lineUtf8 + "\r\n"
+
+ # 将日志信息添加到缓冲区
+ if self.filename not in self.log_buffer:
+ self.log_buffer[self.filename] = []
+ self.log_buffer[self.filename].append(saveData)
+
+ # 当缓冲区中的记录达到10条时,写入文件
+ if len(self.log_buffer[self.filename]) >= self.log_time:
+ with open(self.filename, mode='a', newline='',encoding='utf-8', errors='replace') as file:
+ file.writelines(self.log_buffer[self.filename])
+ self.log_buffer[self.filename].clear()
+
+
+
#判断选择的何种格式数据
- if self.radioButtonCH4QX.isChecked() and self.lineUtf8[:2]=="A+":
- print(self.lineUtf8)
+ if self.radioButtonCH4QX.isChecked():
+ self.get_data_tf.SetConfig(self.qxCfg)
+ if self.radioButtonCH4TF.isChecked():
+ self.get_data_tf.SetConfig(self.tfCfg)
+ if self.radioButtonOtherData.isChecked():
+ self.get_data_tf.SetConfig(self.otCfg)
- 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
+ print(lineUtf8)
+
+ if self.flag_draw:
- 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)
+ dataSplit = self.get_data_tf.Transdata(lineUtf8)
#print("dataSplit",type(dataSplit))
if isinstance(dataSplit, (float, int)):
self.filenameCsv= self.file + ".csv"
- if self.checkBoxAutoSaveCsv.isChecked() and self.CsvFlag: #写入CSV文件
+ if self.checkBoxAutoSaveCsv.isChecked(): #写入CSV文件
try:
- self.get_data_tf.SaveCsv(self.filenameCsv)
+ self.get_data_tf.SaveCsv(self.filenameCsv,self.log_time)
except:
print("写入CSV失败")
pass
@@ -537,31 +549,7 @@ class PyQt5Serial(QtWidgets.QWidget,Ui_UartAssistant):
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))
+ print("Data split failed, dataSplit type:",type(dataSplit))
except Exception as e:
print(f"Error reading configuration: {e}")
@@ -581,7 +569,25 @@ class PyQt5Serial(QtWidgets.QWidget,Ui_UartAssistant):
self.data_num_received = 0
self.lineEditSendNum.setText(str(self.data_num_received))
-
+ # 关联hex接收与保存csv,hex下不保存csv
+ def hex_link_savCsv(self):
+ if self.checkBoxHexReceive.isChecked():
+ self.checkBoxAutoSaveCsv.setChecked(False)
+ else:
+ self.checkBoxAutoSaveCsv.setChecked(True)
+
+ #设置接受区域显示条数
+ def add_line_to_textedit(self, new_line):
+ # 获取当前文本并按行分割
+ #current_lines = self.textEditReceive.toPlainText().splitlines()
+ # 添加新的行到列表中
+ self.current_lines.append(new_line)
+ # 如果行数超过100,则删除最早的行,直到剩下100行
+ if len(self.current_lines) > 1000:
+ self.current_lines = self.current_lines[-1000:] # 只保留最新的100行
+ # 将更新后的行列表转换回字符串并设置为textEdit的内容
+ self.textEditReceive.setPlainText(''.join(self.current_lines))
+ #self.textEditReceive.setPlainText(self.current_lines)
# 关闭串口
def port_close(self):
try:
@@ -607,6 +613,7 @@ class PyQt5Serial(QtWidgets.QWidget,Ui_UartAssistant):
self.lineEditReceiveNum.setText(str(self.data_num_received))
#self.formGroupBox1.setTitle("串口状态(关闭)")
+ #开始绘图
def btn_start_clicked(self):
#开启按钮
@@ -620,28 +627,18 @@ class PyQt5Serial(QtWidgets.QWidget,Ui_UartAssistant):
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)
+ iterm = self.get_data_tf.rowTitle[1:]
+ print("iterm",iterm)
+ self.comboBoxPlot.addItems(iterm)
+
+ self.update_data_thread.SetPlotItem(0)
self.update_data_thread.restart()
- self.CsvFlag = 1
+ self.flag_draw = 1
-
+ #停止绘图
def btn_stop_clicked(self):
self.update_data_thread.stop()
self.pushButtonStartPlot.setEnabled(True)
@@ -651,22 +648,18 @@ class PyQt5Serial(QtWidgets.QWidget,Ui_UartAssistant):
self.radioButtonOtherData.setEnabled(True)
self.checkBoxAutoSaveCsv.setEnabled(False)
self.comboBoxPlot.clear()
- self.CsvFlag = 0
+ self.flag_draw = 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()
@@ -682,15 +675,110 @@ class PyQt5Serial(QtWidgets.QWidget,Ui_UartAssistant):
if self.checkBox_return.isChecked():
text = text + "\r\n"
self.data_send(text)
-
- def onButtonRightClicked(self, button_id):
- # 弹出一个对话框让用户输入新的按钮名称
- button = getattr(self, button_id)
+
+
+ def CheckCfgIniData(self):
+ if not os.path.exists(self.IniPath):
+ config = ConfigParser()
+ #数据处理正则表达
+ config.add_section('QX_config')
+ config.set('QX_config', 'regular', '\+?-?\d+(?:\.\d+)?')
+ config.set('QX_config', 'headStr', 'A+')
+ config.set('QX_config', 'rowTitle', 'time,Methane,Air Temp,Laser Temp,Laser Intensity')
+
+ config.add_section('TF_config')
+ config.set('TF_config', 'regular', '\+?-?\d+(?:\.\d+)?')
+ config.set('TF_config', 'headStr', 'A+')
+ config.set('TF_config', 'rowTitle', 'time,Methane,Air Temp,Laser Temp,Laser Intensity,amplification,NL,ND,Sinal,SNR,PEAK,Best Piont')
+
+ config.add_section('OtherData_config')
+ config.set('OtherData_config', 'regular', '\+?-?\d+(?:\.\d+)?')
+ # config.set('TF_config', 'regular', '(A\+|B\+|\s)+')
+ config.set('OtherData_config', 'headStr', 'A+')
+ config.set('OtherData_config', 'rowTitle', 'time,DATA1,DATA2')
+
+ #按键配置
+ 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)
+
+ config = ConfigParser()
+ config.read(self.IniPath, encoding='utf-8')
+ try:
+
+ # 创建一个空字典来存储按钮名称和对应的配置
+ self.log_time = int(config.get('Quick_config', 'log_time'))
+ self.qxCfg = (config.get('QX_config','regular'),config.get('QX_config','headStr'),config.get('QX_config','rowTitle'))
+ print('Quick_config:',self.qxCfg)
+ self.tfCfg = (config.get('TF_config','regular'),config.get('TF_config','headStr'),config.get('TF_config','rowTitle'))
+ print('TF_config:',self.tfCfg)
+ self.otCfg = (config.get('OtherData_config','regular'),config.get('OtherData_config','headStr'),config.get('OtherData_config','rowTitle'))
+ print('OtherData_config:',self.otCfg)
+
+ # 循环遍历按钮编号,从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}")
+
+
+ def SetCfgIniData(self,button_name,set_text):
+ config = ConfigParser()
+ config.read(self.IniPath, encoding='utf-8')
+ 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)
-
-
+
#执行
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
diff --git a/PyUartAssistant/PyUartUi.py b/PyUartAssistant/PyUartUi.py
index 4ffd09c..8817eb4 100644
--- a/PyUartAssistant/PyUartUi.py
+++ b/PyUartAssistant/PyUartUi.py
@@ -14,7 +14,7 @@ from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_UartAssistant(object):
def setupUi(self, UartAssistant):
UartAssistant.setObjectName("UartAssistant")
- UartAssistant.resize(996, 694)
+ UartAssistant.resize(999, 694)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(2)
sizePolicy.setVerticalStretch(0)
@@ -430,7 +430,7 @@ class Ui_UartAssistant(object):
self.scrollArea.setWidgetResizable(False)
self.scrollArea.setObjectName("scrollArea")
self.scrollAreaWidgetContents = QtWidgets.QWidget()
- self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 241, 1000))
+ 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))
@@ -446,194 +446,14 @@ class Ui_UartAssistant(object):
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.setGeometry(QtCore.QRect(12, 42, 231, 3000))
self.widget_9.setObjectName("widget_9")
self.layoutWidget2 = QtWidgets.QWidget(self.widget_9)
- self.layoutWidget2.setGeometry(QtCore.QRect(12, 12, 218, 616))
+ self.layoutWidget2.setGeometry(QtCore.QRect(12, 12, 201, 2801))
self.layoutWidget2.setObjectName("layoutWidget2")
self.verticalLayout_8 = QtWidgets.QVBoxLayout(self.layoutWidget2)
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.layoutWidget2)
- self.lineEditQuick_1.setObjectName("lineEditQuick_1")
- self.horizontalLayoutQuick_1.addWidget(self.lineEditQuick_1)
- self.pushButtonQuick_1 = QtWidgets.QPushButton(self.layoutWidget2)
- 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.layoutWidget2)
- self.lineEditQuick_2.setObjectName("lineEditQuick_2")
- self.horizontalLayoutQuick_2.addWidget(self.lineEditQuick_2)
- self.pushButtonQuick_2 = QtWidgets.QPushButton(self.layoutWidget2)
- 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.layoutWidget2)
- self.lineEditQuick_3.setObjectName("lineEditQuick_3")
- self.horizontalLayoutQuick_3.addWidget(self.lineEditQuick_3)
- self.pushButtonQuick_3 = QtWidgets.QPushButton(self.layoutWidget2)
- 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.layoutWidget2)
- self.lineEditQuick_4.setObjectName("lineEditQuick_4")
- self.horizontalLayoutQuick_4.addWidget(self.lineEditQuick_4)
- self.pushButtonQuick_4 = QtWidgets.QPushButton(self.layoutWidget2)
- 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.layoutWidget2)
- self.lineEditQuick_5.setObjectName("lineEditQuick_5")
- self.horizontalLayoutQuick_5.addWidget(self.lineEditQuick_5)
- self.pushButtonQuick_5 = QtWidgets.QPushButton(self.layoutWidget2)
- 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.layoutWidget2)
- self.lineEditQuick_6.setObjectName("lineEditQuick_6")
- self.horizontalLayoutQuick_6.addWidget(self.lineEditQuick_6)
- self.pushButtonQuick_6 = QtWidgets.QPushButton(self.layoutWidget2)
- 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.layoutWidget2)
- self.lineEditQuick_7.setObjectName("lineEditQuick_7")
- self.horizontalLayoutQuick_7.addWidget(self.lineEditQuick_7)
- self.pushButtonQuick_7 = QtWidgets.QPushButton(self.layoutWidget2)
- 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.layoutWidget2)
- self.lineEditQuick_8.setObjectName("lineEditQuick_8")
- self.horizontalLayoutQuick_8.addWidget(self.lineEditQuick_8)
- self.pushButtonQuick_8 = QtWidgets.QPushButton(self.layoutWidget2)
- 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.layoutWidget2)
- self.lineEditQuick_9.setObjectName("lineEditQuick_9")
- self.horizontalLayoutQuick_9.addWidget(self.lineEditQuick_9)
- self.pushButtonQuick_9 = QtWidgets.QPushButton(self.layoutWidget2)
- 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.layoutWidget2)
- self.lineEditQuick_10.setObjectName("lineEditQuick_10")
- self.horizontalLayoutQuick_10.addWidget(self.lineEditQuick_10)
- self.pushButtonQuick_10 = QtWidgets.QPushButton(self.layoutWidget2)
- 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.layoutWidget2)
- self.lineEditQuick_11.setObjectName("lineEditQuick_11")
- self.horizontalLayoutQuick_11.addWidget(self.lineEditQuick_11)
- self.pushButtonQuick_11 = QtWidgets.QPushButton(self.layoutWidget2)
- 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.layoutWidget2)
- self.lineEditQuick_12.setObjectName("lineEditQuick_12")
- self.horizontalLayoutQuick_12.addWidget(self.lineEditQuick_12)
- self.pushButtonQuick_12 = QtWidgets.QPushButton(self.layoutWidget2)
- 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.layoutWidget2)
- self.lineEditQuick_13.setObjectName("lineEditQuick_13")
- self.horizontalLayoutQuick_13.addWidget(self.lineEditQuick_13)
- self.pushButtonQuick_13 = QtWidgets.QPushButton(self.layoutWidget2)
- 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.layoutWidget2)
- self.lineEditQuick_14.setObjectName("lineEditQuick_14")
- self.horizontalLayoutQuick_14.addWidget(self.lineEditQuick_14)
- self.pushButtonQuick_14 = QtWidgets.QPushButton(self.layoutWidget2)
- 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.layoutWidget2)
- self.lineEditQuick_15.setObjectName("lineEditQuick_15")
- self.horizontalLayoutQuick_15.addWidget(self.lineEditQuick_15)
- self.pushButtonQuick_15 = QtWidgets.QPushButton(self.layoutWidget2)
- 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.layoutWidget2)
- self.lineEditQuick_16.setObjectName("lineEditQuick_16")
- self.horizontalLayoutQuick_16.addWidget(self.lineEditQuick_16)
- self.pushButtonQuick_16 = QtWidgets.QPushButton(self.layoutWidget2)
- 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.layoutWidget2)
- self.lineEditQuick_17.setObjectName("lineEditQuick_17")
- self.horizontalLayoutQuick_17.addWidget(self.lineEditQuick_17)
- self.pushButtonQuick_17 = QtWidgets.QPushButton(self.layoutWidget2)
- 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.layoutWidget2)
- self.lineEditQuick_18.setObjectName("lineEditQuick_18")
- self.horizontalLayoutQuick_18.addWidget(self.lineEditQuick_18)
- self.pushButtonQuick_18 = QtWidgets.QPushButton(self.layoutWidget2)
- 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.layoutWidget2)
- self.lineEditQuick_19.setObjectName("lineEditQuick_19")
- self.horizontalLayoutQuick_19.addWidget(self.lineEditQuick_19)
- self.pushButtonQuick_19 = QtWidgets.QPushButton(self.layoutWidget2)
- 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.layoutWidget2)
- self.lineEditQuick_20.setObjectName("lineEditQuick_20")
- self.horizontalLayoutQuick_20.addWidget(self.lineEditQuick_20)
- self.pushButtonQuick_20 = QtWidgets.QPushButton(self.layoutWidget2)
- 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)
@@ -719,25 +539,5 @@ class Ui_UartAssistant(object):
self.label_SendNum_4.setText(_translate("UartAssistant", "窗口标准差"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _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"))
+ self.checkBox_return.setText(_translate("UartAssistant", "添加\"\\r\\n\""))
from PyQt5.QtChart import QChartView
diff --git a/PyUartAssistant/PyUartUi.ui b/PyUartAssistant/PyUartUi.ui
index 81a13a1..399a932 100644
--- a/PyUartAssistant/PyUartUi.ui
+++ b/PyUartAssistant/PyUartUi.ui
@@ -6,7 +6,7 @@
0
0
- 996
+ 999
694
@@ -670,7 +670,7 @@
false
- 1
+ 0
@@ -1049,7 +1049,7 @@
0
0
241
- 1000
+ 3000
@@ -1072,7 +1072,7 @@
-
- 添加"回车换行"
+ 添加"\r\n"
true
@@ -1086,8 +1086,8 @@
12
42
- 236
- 1000
+ 231
+ 3000
@@ -1095,292 +1095,11 @@
12
12
- 218
- 616
+ 201
+ 2801
-
-
-
-
-
-
-
-
- -
-
-
- Button01
-
-
-
-
-
- -
-
-
-
-
-
- -
-
-
- Button02
-
-
-
-
-
- -
-
-
-
-
-
- -
-
-
- Button03
-
-
-
-
-
- -
-
-
-
-
-
- -
-
-
- Button04
-
-
-
-
-
- -
-
-
-
-
-
- -
-
-
- Button05
-
-
-
-
-
- -
-
-
-
-
-
- -
-
-
- Button06
-
-
-
-
-
- -
-
-
-
-
-
- -
-
-
- Button07
-
-
-
-
-
- -
-
-
-
-
-
- -
-
-
- Button08
-
-
-
-
-
- -
-
-
-
-
-
- -
-
-
- Button09
-
-
-
-
-
- -
-
-
-
-
-
- -
-
-
- Button10
-
-
-
-
-
- -
-
-
-
-
-
- -
-
-
- Button11
-
-
-
-
-
- -
-
-
-
-
-
- -
-
-
- Button12
-
-
-
-
-
- -
-
-
-
-
-
- -
-
-
- Button13
-
-
-
-
-
- -
-
-
-
-
-
- -
-
-
- Button14
-
-
-
-
-
- -
-
-
-
-
-
- -
-
-
- Button15
-
-
-
-
-
- -
-
-
-
-
-
- -
-
-
- Button16
-
-
-
-
-
- -
-
-
-
-
-
- -
-
-
- Button17
-
-
-
-
-
- -
-
-
-
-
-
- -
-
-
- Button18
-
-
-
-
-
- -
-
-
-
-
-
- -
-
-
- Button19
-
-
-
-
-
- -
-
-
-
-
-
- -
-
-
- Button20
-
-
-
-
-
-
+
diff --git a/PyUartAssistant/UartDataPolt.py b/PyUartAssistant/UartDataPolt.py
index 03e8b85..8444fbd 100644
--- a/PyUartAssistant/UartDataPolt.py
+++ b/PyUartAssistant/UartDataPolt.py
@@ -9,13 +9,13 @@ Created on Tue May 28 15:40:48 2024
import time,math,os
-import re,csv,datetime
+import re,csv
from PyQt5.QtCore import QThread, pyqtSignal,Qt
from PyQt5.QtWidgets import QMessageBox
from PyQt5.QtChart import QChart, QValueAxis, QSplineSeries,QLineSeries
from PyQt5.QtGui import QPen
-from configparser import ConfigParser
+
# 波形显示
class QChartViewPlot(QChart):
@@ -112,7 +112,6 @@ class UpdateDataThread(QThread):
super(UpdateDataThread, self).__init__(parent)
self.is_exit = False
self.x_range = 1024
- self.getDateQx = GetDataQX()
self.flag = 0
@@ -169,264 +168,57 @@ class UpdateDataThread(QThread):
-class GetDataQX(): #读取请芯数据
- def __init__(self, parent=None):
- super().__init__()
- self.indOfReturn =0
- self.regexQx = re.compile(r'(A\+|B\+|\s)+') # 编译正则表达式
- self.TIME_FORMAT = "%Y-%m-%d %H:%M:%S"
- def Transdata(self,data):
- parts = re.split(self.regexQx,data)
- # 过滤掉空字符串
- parts = [part for part in parts if part]
- #print(parts)
- methane = float(parts[1])
- airTemp = float(parts[3])
- laserTemp = float( parts[5])/1
- laerIntensity = float(parts[7])*10
- timeCrvt=time.strftime(self.TIME_FORMAT, time.localtime())
- self.data2csv =[(timeCrvt,methane,airTemp,laserTemp,laerIntensity)]
- #print(self.data2csv)
-
- if self.indOfReturn == 0:
- returnData = methane
- elif self.indOfReturn == 1:
- returnData = airTemp
- elif self.indOfReturn == 2:
- returnData = laserTemp
- elif self.indOfReturn == 3:
- returnData = laerIntensity
- print(returnData)
- return returnData
-
- def SaveCsv(self,filenameCsv):
- # 打开一个文件用于写入,如果文件不存在则创建
- if os.path.isfile(filenameCsv) == 0:
- # 文件为空,需要写入表头
- with open(filenameCsv, mode='w', newline='') as file:
- writer = csv.writer(file)
- writer.writerow(('time', 'Methane', 'Air Temp', 'Laser Temp', 'Laser Intensity'))
- else:
- with open(filenameCsv, mode='a', newline='') as file:
- # 创建一个写入器对象
- writer = csv.writer(file)
- # 写入数据行
- writer.writerows(self.data2csv)
-
- def IndOfReturn(self,ind):
- self.indOfReturn = ind
-
-
-
-
class GetDataTF(): #读取费加罗或者自定义数据
def __init__(self, parent=None):
super().__init__()
self.indOfReturn =0
- #self.regex = re.compile(r'(A\+|B\+|\s)+') # 编译正则表达式
self.TIME_FORMAT = "%Y-%m-%d %H:%M:%S"
- self.regularIniPath = "regular.ini" # 配置文件默认路径
self.headStr = ""
self.rowTitle=[]
- self.buttons_config = [[None for _ in range(3)] for _ in range(20)]
- #存放快捷按键配置
- self.CheckCfgIniData() # 初始化配置文件
+ 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:
- # parts = re.split(self.regex,data)
- # # 过滤掉空字符串
- # parts = [part for part in parts if part]
- #print(parts)
- # methane = float(parts[1])
- # airTemp = float(parts[3])
- # laserTemp = float( parts[5])/1
- # laerIntensity = float(parts[7])*10
-
- # self.data2csv =[(timeCrvt,methane,airTemp,laserTemp,laerIntensity)]
-
self.data2csv = self.regex.findall(data)
- #print(self.data2csv)
-
- # if self.indOfReturn == 0:
- # returnData = methane
- # elif self.indOfReturn == 1:
- # returnData = airTemp
- # elif self.indOfReturn == 2:
- # returnData = laserTemp
- # elif self.indOfReturn == 3:
- # returnData = laerIntensity
returnData = float(self.data2csv[self.indOfReturn])
print("returnData",returnData)
return returnData
else:
return "noNum"
- def SaveCsv(self,filenameCsv):
+ 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(('time', 'Methane', 'Air Temp', 'Laser Temp', 'Laser Intensity'))
-
writer.writerow(self.rowTitle)
else:
- with open(filenameCsv, mode='a', newline='') as file:
- # 创建一个写入器对象
- writer = csv.writer(file)
- # 写入数据行
- timeCrvt=time.strftime(self.TIME_FORMAT, time.localtime())
- self.data2csv.insert(0, timeCrvt)
- print(self.data2csv)
- writer.writerows([self.data2csv])
-
+ 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
- def CheckCfgIniData(self):
- if not os.path.exists(self.regularIniPath):
- config = ConfigParser()
- config.add_section('TF_config')
- config.set('TF_config', 'regular', '\+?-?\d+(?:\.\d+)?')
- #config.set('TF_config', 'regular', '(A\+|B\+|\s)+')
- config.set('TF_config', 'headStr', 'A+')
- config.set('TF_config', 'rowTitle', 'time,Methane,Air Temp,Laser Temp,Laser Intensity,amplification,NL,ND,Sinal,SNR,PEAK,Best Piont')
-
- config.add_section('Quick_config')
- config.set('Quick_config', 'Button00', 'write 0,2024100101|序列号')
- config.set('Quick_config', 'Button01', 'write 1,65000|激光温度')
- config.set('Quick_config', 'Button02', 'write 2,1000|K*1000')
- config.set('Quick_config', 'Button03', 'write 3,0|B*1000')
- config.set('Quick_config', 'Button04', 'write 4,0|可调电阻')
- config.set('Quick_config', 'Button05', 'write 5,30|电阻抽头')
- config.set('Quick_config', 'Button06', 'write 6,0|输出温度')
- config.set('Quick_config', 'Button07', 'write 7,0|输出激光')
- config.set('Quick_config', 'Button08', 'write 8,1|输出状态')
- config.set('Quick_config', 'Button09', 'write 9,0|激光温补')
- config.set('Quick_config', 'Button10', 'write 10,100|噪声长度')
- config.set('Quick_config', 'Button11', 'write 11,600|扫描长度')
- config.set('Quick_config', 'Button12', '')
- config.set('Quick_config', 'Button13', 'write 13,30500|气温校准')
- config.set('Quick_config', 'Button14', 'write 14,1|滑动开关')
- config.set('Quick_config', 'Button15', 'write 15,10|滑动标准差')
- config.set('Quick_config', 'Button16', 'write 16,1|浓度温补')
- config.set('Quick_config', 'Button17', '')
- config.set('Quick_config', 'Button18', '')
- config.set('Quick_config', 'Button19', '')
- with open(self.regularIniPath, 'w' ,encoding='utf-8') as f:
- config.write(f)
-
- config = ConfigParser()
- config.read(self.regularIniPath, encoding='utf-8')
- try:
- self.headStr = config.get('TF_config', 'headStr')
- self.regex = re.compile(config.get('TF_config', 'regular'))
- self.rowTitleStr = config.get('TF_config', 'rowTitle')
-
- self.rowTitle = self.rowTitleStr.split(',')
- print(type(self.rowTitle))
- print(f"Configuration read successfully: {self.headStr}, {self.regex}, {self.rowTitle}")
-
- # 创建一个空字典来存储按钮名称和对应的配置
-
-
- # 循环遍历按钮编号,从0到19
- for i in range(20):
- button_name = f'Button{i:02}' # 格式化按钮名称,确保两位数
- # 使用 get 方法安全地获取配置,如果不存在则返回空字符串
- config_value = config.get('Quick_config', button_name, fallback='')
- config_value_split = config_value.split('|')
- # 将按钮名称和配置信息存储在字典中
- self.buttons_config[i][0] = button_name
- if len(config_value_split) == 2:
- self.buttons_config[i][1] = config_value_split[0]
- self.buttons_config[i][2] = config_value_split[1]
-
- # 打印字典查看结果
- for i in range(20):
- print(f'{self.buttons_config[i][0]}: {self.buttons_config[i][1]}|{self.buttons_config[i][2]}')
-
- except Exception as e:
- print(f"Error reading configuration: {e}")
-
- def SetCfgIniData(self,button_name,set_text):
- config = ConfigParser()
- config.read(self.regularIniPath, encoding='utf-8')
- config.set('Quick_config', button_name, set_text)
- with open(self.regularIniPath, 'w' ,encoding='utf-8') as f:
- config.write(f)
-
-
-class GetDataOther(): #读取费加罗或者自定义数据
- def __init__(self, parent=None):
- super().__init__()
- self.indOfReturn =0
- #self.regex = re.compile(r'(A\+|B\+|\s)+') # 编译正则表达式
- self.TIME_FORMAT = "%Y-%m-%d %H:%M:%S"
- self.OtherIniPath = "OtherData.ini" # 配置文件默认路径
- self.headStr = ""
- self.rowTitle=[]
- self.CheckCfgIniData() # 初始化配置文件
- 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):
- # 打开一个文件用于写入,如果文件不存在则创建
- if os.path.isfile(filenameCsv) == 0:
- # 文件为空,需要写入表头
-
- with open(filenameCsv, mode='w', newline='') as file:
- writer = csv.writer(file)
- #writer.writerow(('time', 'Methane', 'Air Temp', 'Laser Temp', 'Laser Intensity'))
-
- writer.writerow(self.rowTitle)
- else:
- with open(filenameCsv, mode='a', newline='') as file:
- # 创建一个写入器对象
- writer = csv.writer(file)
- # 写入数据行
- timeCrvt=time.strftime(self.TIME_FORMAT, time.localtime())
- self.data2csv.insert(0, timeCrvt)
- print(self.data2csv)
- writer.writerows([self.data2csv])
-
- def IndOfReturn(self,ind):
- self.indOfReturn = ind
-
- def CheckCfgIniData(self):
- if not os.path.exists(self.OtherIniPath):
- config = ConfigParser()
- config.add_section('OtherData_config')
- config.set('OtherData_config', 'regular', '\+?-?\d+(?:\.\d+)?')
- # config.set('TF_config', 'regular', '(A\+|B\+|\s)+')
- config.set('OtherData_config', 'headStr', 'A+')
- config.set('OtherData_config', 'rowTitle', 'time,DATA1,DATA2')
-
- with open(self.OtherIniPath, 'w') as f:
- config.write(f)
-
- config = ConfigParser()
- config.read(self.OtherIniPath, encoding='utf-8')
- try:
- self.headStr = config.get('OtherData_config', 'headStr')
- self.regex = re.compile(config.get('OtherData_config', 'regular'))
- self.rowTitleStr = config.get('OtherData_config', 'rowTitle')
- self.rowTitle = self.rowTitleStr.split(',')
- print(type(self.rowTitle))
- print(f"Configuration read successfully: {self.headStr}, {self.regex}, {self.rowTitle}")
- except Exception as e:
- print(f"Error reading configuration: {e}")