【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱: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,把时间放在更加有意义的事情上面。这里给出了一个模板,大家也可以自己测试下,