相信很多人认为串口呢就只是用来打打Log而己,最多就是提供一个命令的输入输出,今天呢阿圆就要带大家见识下在STM32的串口的另类用法!
事实上如果有接触过Linux的同学肯定不会觉得好奇,因为像我们常用的kernel的make menuconfig,或者像mpd音乐播放器,又或者是tmux等,他们的终端都使用的了大名鼎鼎的libncurses函数库,使用它可以很方便的实现终端图形的绘制。那么今天阿圆带来的就是适用于我们嵌入式使用的ncurses即mcurses
我们先来看看使用mcurses的效果,在STM323上实现一个简单的磁盘温度计

再来看一个,使用mcurses在串口终端上画一个圆(嘿嘿肯定没有阿圆圆啦)

如果你愿意,你还可以使用这个mcurses做一个终端游戏~
好啦,不卖关子,事实上今天的要做的事情很少,有兴趣的同学可以一起来试试
[1]下载mcurseshttps://github.com/ChrisMicro/mcurses
就是这里啦,本来mcursesr 的原作者是来自德国的Frank M,官方链接
http://www.mikrocontroller.net/wikifiles/1/1c/Mcurses.zip
为什么放的是Github的链接呢,因为本来阿圆是打算自己移植Frank M的代码,结果发现网上己经有人做了,那就直接拿来吧!
[2]新建STM32串口工程,不多说了,将mcurses.c,mcurses.h及mcurses-config.h添加到STM32工程当中
[3]添加以下函数,并在串口初始化后就设置好mcurses的串口输出函数void uart_putchar(uint8_t c){
printf("%c",c);
}
setFunction_putchar(uart_putchar);
[4]画个简单的圆
调用完initscr()后就可以开始绘制图形。这里使用math.h里的sin/cos计算出圆所在的位置后,将光标移动对应位置后写一个"+"号
其中VT100_moveTo的定义是
#define VT100_moveTo(x,y) move(y,x),作用就是移动光标到终端的指定位置
是不是很简单?
[5]准备好Tera Term,打开串口就可以看到一个圆在终端上慢慢地画出来了
为什么不用putty呢?阿圆试了下putty的串口支持的效果不如Tera Term,会出现一些乱码 ,比如那个硬盘温度计的效果如下,就不是很好~

事实上在Github里还有很多例子,大家可以试试~
到这里,相信大家应该明白了,相比于sscom等串口调试助手而言,putty和tera term应该称作终端。终端除了支持普通文本外,还支持以ESC开头的转义字符,使用转义就可以实现对终端的控制。目前使用转义字符可以做到

  • 标准ASCII的用法,这个是自然,常用的比如有ESC,退格,删除,空格,TAB及回车换行(\r\n),不常用的如响铃,竖向的TAB

  • 光标控制,比如 ESC [ <X> ; <Y> H 命令就是用来控制光标位置,刚才画圆的move函数就是实现了这个转义

  • 字符擦除,比如ESC [ K就是清除从光标开始到结束的行而ESC [ 2 K而是清除事先

  • 设置字符属性,如字体颜色

  • 前景色背景色的设置