在opencv上用python写一个串口收发,要求接受时程序不被中断
时间: 2025-06-28 07:10:01 浏览: 8
要在 OpenCV 上用 Python 编写一个串口通信程序,并保证接收数据时不阻塞主程序流程,你可以结合 `pyserial` 库和线程处理技术。
### 实现步骤:
1. **安装必要的库**:
- 首先需要安装 `opencv-python` 和 `pyserial` 这两个Python包。
```bash
pip install opencv-python pyserial
```
2. **编写代码框架**:创建一个新的脚本文件,在其中导入所需的模块并设置好串口号、波特率等基本信息。
3. **启动独立的读取线程**:为了不让主循环等待串口输入而卡住,应该将串口监听任务放到单独的工作线程里去完成。可以利用 Python 内置的 threading 模块来简化这一过程。
4. **非阻塞地发送命令给硬件设备**:当有图像帧准备好之后再通过串行端口向外部设备发出控制指令;由于这是单次性的操作所以一般不会造成阻塞现象。
5. **整合到 OpenCV 的视频流捕获中**:最后一步就是把上面所说的几个部分结合起来,在每获取一帧画面的同时就能及时响应来自Arduino的消息了。
下面是一个简单的示例代码片段展示如何做到这一点:
```python
import cv2
import serial
from threading import Thread
class SerialComm(Thread):
def __init__(self, port='/dev/ttyUSB0', baudrate=9600): # 根据实际情况修改port参数值
super().__init__()
self.ser = serial.Serial(port, baudrate)
self.running = True
def run(self):
while self.running:
if self.ser.in_waiting > 0:
data = self.ser.readline().decode('utf-8').strip()
print(f"Received from Arduino: {data}")
def send_command(self, cmd):
""" Send command to the connected device """
encoded_cmd = f"{cmd}\n".encode('ascii')
self.ser.write(encoded_cmd)
# 初始化摄像头捕捉
cap = cv2.VideoCapture(0)
# 启动串口通讯线程
ser_thread = SerialComm()
ser_thread.start()
try:
while True:
ret, frame = cap.read()
# 显示采集的画面
cv2.imshow("Frame", frame)
key = cv2.waitKey(1) & 0xFF
# 如果按下 'q' 键则退出
if key == ord('q'):
break
except KeyboardInterrupt:
pass
finally:
ser_thread.running = False
ser_thread.join()
cap.release()
cv2.destroyAllWindows()
```
注意此段演示仅作为参考用途,请根据实际需求调整配置选项及业务逻辑。
阅读全文
相关推荐

















