当前位置: 首页 > news >正文

上位机图像处理和嵌入式模块部署(mcu 项目1:上位机编写)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

        前面,我们说过要做一个报警器。如果只是简单做一个报警器呢,这个基本上没有什么难度。这里,我们就适当提高一下难度,那就是给这个报警器增加两个功能,第一,可以通过上位机+串口来升级固件,毕竟谁也没有办法保证固件代码没有bug;第二,可以标定参数。一方面,上位机可以读取标定的参数,另外一方面,上位机也可以写入新的参数。

1、开发软件

        之前,我们讨论过可以用qt或者c# wpf的方式,来进行上位机的开发,不失一般性。这里采用qt的方式进行上位机开发。

2、通信方式

        本着由易到难的方式,现在我们先使用串口通信的方式来处理。等到后面积累起一定的经验,可以慢慢引入usb、以太网等更复杂的方式。

3、固件更新的方法

        前面说过,整个固件分成两部分,一个是bootloader,一个是app。其中bootloader是hex的形式,而app是bin的形式。所以这里上位机需要同时面对这两种模式。回到固件更新,目前来说,最简单的方法就是直接从上位机,借助于串口发送bin数据即可。如果一段时间超时,bootloader就可以认为是bin文件发送完毕,后续可以进行mcu内部flash的写入了。

4、参数读取和设置

        参数部分的话,要保证既能读取,又能设置。当然,这部分参数需要提前规划一下,即它们应该保存在flash的什么位置。千万不能把参数、bootloader、bin这几个文件mix在一起,不然到时候就麻烦了。

5、实时读取数据

        除了参数之外,另外一部分需要完成的就是数据的读取,也就是实时ad转换后的数据读取。这部分可以通过添加一个text edit的方式,把他们放在edit编辑框即可。start之后,读取数据;stop之后,停止读取数据;clear,那就是清理edit编辑框的数据。

6、通讯协议

        鉴于上位机需要先后和bootloader、app bin进行通讯,那么需要定一个通讯协议。其中bootloader加载的时候,是不需要的,直接发送数据即可。而bin启动后,则是需要数据交互的,这个时候有必要订立一个协议。

        这部分,其实可以借鉴485 modbus协议,假设是读的情况,可以这么来做,

	0x55 0x55,报文头len,报文长度command id,命令crc,校验0xaa 0xaa,报文结尾

        读完之后,肯定有一个反馈,

	0x55 0x55,报文头len,报文长度command id, 命令  // 如果是-1,则读取失败data,读取的数据crc,校验0xaa 0xaa,报文结尾

        写也是一样的,只不过写的时候要带上数据。但是写的反馈可以简单一点,即反馈的时候不需要数据。中间不管写,还是读,出错的时候,command id的位置写-1即可。

7、界面编写

        qt界面可以通过硬编码,也可以通过designer来实现,本着效率第一的原则,建议大家还是多用用designer,把时间放在更加有意义的事情上面。这里给出了一个模板,大家也可以自己测试下,

相关文章:

  • vue3实现多表头列表el-table,拖拽,鼠标滑轮滚动条优化
  • Batch Size 不同对evaluation performance的影响
  • Stream toArray 好过collect
  • 常用知识点问答
  • 【Spring Boot】Java 持久层 API:JPA
  • 数据结构-第七章(B树和B+树)
  • 每日一道算法题 判断子序列
  • linux 环境报错:Peer reports incompatible or unsupported protocol version
  • sheng的学习笔记-hadoop,MapReduce,yarn,hdfs框架原理
  • 不使用AMap.DistrictSearch,通过poi数据绘制省市县区块
  • 巴西市场有哪些电商平台?巴西最畅销的产品有哪些?
  • 揭秘,PyArmor库让你的Python代码更安全
  • Linux 程序打包
  • 时尚品牌GOODBAI好人好事系列纪录片——Jupiter乐队的热血与梦想
  • ubuntu 18 虚拟机安装(3)安装mysql
  • 【5+】跨webview多页面 触发事件(二)
  • Angular Elements 及其运作原理
  • Bootstrap JS插件Alert源码分析
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • FineReport中如何实现自动滚屏效果
  • JavaScript的使用你知道几种?(上)
  • PHP的Ev教程三(Periodic watcher)
  • React as a UI Runtime(五、列表)
  • Vue.js-Day01
  • Vue学习第二天
  • 从0到1:PostCSS 插件开发最佳实践
  • 代理模式
  • 机器学习 vs. 深度学习
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 前端设计模式
  • 深入浅出webpack学习(1)--核心概念
  • 算法-图和图算法
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • ​埃文科技受邀出席2024 “数据要素×”生态大会​
  • #git 撤消对文件的更改
  • #HarmonyOS:基础语法
  • #Z0458. 树的中心2
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (2024)docker-compose实战 (8)部署LAMP项目(最终版)
  • (Oracle)SQL优化技巧(一):分页查询
  • (TOJ2804)Even? Odd?
  • (二)Eureka服务搭建,服务注册,服务发现
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (循环依赖问题)学习spring的第九天
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • .describe() python_Python-Win32com-Excel
  • .mat 文件的加载与创建 矩阵变图像? ∈ Matlab 使用笔记
  • .NET Framework与.NET Framework SDK有什么不同?
  • .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(二)...
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)...
  • .NET简谈设计模式之(单件模式)
  • .net经典笔试题