python硬件交互_用Python控制硬件1-Python控制硬件的几种方式

首先开篇名义,为什么我要用Python来控制硬件,主要还是工作需要:作为嵌入式软件工程师(工业产品为主),需要一种灵活高效的控制方法,辅助产品设计测试。多年的比较尝试下来,Python是为数不多的胜出方案之一。

举几个应用场景:

1、某产品处于样机试制阶段,在低温状态偶尔不能开关机,但是概率极低(<1%),明显手工测试效率太低。我的办法是用Python脚本控制电源重启,读取设备反馈信号判断是否工作正常,如此反复测试(完全自动化无人干预)。通过大量实验后再找规律和解决方案。

2、某监测终端在被监测对象异常时会报警,如何在实验室模拟想要的异常呢?因为监测过程大致就是各种传感器捕获成数字量输入,后通过某种算法得出结果,我的方案是用Python脚本通过光耦、继电器等器件输入给终端,模拟这类故障时序,达到伪装效果。

3、新产品调研,需要评估一款模块,尽管控制IIC/SPI接口不算难事,但要用C写固件、反复下载调试还是得花不少精力,更何况这段代码注定是要丢弃的。我的方法是用Python脚本编写IIC/SPI测试用例,用PC来评估硬件模块。

上述场景都需要在X86/64的PC上运行Python解释器,直接控制到硬件端口。但实际上Python是移植性很强的,其它的运行方式还有:

1、如果设备自身就是ARM/MIPS跑着POSIX环境的,有着足够的资源,可以直接以嵌入式方式运行Python解释器。需要做的是移植板上的硬件库,让应用层有接口调用。但是X86上的众多第三方库你就得逐个移植了。

2、MicroPython是将Python3移植到资源受限单片机上的有趣尝试,但是除了运行效率低之外(也许随着芯片性能提高会改善),上述问题同样存在:第三方的库几乎没法用。

为了能用上第三方库,最大化PC的效能,就需要在通用PC上跑Python解释器,并与下位机建立连接。下位机负责实现你的业务指令,处于“桥接”的地位。

有了桥接控制器,就能接受Python下发的指令并执行,比如“控制某个端口输出翻转”,“检测某个端口输入电压”,“控制SPI发送一个字节,并读回器件返回的内容”。业务需求五花八门,定制性太强。

除了分解任务并执行,桥控制器还有个重要作用:完成实时性要求高的指令,比如输出一个宽度1微秒的短脉冲,这个要求超过了与PC的传输延迟,必须由控制器严格控制。

PC与“桥”之间的接口有多种实现方法,硬件层有串口、USB、网口等,协议可以是私有的或开放式的,各有优缺点,不多评价。

后续要重点介绍的,也是笔者长期使用的,一种交互式命令行实现的控制方法,具有以下特点:物理层依托于最常用、最简单的异步串口,资源占用少。

交互式命令行实现的人机接口,单片机接收指令和参数,解释执行,再给出提示符等待下一个输入,反复循环。

所有指令都是ASCII明文,便于调试排错。

……

熟悉Linux的人都知道,这不就是Shell终端的运行方式吗?

没错,上述的只是一种调试手段,尤其适用于手动调试。但是提醒一下,这是运行在单片机侧的Shell,除了解释执行PC发来的命令外,它还有能力“控制硬件”:GPIO、SPI、IIC、ADC、DAC……,访问全部芯片内存空间,控制所有的外设。

这样,我们就能在PC端开启串口终端控制台,与单片机交互,从而用上它的硬件控制能力。

但是这与Python有什么关系呢?

为了提高控制效率,实现自动化无人操作,需要用程序模拟命令输入、解析的过程。理论上可以用任意高级语言来实现:C/C++/C#、JAVA……,封装形式也是多样的:动态库、静态库……。但我仍然首选Python来完成,这是由应用场景决定的,只强调两点:用于后期测试:通常需要为不同测试场景写相应测试用例,且改动非常频繁。

用于前期设计:单片机的业务命令扩展与相应Python封装同步进行,完全业务驱动,不确定性很大。

以上两点对Python来说毫无压力。

大致背景介绍完了,下一篇开始展示Python的威力吧。

你可能感兴趣的:(python硬件交互)