13.3.1.2. Hello cam

openmv.Camera 类是该软件包所有功能的 Python 入口点。本教程中的其他每一页都会调用它。最小的可用程序会建立连接、上传一个 MicroPython 脚本,并打印脚本写入 stdout 的任何内容:

from openmv import Camera

script = """
import time
while True:
    print('hello from the cam')
    time.sleep(1)
"""

with Camera('/dev/ttyACM0') as cam:
    cam.stop()
    cam.exec(script)

    while True:
        if text := cam.read_stdout():
            print(text, end='')

13.3.1.2.1. 几点说明

exec() 之前调用 stop() 不是可选的。如果不调用它,任何先前正在运行的脚本会继续写入 stdout,并且新的 exec 会与它争夺对 stdin 通道的控制权。

exec() 将脚本字符串上传到摄像头的 stdin 缓冲区,并在 IDE 所对话的同一个 MicroPython 解释器中运行它。脚本会导入 csiimageml 以及前面章节介绍过的其余摄像头接口——唯一不同的是源代码通过 USB 到达,而不是来自摄像头上的 main.py 或 IDE。

13.3.1.2.2. 停止脚本

当主机程序想要中断正在运行的脚本时,调用 stop()。脚本会收到与 IDE 所发送的相同的中断,并在下一个机会退出。离开上下文管理器(with 块)会关闭串口,但不会停止脚本——摄像头会继续运行最后加载的内容,直到有某些东西中断它。

13.3.1.2.3. 错误与异常

在协议层出现的任何问题都会引发 openmv.OMVException 或其某个子类(TimeoutExceptionChecksumExceptionSequenceException)。用 try / except OMVException 包裹 with 块是暴露 USB 线缆断开或摄像头停止响应的最简单方式。

协议在引发异常之前会在内部重试;当 OMVException 到达应用程序时,重试预算已经用尽,链路确实已损坏。默认值(max_retry=3timeout=1.0)适用于所有人——只有在某个特定应用程序需要不同行为时,才在构造函数处调整它们。