场景:
sbl固件升级程序
1、端口号可手动输入 seteditenable(true)
2、串口自动获取线程时间间隔降低 QTimer() 设置为0.1
3、默认升级命令
4、新增摁扭,添加复位功能 释放部分常量及串口内存 (串口号与文件不变
5、协调 当前升级出现的各类问题 与 信息窗提醒的内容
6、多个串口时自动默认最新端口 (注:self.comboBox_2.findText(latest_port) 这个最新的端口号的index 不一定是最后一个,所以 self.comboBox_2.setCurrentIndex(len(self.uartlist)-1) # 设置当前选项为最后一个元素 是不可行的)
7、板卡断开连接提醒
8、串口器断开连接提醒
9、多个串口交叉插拔仅有打开的串口识别断开提醒
10、若串口存在,在升级后的十秒内若没有识别到数据即停止任务 并提醒
11、无终端打包pyinstaller --onefile --noconsole main.py
自动识别新增sbl串口号
提示:需要注意的是我们遍历的时候要知道先后的逻辑顺序:
# 下面为设置默认最新端口
latest_port = None #首先定义最新端口为空
for port in self.uartlist: #遍历我们当前的所有端口
if port not in self.old_uartlist:#如果哪个端口没在上一次refresh中的uartlist中
latest_port = port#那他就是最新端口
break
if latest_port is not None:
index = self.comboBox_2.findText(latest_port)
self.comboBox_2.setCurrentIndex(index)
}
复位摁扭:
提示:信号和槽、变量的初始化、线程控制:
self.new_button.clicked.connect(self.resetsbl)
我们在这里需要注意的是,当我们一开始没打开串口时,判断串口是否打开是会报错终止的,所以我们做异常处理。
def resetsbl(self):
# 波特率复位
self.comboBox.setCurrentIndex(0)
# 升级命令复位
self.lineEdit.setText('A5 01 02 03 5A')
# 信息提示窗口与进程刷新
self.textEdit.clear()
try:
if self.fd.is_open: # 如果端口打开 那么我们关闭掉
self.fd.close()
except:
pass # 异常处理,不做任何操作
办卡断开连接提醒:
提示:连续十个字节为空判断为板卡失去连接:
端口读
for i in range(0, size, 128):
self.w_buf = [0 for i in range(133)]
self.w_buf[0] = 1
self.w_buf[1] = self.id
self.w_buf[2] = self.id & 0xff
if size >= 128:
for j in range(128):
self.w_buf[j + 3] = read[i + j]
self.crc = self.crc16_ccitt(self.w_buf)
self.crc_h = self.crc >> 8
if self.crc_h > 0xff:
self.crc_h = self.crc_h % 0x100
self.crc_l = self.crc & 0xff
self.w_buf[131] = self.crc_h
self.w_buf[132] = self.crc_l
self.write_buf = bytearray(self.w_buf)
self.fd.write(self.write_buf)
while self.fd.read(1) != b'\x06': # 一个一个读取 直到读到06才会停止
if self.fd.read(1) != b'\x06':
self.count += 1
if self.count > 10:
self.textEdit.insertPlainText("Board disconnected!\n提示:板卡连接异常,已自动断开串口连接。\n")
self.fd.close()
return -1
break
else:
self.count = 0
continue
# 再加一个传输的进程提醒
if i % (16128 * 4) == 0:
info = 'transfer completed ' + str(int(i / os.path.getsize(filename) * 100)) + '%' + '\n'
self.textEdit.insertPlainText(info)
这里简单说一下for i in range(0, size, 128): 如果size= 10000 然后我们在for中打印i 的话 那么第一个第二个结果是 0 128 256 所以128表示步长