上一篇提到的跑在单片机里的交互终端到底长什么样?先来看看下面这条命令:
=>led -i 0 -s
=>
解释一下:“=>”是提示符,说明单片机等着你的输入,此时串口终端输入led命令,带上参数“-i 0”,表示编号0的LED,“-s”表示设置点亮,整个个命令就是将0号LED点亮。然后输入回车,单片机执行完后返回新的提示符,等待下一个命令。
是不是很好理解?这就是明文调试的好处:直观。相应的灭灯命令呢?把“-s”换成“-c”就行。还有其它的参数吗?敲“led --help”试试,打印出整个用法说明:
=>led --help
usage: led [-s] [-t] [-c] [-i ] [-n] [-T]
options:
-s/--set on
-t/--toggle invert
-c/--clr off
-i/--index index from 0
-n/--number query
-T/--test blink all
=>
看到了没?还支持长变量名:“-s”和“--set”是等价的,这一点和LINUX下的命令行习惯一致。
上面这套Shell因为跑在MCU上,我给它命名MCUSH(MCU Shell的缩写),有兴趣的朋友可以参考我的Github代码库(已经以开源形式公开):pengshulin/mcushgithub.com
下面开始用Python重新表演一遍,首先用pip下载安装mcush库:
$ sudo pip install mcush
打开Python解释器(这里用的版本是V2.7),输入脚本:
$ python
Python 2.7.12 (default, Aug 22 2019, 16:36:40)
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from mcush import *
>>> m=Mcush.Mcush("/dev/ttyUSB0")
>>> m.ledSet(0)
>>>
上面的Python代码将位于串口“/dev/ttyUSB0”的设备抽象成一个对象m,调用方法ledSet(0)会组装相应命令发送给单片机执行,因为是阻塞的调用方式,当单片机返回新的提示符后,函数调用才会返回。
假如这个设备的0号灯是蓝色,1号灯是红色,下面的脚本让它们闪出警灯的效果:
import time
from mcush import *
s = Mcush.Mcush("/dev/ttyUSB0")
while True:
for i in range(3):
s.ledSet(0) # blue led on
time.sleep(0.1)
s.ledClr(0) # blue led off
time.sleep(0.1)
for i in range(3):
s.ledSet(1) # red led on
time.sleep(0.1)
s.ledClr(1) # red led off
time.sleep(0.1)
是不是很简单直接?下一篇讲一讲GPIO的控制。