谈一谈单片机开发的几种调试方案
单片机开发过程中,有一个好的调试系统可以极大地提高开发效率。
举个例子,做平衡系统时调节PID参数,你会选择 修改参数–>编译–>烧录–>运行–>修改…,还是做一个功能可以一边运行一边修改参数呢?
调试的方法有多种,在这就来分别谈一下我在开发过程中使用过的几种调试方案。
这里的调试方案也是一种交互方案,但此方案不是为了交互而设计,重在快速地搭建、方便地使用、高效地调试,换句话说长得丑无所谓。
我们做调试工具追求的是什么
做调试系统无非是为了两点:
- 实时显示一些必要信息。
- 实时修改,其实也就是可以实时接收指令。
为了提高开发效率,我们进一步希望:
- 调试系统搭建起来方便快捷,最好可以统一标准,方便移植。
我们不希望在调试系统上花费太多工作量,不要太复杂,尽量轻量级。 - 直观显示,看得清楚。
- 方便输入,操作快捷。
几种调试方案
1、加入屏和按键
最直接的方法就是在嵌入式系统中加入屏和按键,做出一个界面,显示信息和接收按键指令。
【优点】跟随系统,不需要依赖其他设备,可以随时随地调试。
【缺点】
- 添加了硬件。硬件的设计和焊接还是需要花费一些精力的。
- 构建界面同样也要花费不少精力。
- 显示信息有限。
加入的屏通常显示内容比较少,会受到一些限制。 - 按键功能有限。
加入的按键通常也不会太多,并且如果我们考虑到长按、组合键等操作的话构建程序也是比较复杂的。
【总结】
肯定不能算轻量级,功能有限,可移植性差,花费精力多,屏需要额外费用。
唯一的优点就是跟随系统,没有其他依赖。
所以如果不是非要随时调试的话不建议用这种方法,单纯为了调试来说代价还是比较大的。
2、串口+上位机
单片机自己不负责显示,它把数据发送出去,由上位机显示;也不负责按键检测,由上位机负责并接收上位机指令。
单片机和上位机之间需规定好通信协议。
通信方式可以是串口也可以是其他,上位机可以是图形也可以是命令行。
【优点】
- 对单片机来说做到了一定的轻量级。只需要考虑发送数据和接收指令的协议。
- 对于比较复杂的功能,好的上位机,尤其是图形化的上位机可以很方便地调试。
【缺点】
- 需要设计通信协议,双方都要位通信协议写代码。这需要花费一定的精力。
- 制作上位机需要花费较多的精力,并且上位机不通用。
【总结】
由于上位机在电脑上,有丰富的显示和控制资源,做出一个好的上位机可以极其方便地提高效率。
但制作上位机要花费大量精力。
所以,如果上位机是作为产品发布,是值得花精力去做的;但如果仅仅是为了调试时用一下,不值得这样做。
到这里有没有注意到,其实我们是想找到一个通用的”显示器”,能够方便地把信息显示出来。 显示器是已经做好的,不需要我们再做什么,通信协议尽可能简单,最好能直接输出。 后面我们会找到这么一个好东西。
3、用树莓派
用树莓派进行关键计算,我们关心的数据都在树莓派的程序里。
由于树莓派里运行linux系统,在其连接网络后,我们可以用局域网里电脑的终端登陆树莓派,在树莓派的程序里直接打印接口显示出来。
注:
在命令行下打印数据并不一定是一行一行地输出,也可以控制光标在指定位置输出,构建出一个简单的界面。构建方法可参考本文后面内容,网上搜索”控制台编程”也有大量资源。
命令行下接收键盘操作也不一定非要输入字符再回车,程序里可以直接监测键盘。
总之在命令行中是可以构建出一个类似于 显示屏+按键 组合的”设备”的。
【优点】
- 终端就相当于是一个现成的、通用的显示屏,任意支持ssh的终端都可使用。
- 程序里直接打印输出!这真是太方便的,c语言中一个printf即可,相当于是一个极其简单的通信协议。
【缺点】
- 贵!一个小小的智能车都要塞个树莓派,树莓派价格都够好多个智能车了。
- 树莓派本身是重量级。虽然程序本身是方便了,但使用之前需要配置树莓派,虽然一个树莓派只要配置一次。
- 树莓派本身硬件功能有限,有些功能树莓派不能直接完成,还是需要借助单片机,并和单片机通信。
比如记录车轮旋转的正交编码器,stm32有专门的硬件模块完成,树莓派没有,如果树莓派想要记录车轮旋转的话还是需要借助stm32,并且设计如何获取stm32记录的数据。
【总结】
对于调试这一方面来说,树莓派是非常方便的,输出、输入都是直接完成。
所以如果你的项目值得用树莓派,那调试是非常方便的;如果不需要用树莓派,光是为了调试方便而使用是不建议的,请考虑上面3个缺点。
虽然树莓派本身不一定最合适,但我们找到了方向——终端。
4、串口+通用终端工具
单片机能不能用终端呢?答案是肯定的。
有多种终端工具可以通过串口使用,比如windows自带的超级终端,linux和osx下命令行里的minicom,以及夸三个平台的图形化终端secureCRT。
这些终端工具的功能简单来说就是:1、当某个按键按下立刻发送该按键的键码出去,比如按下p键发送字符’p’。2、接收串口数据并显示出来。
说明:
- 这些终端工具的协议是相同的,可以认为是通用的显示器和键盘。
- 单片机可以发送一些特殊字符串完成一些特殊操作,比如清屏、控制光标位置。利用这些功能可以构建出简单的界面。
这些操作功能已经封装成了函数,会在本文后面给出。 - 一般会先在单片机中实现printf功能,实现之后在程序中用printf即可直接在终端工具中显示信息。
实现printf功能的方法在这里不介绍,具体可上网查找,工作量并不大。其实就是重定义一个函数,使printf函数通过指定串口输出字符串。 - 串口通过蓝牙模块可快速实现无线传输。
【优点】
- 单片机端轻量级,上位机端无工作量。
具体来说单片机端要做的事情有:初始化串口,重定向printf,通过特殊字符串控制光标构建界面。 - 上位机端通用,单片机端显示相关的代码方便移植。
本文后文会给出显示相关的库函数。 - 硬件扩展几乎没有。
【缺点】
对比第1种方案,需要一台电脑。其他方面都具有很大优势。
【总结】
此方案是单片机开发调试的理想选择。
下面会介绍如何在终端工具里构建出界面。
如何构建终端工具里的控制台界面
1、构建界面用到的特殊字符串
字符(串) | 功能 | 备注 |
---|---|---|
\r | 光标移到行首 | |
\b | 退格 | |
“\033[2J” | 清屏 | 清屏后光标还在原来位置 |
“\033[2K]” | 清除本行 | 清除后光标还在原来位置 |
“\033[H” | 光标复位,回到左上角(1行1列) | |
“\033[%d;%dH”, y, x | 设置光标到y行x列 | 终端中的行和列都是从1开始数的 |
“\033[%dA”, y | 光标上移y行 | |
“\033[%dB”, y | 光标下移y行 | |
“\033[%dD”, x | 光标左移x列 | |
“\033[%dC”, x | 光标右移x列 | |
“\033[?25l” | 隐藏光标 | 在secureCRT中测试无效 |
“\033[?25h” | 显示光标 | 在secureCRT中测试无效 |
注:
- 终端工具里的x、y坐标都是从1开始数的,同时等于0的话终端也会认为是1。
- \033代表的是八进制033,对应十进制是27,十六进制是0x1B。
2、封装好的库函数
使用这个库函数的前提是:
1、主函数完成了串口初始化,串口功能正常使用。
2、重定向了printf函数,printf函数可通过串口输出字符串。
disp.h文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
disp.c文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
|
本站所有文章欢迎转载,但请保留作者信息和原文地址。