增加通过ini配置 头和 正则表达
This commit is contained in:
parent
88ed558663
commit
33506c78bb
2
.gitignore
vendored
2
.gitignore
vendored
@ -160,3 +160,5 @@ cython_debug/
|
||||
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
|
||||
#.idea/
|
||||
|
||||
*.txt
|
||||
*.csv
|
5
OtherData.ini
Normal file
5
OtherData.ini
Normal file
@ -0,0 +1,5 @@
|
||||
[OtherData_config]
|
||||
regular = \+?-?\d+(?:\.\d+)?
|
||||
headstr = A+
|
||||
rowtitle = time,DATA1,DATA2
|
||||
|
5
PyUartAssistant/OtherData.ini
Normal file
5
PyUartAssistant/OtherData.ini
Normal file
@ -0,0 +1,5 @@
|
||||
[OtherData_config]
|
||||
regular = \+?-?\d+(?:\.\d+)?
|
||||
headstr = A+
|
||||
rowtitle = time,DATA1,DATA2
|
||||
|
Binary file not shown.
@ -6,7 +6,7 @@ Created on Mon May 27 14:31:38 2024
|
||||
"""
|
||||
|
||||
import sys
|
||||
import serial,csv
|
||||
import serial
|
||||
import serial.tools.list_ports
|
||||
import time,datetime
|
||||
|
||||
@ -15,10 +15,11 @@ from PyQt5.Qt import QPainter
|
||||
from PyQt5.QtWidgets import QMessageBox ,QFileDialog
|
||||
from PyQt5.QtCore import QTimer
|
||||
from PyUartUi import Ui_UartAssistant
|
||||
from UartDataPolt import QChartViewPlot,UpdateDataThread,GetDataQX
|
||||
from UartDataPolt import QChartViewPlot,UpdateDataThread,GetDataQX,GetDataTF,GetDataOther
|
||||
from PyQt5.QtChart import QChartView
|
||||
from PyQt5.QtGui import QIcon
|
||||
|
||||
|
||||
class PyQt5Serial(QtWidgets.QWidget,Ui_UartAssistant):
|
||||
# %%初始化程序
|
||||
def __init__(self):
|
||||
@ -27,13 +28,18 @@ class PyQt5Serial(QtWidgets.QWidget,Ui_UartAssistant):
|
||||
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.ser = serial.Serial() #创建一个空对象
|
||||
self.port_check()
|
||||
|
||||
# 设置Logo和标题
|
||||
self.setWindowIcon(QIcon('D:/workspace/py/PyUartAssistant/favicon.png'))
|
||||
self.setWindowIcon(QIcon('./favicon.ico'))
|
||||
self.setWindowTitle("调试助手")
|
||||
# 设置禁止拉伸窗口大小
|
||||
self.setFixedSize(self.width(), self.height())
|
||||
@ -65,7 +71,11 @@ class PyQt5Serial(QtWidgets.QWidget,Ui_UartAssistant):
|
||||
|
||||
# 用于暂存接收的串口数据
|
||||
self.buffer = b''
|
||||
# =============================================================================
|
||||
# 用于暂存解码数据
|
||||
self.lineUtf8 = ""
|
||||
# 用于标志是否开始存CSV
|
||||
self.CsvFlag = 0
|
||||
# =============================================================================
|
||||
# def wheelEvent(self, event):
|
||||
# if self.plot_view.underMouse:
|
||||
# # 鼠标滚轮:缩放Qchart波形
|
||||
@ -276,49 +286,11 @@ class PyQt5Serial(QtWidgets.QWidget,Ui_UartAssistant):
|
||||
self.data_num_received += num
|
||||
self.lineEditReceiveNum.setText(str(self.data_num_received))
|
||||
|
||||
try:
|
||||
lines = self.buffer.split(b'\n') # 或者使用 b'\r\n' 根据你的需要
|
||||
# 最后一个元素可能不包含完整的行,所以将其保留作为新的缓存
|
||||
self.buffer = lines.pop()
|
||||
# 自动保存日志
|
||||
if self.checkBoxAutoSaveLog.isChecked():
|
||||
self.AutoSaveLog()
|
||||
|
||||
# 处理每一行数据
|
||||
for line in lines:
|
||||
# 注意:每行数据可能不包含结尾的换行符,所以在处理前检查一下
|
||||
if line.endswith(b'\r'):
|
||||
line = line[:-1] # 移除回车
|
||||
# 写入当前日期的文件,打开文件,如果文件不存在则创建,如果存在则追加内容
|
||||
if self.checkBoxAutoSaveLog.isChecked():
|
||||
with open(self.filename, 'a', encoding='utf-8',newline='') as file:
|
||||
#print (data.decode('utf-8'))
|
||||
lineUtf8 = line.decode('utf-8')
|
||||
|
||||
saveData = (time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) + " " + lineUtf8 + "\r\n"
|
||||
#print("saveData:",saveData)
|
||||
file.write(saveData) # 写入内容
|
||||
|
||||
if lineUtf8[:2]=="A+":
|
||||
print(lineUtf8)
|
||||
|
||||
dataSplit = self.get_data_qx.Transdata(lineUtf8)
|
||||
self.filenameCsv= self.file + ".csv"
|
||||
if self.checkBoxAutoSaveCsv.isChecked(): #写入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"))
|
||||
except:
|
||||
print("预处理数据有问题")
|
||||
pass
|
||||
|
||||
except:
|
||||
QMessageBox.critical(self, '串口异常', '串口接收数据异常,请重新连接设备!')
|
||||
@ -398,7 +370,6 @@ class PyQt5Serial(QtWidgets.QWidget,Ui_UartAssistant):
|
||||
self.data_num_sended += num
|
||||
self.lineEditSendNum.setText(str(self.data_num_sended))
|
||||
|
||||
|
||||
else:
|
||||
pass
|
||||
|
||||
@ -429,6 +400,105 @@ class PyQt5Serial(QtWidgets.QWidget,Ui_UartAssistant):
|
||||
#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("")
|
||||
|
||||
@ -477,16 +547,27 @@ class PyQt5Serial(QtWidgets.QWidget,Ui_UartAssistant):
|
||||
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.comboBoxPlot.addItems(["甲烷浓度","环境温度","激光器温度","激光强度"])
|
||||
self.comboBoxPlot.setCurrentText("甲烷浓度")
|
||||
#self.update_data_thread.SetPlotItem(0)
|
||||
self.get_data_qx.IndOfReturn(0)
|
||||
|
||||
self.update_data_thread.restart()
|
||||
|
||||
|
||||
self.CsvFlag = 1
|
||||
|
||||
|
||||
|
||||
@ -497,8 +578,10 @@ class PyQt5Serial(QtWidgets.QWidget,Ui_UartAssistant):
|
||||
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):
|
||||
# 线程回调函数
|
||||
@ -512,6 +595,8 @@ class PyQt5Serial(QtWidgets.QWidget,Ui_UartAssistant):
|
||||
#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()
|
||||
|
@ -15,6 +15,9 @@ class Ui_UartAssistant(object):
|
||||
def setupUi(self, UartAssistant):
|
||||
UartAssistant.setObjectName("UartAssistant")
|
||||
UartAssistant.resize(1121, 714)
|
||||
icon = QtGui.QIcon()
|
||||
icon.addPixmap(QtGui.QPixmap("favicon.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
|
||||
UartAssistant.setWindowIcon(icon)
|
||||
self.groupBox = QtWidgets.QGroupBox(UartAssistant)
|
||||
self.groupBox.setGeometry(QtCore.QRect(30, 20, 241, 281))
|
||||
self.groupBox.setObjectName("groupBox")
|
||||
@ -236,10 +239,11 @@ class Ui_UartAssistant(object):
|
||||
self.radioButtonCH4QX.setToolTipDuration(1)
|
||||
self.radioButtonCH4QX.setStatusTip("")
|
||||
self.radioButtonCH4QX.setAutoFillBackground(False)
|
||||
self.radioButtonCH4QX.setChecked(True)
|
||||
self.radioButtonCH4QX.setChecked(False)
|
||||
self.radioButtonCH4QX.setObjectName("radioButtonCH4QX")
|
||||
self.radioButtonCH4TF = QtWidgets.QRadioButton(self.tab_2)
|
||||
self.radioButtonCH4TF.setGeometry(QtCore.QRect(250, 10, 51, 16))
|
||||
self.radioButtonCH4TF.setChecked(True)
|
||||
self.radioButtonCH4TF.setObjectName("radioButtonCH4TF")
|
||||
self.pushButtonStartPlot = QtWidgets.QPushButton(self.tab_2)
|
||||
self.pushButtonStartPlot.setGeometry(QtCore.QRect(60, 10, 75, 23))
|
||||
@ -251,7 +255,7 @@ class Ui_UartAssistant(object):
|
||||
self.comboBoxPlot.setGeometry(QtCore.QRect(180, 40, 191, 22))
|
||||
self.comboBoxPlot.setObjectName("comboBoxPlot")
|
||||
self.checkBoxAutoSaveCsv = QtWidgets.QCheckBox(self.tab_2)
|
||||
self.checkBoxAutoSaveCsv.setGeometry(QtCore.QRect(400, 10, 121, 16))
|
||||
self.checkBoxAutoSaveCsv.setGeometry(QtCore.QRect(460, 10, 121, 16))
|
||||
self.checkBoxAutoSaveCsv.setChecked(True)
|
||||
self.checkBoxAutoSaveCsv.setObjectName("checkBoxAutoSaveCsv")
|
||||
self.layoutWidget4 = QtWidgets.QWidget(self.tab_2)
|
||||
@ -290,6 +294,10 @@ class Ui_UartAssistant(object):
|
||||
self.pushButtonResetPlot = QtWidgets.QPushButton(self.tab_2)
|
||||
self.pushButtonResetPlot.setGeometry(QtCore.QRect(70, 620, 61, 23))
|
||||
self.pushButtonResetPlot.setObjectName("pushButtonResetPlot")
|
||||
self.radioButtonOtherData = QtWidgets.QRadioButton(self.tab_2)
|
||||
self.radioButtonOtherData.setGeometry(QtCore.QRect(310, 10, 71, 16))
|
||||
self.radioButtonOtherData.setChecked(False)
|
||||
self.radioButtonOtherData.setObjectName("radioButtonOtherData")
|
||||
self.tabWidget.addTab(self.tab_2, "")
|
||||
self.tabWidget.raise_()
|
||||
self.groupBox.raise_()
|
||||
@ -377,5 +385,6 @@ class Ui_UartAssistant(object):
|
||||
self.label_SendNum_3.setText(_translate("UartAssistant", "窗口均值"))
|
||||
self.label_SendNum_4.setText(_translate("UartAssistant", "窗口标准差"))
|
||||
self.pushButtonResetPlot.setText(_translate("UartAssistant", "重置图形"))
|
||||
self.radioButtonOtherData.setText(_translate("UartAssistant", "其他数据"))
|
||||
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("UartAssistant", "曲线绘制"))
|
||||
from PyQt5.QtChart import QChartView
|
||||
|
@ -13,6 +13,10 @@
|
||||
<property name="windowTitle">
|
||||
<string>串口助手py版</string>
|
||||
</property>
|
||||
<property name="windowIcon">
|
||||
<iconset>
|
||||
<normaloff>favicon.ico</normaloff>favicon.ico</iconset>
|
||||
</property>
|
||||
<widget class="QGroupBox" name="groupBox">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
@ -712,7 +716,7 @@
|
||||
<string>CH4QX</string>
|
||||
</property>
|
||||
<property name="checked">
|
||||
<bool>true</bool>
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="QRadioButton" name="radioButtonCH4TF">
|
||||
@ -727,6 +731,9 @@
|
||||
<property name="text">
|
||||
<string>CH4TF</string>
|
||||
</property>
|
||||
<property name="checked">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="QPushButton" name="pushButtonStartPlot">
|
||||
<property name="geometry">
|
||||
@ -767,7 +774,7 @@
|
||||
<widget class="QCheckBox" name="checkBoxAutoSaveCsv">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>400</x>
|
||||
<x>460</x>
|
||||
<y>10</y>
|
||||
<width>121</width>
|
||||
<height>16</height>
|
||||
@ -847,6 +854,22 @@
|
||||
<string>重置图形</string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="QRadioButton" name="radioButtonOtherData">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>310</x>
|
||||
<y>10</y>
|
||||
<width>71</width>
|
||||
<height>16</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>其他数据</string>
|
||||
</property>
|
||||
<property name="checked">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</widget>
|
||||
</widget>
|
||||
<zorder>tabWidget</zorder>
|
||||
|
@ -11,12 +11,11 @@ Created on Tue May 28 15:40:48 2024
|
||||
import time,math,os
|
||||
import re,csv,datetime
|
||||
|
||||
import sys
|
||||
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):
|
||||
@ -134,7 +133,7 @@ class UpdateDataThread(QThread):
|
||||
|
||||
#data = self.setReceiveData
|
||||
#print("发数",datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f"))
|
||||
#print("data receive ",data)
|
||||
print("data receive ",self.setReceiveData)
|
||||
# print(f"{data:.3f}")
|
||||
try:
|
||||
|
||||
@ -173,10 +172,11 @@ class UpdateDataThread(QThread):
|
||||
class GetDataQX(): #读取请芯数据
|
||||
def __init__(self, parent=None):
|
||||
super().__init__()
|
||||
self.regex = re.compile(r'(A\+|B\+|\s)+') # 编译正则表达式
|
||||
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.regex,data)
|
||||
parts = re.split(self.regexQx,data)
|
||||
# 过滤掉空字符串
|
||||
parts = [part for part in parts if part]
|
||||
#print(parts)
|
||||
@ -216,3 +216,168 @@ class GetDataQX(): #读取请芯数据
|
||||
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.CheckCfgIniData() # 初始化配置文件
|
||||
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):
|
||||
# 打开一个文件用于写入,如果文件不存在则创建
|
||||
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.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')
|
||||
|
||||
|
||||
with open(self.regularIniPath, 'w') 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}")
|
||||
except Exception as e:
|
||||
print(f"Error reading configuration: {e}")
|
||||
|
||||
|
||||
|
||||
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}")
|
||||
|
Binary file not shown.
Before Width: | Height: | Size: 1.4 KiB |
5
PyUartAssistant/regular.ini
Normal file
5
PyUartAssistant/regular.ini
Normal file
@ -0,0 +1,5 @@
|
||||
[TF_config]
|
||||
regular = \+?-?\d+(?:\.\d+)?
|
||||
headstr = A+
|
||||
rowtitle = time,Methane,Air Temp,Laser Temp,Laser Intensity,amplification,NL,ND,Sinal,SNR,PEAK,Best Piont
|
||||
|
38
PyUartAssistant/未命名0.py
Normal file
38
PyUartAssistant/未命名0.py
Normal file
@ -0,0 +1,38 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
Created on Thu Jul 11 10:17:34 2024
|
||||
|
||||
@author: WANGXIBAO
|
||||
"""
|
||||
|
||||
import re,os,csv
|
||||
|
||||
data = "A+000.00 +31.5 0057.92 +00.442 B+010 NL00.195 ND00.000 S00.313 SNR 02.04 P168 B250 1A"
|
||||
regex = re.compile(r'\+?-?\d+(?:\.\d+)?') # 编译正则表达式
|
||||
parts = re.split(regex,data)
|
||||
parts2 = [part for part in parts if part]
|
||||
|
||||
|
||||
|
||||
# 使用 findall 方法找到所有匹配的数字
|
||||
numbers = regex.findall(data)
|
||||
|
||||
# 输出结果
|
||||
print(numbers)
|
||||
|
||||
filenameCsv = "TTTTTTTTTTTTtest.csv"
|
||||
if os.path.isfile(filenameCsv) == 0:
|
||||
# 文件为空,需要写入表头
|
||||
|
||||
with open(filenameCsv, mode='w', newline='') as file:
|
||||
writer = csv.writer(file)
|
||||
steee = "'time', 'Methane', 'Air Temp', 'Laser Temp', 'Laser Intensity'"
|
||||
stlist = steee.split(',')
|
||||
writer.writerow(stlist)
|
||||
#writer.writerow(self.rowTitle)
|
||||
else:
|
||||
with open(filenameCsv, mode='a', newline='') as file:
|
||||
# 创建一个写入器对象
|
||||
writer = csv.writer(file)
|
||||
# 写入数据行
|
||||
writer.writerows([numbers])
|
10
PyUartAssistant/未命名1.py
Normal file
10
PyUartAssistant/未命名1.py
Normal file
@ -0,0 +1,10 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
Created on Thu Jul 11 13:36:48 2024
|
||||
|
||||
@author: WANGXIBAO
|
||||
"""
|
||||
|
||||
my_list = ['1',' 2', '3',' 4',' 5']
|
||||
my_list.pop(0) # 移除第一个元素
|
||||
print(my_list) # 输出: [2, 3, 4, 5]
|
5
regular.ini
Normal file
5
regular.ini
Normal file
@ -0,0 +1,5 @@
|
||||
[TF_config]
|
||||
regular = (A\+|B\+|\s)+
|
||||
headstr = A+
|
||||
rowtitle = time,Methane,Air Temp,Laser Temp,Laser Intensity
|
||||
|
Loading…
x
Reference in New Issue
Block a user