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 直譯器中執行它。該指令碼會匯入 csi、image、ml,以及先前章節所介紹的其餘相機介面——唯一的差別在於原始碼是透過 USB 抵達,而非來自相機上的 main.py 或 IDE。
13.3.1.2.2. 停止指令碼¶
當主機程式想中斷執行中的指令碼時,請呼叫 stop()。指令碼會收到與 IDE 所傳遞相同的中斷,並在下一個機會退出。離開情境管理器(with 區塊)會關閉序列埠,但 不會 停止指令碼——相機會持續執行最後載入的內容,直到有東西中斷它為止。
13.3.1.2.3. 錯誤與例外¶
在通訊協定層發生的任何問題都會引發 openmv.OMVException 或其某個子類別(TimeoutException、ChecksumException、SequenceException)。將 with 區塊包在 try / except OMVException 中,是呈現 USB 纜線斷線或相機停止回應最簡單的方式。
通訊協定在引發例外之前會於內部重試;當 OMVException 傳達到應用程式時,重試額度已用盡,連線確實已中斷。預設值(max_retry=3、timeout=1.0)適用於所有人——只在特定應用程式需要不同行為時,才在建構子處調校它們。