修复bug
This commit is contained in:
43
scomm.py
43
scomm.py
@@ -229,6 +229,23 @@ class UIProcessor:
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"显示消息时出错: {e}")
|
logger.error(f"显示消息时出错: {e}")
|
||||||
|
|
||||||
|
def save_current_config(self):
|
||||||
|
"""保存当前配置"""
|
||||||
|
try:
|
||||||
|
# 保存所有相关配置
|
||||||
|
configs_to_save = [
|
||||||
|
'entry-split', 'entry-cycle', 'entry-baud',
|
||||||
|
'entry-encoding', 'entry-uservar'
|
||||||
|
]
|
||||||
|
|
||||||
|
for config_key in configs_to_save:
|
||||||
|
self.save_config(config_key)
|
||||||
|
|
||||||
|
logger.info("当前配置已保存")
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"保存当前配置时出错: {e}")
|
||||||
|
|
||||||
def serial_open(self):
|
def serial_open(self):
|
||||||
"""串口打开时的UI更新"""
|
"""串口打开时的UI更新"""
|
||||||
self.entry_baud.configure(state='disabled')
|
self.entry_baud.configure(state='disabled')
|
||||||
@@ -382,7 +399,7 @@ class SerialCommunicator:
|
|||||||
# 打开串口
|
# 打开串口
|
||||||
if self._open_serial():
|
if self._open_serial():
|
||||||
self._start_communication()
|
self._start_communication()
|
||||||
self._save_current_config()
|
self.ui.save_current_config()
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"串口操作出错: {e}")
|
logger.error(f"串口操作出错: {e}")
|
||||||
self.ui.log(f'串口操作失败: {e}')
|
self.ui.log(f'串口操作失败: {e}')
|
||||||
@@ -442,19 +459,33 @@ class SerialCommunicator:
|
|||||||
def _receive_loop(self):
|
def _receive_loop(self):
|
||||||
"""接收数据循环"""
|
"""接收数据循环"""
|
||||||
buffer = b''
|
buffer = b''
|
||||||
|
last_data_time = time.time() # 记录最后接收数据的时间
|
||||||
|
|
||||||
while self.running.is_set():
|
while self.running.is_set():
|
||||||
try:
|
try:
|
||||||
if self.com.is_open:
|
if self.com.is_open:
|
||||||
|
# 使用带超时的读取,避免阻塞
|
||||||
data = self.com.read(self.com.in_waiting or 1)
|
data = self.com.read(self.com.in_waiting or 1)
|
||||||
if data:
|
if data:
|
||||||
buffer += data
|
buffer += data
|
||||||
self.recv_count += len(data)
|
self.recv_count += len(data)
|
||||||
|
last_data_time = time.time() # 更新最后接收时间
|
||||||
|
|
||||||
# 处理完整的数据包
|
# 检查是否需要分帧
|
||||||
if buffer:
|
current_time = time.time()
|
||||||
self.ui.dmesg('recv', buffer)
|
time_since_last_data = (current_time - last_data_time) * 1000 # 转换为毫秒
|
||||||
self.ui.log(f'{self.com.port}: 接收 {len(buffer)} 字节')
|
|
||||||
buffer = b''
|
# 获取分帧间隔设置
|
||||||
|
try:
|
||||||
|
split_interval = float(self.ui.entry_split.var.get().replace('ms', ''))
|
||||||
|
except ValueError:
|
||||||
|
split_interval = 100 # 默认100ms
|
||||||
|
|
||||||
|
# 如果缓冲区有数据且超过分帧间隔,或者缓冲区数据量很大
|
||||||
|
if buffer and (time_since_last_data >= split_interval or len(buffer) > 1024):
|
||||||
|
self.ui.dmesg('recv', buffer)
|
||||||
|
self.ui.log(f'{self.com.port}: 接收 {len(buffer)} 字节')
|
||||||
|
buffer = b'' # 清空缓冲区
|
||||||
|
|
||||||
# 使用 Event.wait 代替 sleep,可以及时响应停止事件
|
# 使用 Event.wait 代替 sleep,可以及时响应停止事件
|
||||||
self.running.wait(0.01) # 等待10ms或直到running被清除
|
self.running.wait(0.01) # 等待10ms或直到running被清除
|
||||||
|
|||||||
Reference in New Issue
Block a user