如何让Python与Arducam通过Arduino同一COM端口通信且无"Access denied"错误?
解决Arduino串口被Python与Arducam同时占用的问题
核心逻辑
串口属于独占式资源,无法让两个程序同时打开同一COM端口。必须让Arduino作为唯一的串口交互主体,由它统一协调Python指令和相机的操作流程。
方案1:修改Arduino固件,统一解析串口指令
- 在Arduino代码中加入串口指令解析逻辑,Python仅负责发送指令(如拍照、调整参数),由Arduino调用Arducam库执行相机操作,避免Python直接抢占串口资源。
- Arduino示例代码:
#include <Arducam.h> Arducam camera; void setup() { Serial.begin(9600); camera.init(); // 仅在Arduino初始化时完成相机启动 } void loop() { if (Serial.available() > 0) { String cmd = Serial.readStringUntil('\n'); if (cmd == "CAPTURE") { camera.capture(); Serial.println("CAPTURE_FINISHED"); } else if (cmd == "SET_720P") { camera.setResolution(1280, 720); Serial.println("RESOLUTION_UPDATED"); } } } - Python端仅负责指令收发:
import serial ser = serial.Serial('COM3', 9600, timeout=1) ser.write(b"CAPTURE\n") result = ser.readline().decode('utf-8').strip() print(result) ser.close()
方案2:用软件模拟串口分流
如果Arduino有闲置IO引脚,可借助SoftwareSerial库创建虚拟串口,让Python连接虚拟串口,硬件串口留给Arducam使用。
- 注意:软件串口波特率不宜过高(建议≤9600),避免数据丢失,适合传输指令类小数据。
- 示例代码:
#include <SoftwareSerial.h> #include <Arducam.h> SoftwareSerial pySerial(2, 3); // 定义虚拟串口的RX、TX引脚 Arducam camera; void setup() { Serial.begin(115200); // 硬件串口给Arducam pySerial.begin(9600); // 虚拟串口给Python camera.init(); } void loop() { if (pySerial.available() > 0) { String cmd = pySerial.readStringUntil('\n'); if (cmd == "CAPTURE") { camera.capture(); pySerial.println("DONE"); } } }
方案3:切换Arducam的控制接口
如果你的Arducam支持I2C或SPI接口,可将相机连接到Arduino的I2C/SPI引脚,让串口完全留给Python使用。Arduino作为中间桥接,接收Python指令后通过I2C/SPI控制相机。
内容的提问来源于stack exchange,提问作者Bakanium
相关产品推荐
相关产品推荐

