修复bug
This commit is contained in:
43
scomm.py
43
scomm.py
@@ -229,6 +229,23 @@ class UIProcessor:
|
||||
except Exception as 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):
|
||||
"""串口打开时的UI更新"""
|
||||
self.entry_baud.configure(state='disabled')
|
||||
@@ -382,7 +399,7 @@ class SerialCommunicator:
|
||||
# 打开串口
|
||||
if self._open_serial():
|
||||
self._start_communication()
|
||||
self._save_current_config()
|
||||
self.ui.save_current_config()
|
||||
except Exception as e:
|
||||
logger.error(f"串口操作出错: {e}")
|
||||
self.ui.log(f'串口操作失败: {e}')
|
||||
@@ -442,19 +459,33 @@ class SerialCommunicator:
|
||||
def _receive_loop(self):
|
||||
"""接收数据循环"""
|
||||
buffer = b''
|
||||
last_data_time = time.time() # 记录最后接收数据的时间
|
||||
|
||||
while self.running.is_set():
|
||||
try:
|
||||
if self.com.is_open:
|
||||
# 使用带超时的读取,避免阻塞
|
||||
data = self.com.read(self.com.in_waiting or 1)
|
||||
if data:
|
||||
buffer += data
|
||||
self.recv_count += len(data)
|
||||
last_data_time = time.time() # 更新最后接收时间
|
||||
|
||||
# 处理完整的数据包
|
||||
if buffer:
|
||||
self.ui.dmesg('recv', buffer)
|
||||
self.ui.log(f'{self.com.port}: 接收 {len(buffer)} 字节')
|
||||
buffer = b''
|
||||
# 检查是否需要分帧
|
||||
current_time = time.time()
|
||||
time_since_last_data = (current_time - last_data_time) * 1000 # 转换为毫秒
|
||||
|
||||
# 获取分帧间隔设置
|
||||
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,可以及时响应停止事件
|
||||
self.running.wait(0.01) # 等待10ms或直到running被清除
|
||||
|
||||
Reference in New Issue
Block a user