更新sbl升级 上位机

场景:

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表示步长

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值