You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

适配带蓝牙模块Arduino与Python的串口通信包推荐及注意事项

Arduino蓝牙模块与Python串口通信的包推荐及注意事项

推荐的Python串口通信包

1. pySerial

这是Python串口通信的事实标准,跨平台支持Windows、Linux、macOS,操作简单,完全兼容Arduino的Serial通信。

  • 安装:pip install pyserial
  • 核心功能:串口打开/关闭、读写数据、参数配置(波特率、数据位等)

2. pyserial-asyncio(可选)

如果你的Python程序需要异步处理(比如同时处理UI和串口通信),这个包是pySerial的异步扩展,基于asyncio实现,适合高并发场景。

  • 安装:pip install pyserial-asyncio

Arduino端无需额外包

Arduino自带的Serial库就能直接和蓝牙模块通信,只需确保蓝牙模块的接线和串口参数匹配:

  • 接线:蓝牙模块的TX接Arduino的RX引脚,RX接Arduino的TX引脚(注意电平,HC-05/HC-06这类模块一般是3.3V电平,不要直接接Arduino的5V引脚,可能需要电平转换)
  • 初始化:Serial.begin(9600)(波特率和Python端保持一致)

关键注意事项

  • 串口参数完全匹配:波特率、数据位(默认8)、停止位(默认1)、奇偶校验(默认无)必须和Arduino端完全一致,否则会出现乱码或无法通信。
  • 正确识别端口:
    • Windows:打开设备管理器,找到“端口(COM和LPT)”下的蓝牙虚拟串口
    • Linux/macOS:在终端执行ls /dev/tty*,找到类似/dev/ttyUSB0(Linux)或/dev/tty.usbmodemXXXX(macOS)的设备,Linux用户可能需要将自身加入dialout组以获取权限:sudo usermod -aG dialout $USER
  • 先完成蓝牙配对:先在系统设置中完成蓝牙模块的配对,再通过虚拟串口连接,不要直接连接硬件串口(除非是USB转蓝牙模块直接插电脑)。
  • 统一数据格式:建议用固定分隔符(如逗号、换行)或结构化格式(如JSON)传输数据,避免解析错误。比如Arduino端发送"temp:25,hum:60\n",Python端拆分后提取数值。
  • 异常处理:Python端要捕获串口断开、超时等异常,避免程序崩溃,比如用try-except块处理serial.SerialException。
  • 供电稳定性:蓝牙模块对电流有一定要求,供电不足会导致连接频繁断开,优先用外部电源供电,或确保Arduino的5V引脚能提供足够电流。

示例代码

Arduino端代码

void setup() {
  Serial.begin(9600); // 波特率与Python端一致
}

void loop() {
  // 接收Python发送的命令
  if (Serial.available() > 0) {
    String cmd = Serial.readStringUntil('\n');
    cmd.trim();
    if (cmd == "request_sensor") {
      // 模拟发送传感器数据
      Serial.println("temp:25.3,hum:62.1");
    }
  }
  delay(100);
}

Python端代码(pySerial)

import serial
import time

# 替换为你的蓝牙虚拟串口端口号
serial_port = 'COM3'  # Windows示例,Linux/macOS替换为'/dev/ttyUSB0'等
baud_rate = 9600

try:
    ser = serial.Serial(serial_port, baud_rate, timeout=1)
    time.sleep(2)  # 给蓝牙模块留足连接时间
    print("串口连接成功")
    
    while True:
        # 发送请求命令
        ser.write(b'request_sensor\n')
        # 读取响应
        response = ser.readline().decode('utf-8').strip()
        if response:
            print(f"收到传感器数据: {response}")
        time.sleep(1)
        
except serial.SerialException as e:
    print(f"串口错误: {e}")
except KeyboardInterrupt:
    print("用户终止程序")
finally:
    if 'ser' in locals() and ser.is_open:
        ser.close()
        print("串口已关闭")

内容的提问来源于stack exchange,提问作者ShivaDahal99

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 22:05:03