Windows下模拟树莓派:使用ble-serial创建虚拟串口实现手机蓝牙通信

引言

在物联网学习和开发中,树莓派+蓝牙模块是一个经典的组合。但有时手边没有树莓派硬件,或者想在熟悉的Windows环境下先进行调试和验证,该怎么办?本文将带你一步步在Windows上模拟树莓派的蓝牙串口功能,让你的手机通过蓝牙与PC上的Python程序进行通信。

同时,博主也会详细记录自己在此过程中的各种报错,供各位参考。

目录

引言

方案概述

第一步:安装与配置虚拟串口驱动

[1. 下载与安装](#1. 下载与安装)

[2. 创建并命名虚拟串口对](#2. 创建并命名虚拟串口对)

第二步:安装并启动ble-serial服务

[1. 安装ble-serial](#1. 安装ble-serial)

[2. 启动ble-serial(服务器模式)](#2. 启动ble-serial(服务器模式))

第三步:手机端准备

第四步:编写并运行Python通信脚本

第五步:测试通信

方案总结


论文投稿:
第五届光电信息与功能材料国际学术会议(OIFM 2026)

大会官网:https://ais.cn/u/fIvmAb

大会时间:2026年4月10-12日

大会地点:中国-武汉


方案概述

我们将使用ble-serial工具,它在Windows上创建一个虚拟串口,并将这个串口桥接到电脑的蓝牙低功耗(BLE)上。手机端通过通用的BLE串口App连接后,你的Python程序就可以像操作普通串口一样收发数据。

整体流程

  1. 安装虚拟串口驱动(com0com),创建一对虚拟串口(如COM50和BLE)

  2. 安装并启动ble-serial服务,将BLE端口广播出去

  3. 手机连接电脑蓝牙

  4. 运行Python脚本,通过COM50端口与手机通信

第一步:安装与配置虚拟串口驱动

Windows本身不提供创建虚拟串口的功能,我们需要借助开源驱动com0com

1. 下载与安装

  • com0com项目页面下载最新的签名版压缩包(例如 com0com-3.0.0.0-i386-and-x64-signed.zip)。

  • 解压后,以管理员身份 运行对应系统的安装程序(如 Setup_com0com_v3.0.0.0_W7_x64_signed.exe)。

  • 注意 :安装过程中,Windows可能会提示驱动签名问题。你需要临时禁用驱动程序强制签名 才能继续。

    或者你安装com0com后,右键开始打开设备管理器,会发现自己的com0com端口上有黄色感叹号,都可以使用如下方法解决。

    • 方法 :按住 Shift 键点击"重启" -> 进入"疑难解答" -> "高级选项" -> "启动设置" -> "重启"。重启后按数字键 7F7 选择"禁用驱动程序强制签名"。在此模式下完成安装和配置。

2. 创建并命名虚拟串口对

安装完成后,默认会创建一对名为 CNCA0CNCB0 的端口。我们需要将它们改名,并避开可能被占用的端口号。

找到com0com的安装目录(通常在 C:\Program Files (x86)\com0com\),其中有一个名为 setupc 的命令行配置工具。

  • 找到setupc文件 :如果开始菜单里没有快捷方式,可以直接在安装目录下找到 setupc(没有扩展名)这个文件。

  • 打开命令行 :在文件资源管理器的地址栏输入 cmd 并回车,即可在该目录下打开命令提示符。

  • 执行改名命令(以管理员身份运行的命令提示符中):

    bash 复制代码
    # 查看当前端口列表
    setupc list
    
    # 将 CNCA0 改名为 COM50 (选择一个未被占用的端口号)
    setupc change CNCA0 PortName=COM50
    
    # 将 CNCB0 改名为 BLE (这个名字是固定的,后续ble-serial会用到)
    setupc change CNCB0 PortName=BLE
    
    # 再次查看确认
    setupc list

    如果提示端口被占用,请更换一个更大的端口号,如COM100

  • 验证 :打开Windows的"设备管理器",展开"端口 (COM 和 LPT)",你应该能看到 com0com - Serial port emulator (COM50)com0com - Serial port emulator (BLE)

第二步:安装并启动ble-serial服务

1. 安装ble-serial

在命令行中执行:

bash 复制代码
pip install ble-serial

2. 启动ble-serial(服务器模式)

打开一个新的命令提示符窗口(普通权限即可),执行以下命令。这是最关键的步骤,让电脑开始广播蓝牙服务。

bash 复制代码
ble-serial -g server -p BLE -s "00001101-0000-1000-8000-00805F9B34FB" -n "MyPiSimulator"

参数解释

  • -g server:以服务器模式运行,等待手机连接。

  • -p BLE:指定使用我们刚创建的BLE虚拟端口。

  • -s "00001101-0000-1000-8000-00805F9B34FB":指定标准的串口服务UUID,确保手机App能发现。

  • -n "MyPiSimulator":设置蓝牙广播名称,方便手机识别。

如果一切顺利,你会看到如下输出,表示服务已启动,正在等待连接:

bash 复制代码
INFO:root:Starting BLE serial bridge (server mode)
INFO:root:Using COM port: BLE
INFO:root:Advertising as: MyPiSimulator
INFO:root:Waiting for connections...

常见错误解决

  • 如果提示No module named 'bless',请尝试单独安装bless库:pip install bless

  • 如果提示No module named 'pysetupdi',这是Windows后端依赖问题,可以尝试安装:pip install pysetupdi (但该库可能已不存在,此时可考虑升级ble-serial或使用虚拟环境重新安装)

第三步:手机端准备

  1. 在手机上安装一款支持BLE串口的App。推荐使用 Serial Bluetooth Terminal (Android) 或 LightBlue (iOS)。

  2. 打开App,扫描附近的蓝牙设备。

  3. 找到名为 MyPiSimulator 的设备,点击连接。

第四步:编写并运行Python通信脚本

现在,我们需要一个Python脚本来操作COM50端口。新建一个文件,例如 ble_test.py,并写入以下代码:

python 复制代码
import serial
import time

# 配置端口,必须与com0com中设置的名称一致
PORT = 'COM50'  # 如果你用了其他端口号,请修改此处
BAUD_RATE = 9600

try:
    # 打开串口
    ser = serial.Serial(PORT, BAUD_RATE, timeout=1)
    print(f"成功打开端口 {PORT},等待手机数据...")

    while True:
        # 接收手机发来的数据
        if ser.in_waiting > 0:
            received_data = ser.readline().decode('utf-8').strip()
            if received_data:
                print(f"收到手机消息: {received_data}")

                # 简单回声:将收到的数据加上前缀发回手机
                reply = f"PC收到: {received_data}"
                ser.write((reply + '\n').encode('utf-8'))
                print(f"回复手机: {reply}")

        # 可选:主动发送心跳包
        # ser.write("心跳\n".encode('utf-8'))
        time.sleep(0.1)

except serial.SerialException as e:
    print(f"串口错误: {e}")
    print("请确保:")
    print("1. ble-serial 服务正在运行")
    print("2. 手机已成功连接")
    print("3. 端口号 COM50 未被占用")
except KeyboardInterrupt:
    print("\n程序已退出")
finally:
    if 'ser' in locals() and ser.is_open:
        ser.close()

在第三个命令提示符窗口中运行此脚本:

bash 复制代码
python ble_test.py

第五步:测试通信

现在,三个部分都已就绪:

  • 窗口1 :运行着 ble-serial 服务,等待/维持连接。

  • 窗口2 :运行着你的 Python 脚本,监听 COM50

  • 手机 :已通过App连接到 MyPiSimulator

在手机App的输入框中输入任意文字(如"Hello from Phone")并发送,你将会在Python脚本的窗口中看到"收到手机消息",并自动回复一条确认消息。

方案总结

通过以上步骤,我们成功地在Windows上实现了原文章(树莓派方案)的核心功能:

  1. 硬件模拟 :用 com0com 虚拟串口替代了物理的HC-05蓝牙模块与树莓派GPIO的连接。

  2. 蓝牙服务 :用 ble-serial 替代了树莓派上通过Python直接操作蓝牙底层的工作,它在Windows上提供了稳定、标准的BLE串口服务。

  3. 应用逻辑:Python代码部分保持了高度的相似性,都是通过读写串口来与"外部"(手机)进行通信。

这个方案让你无需硬件即可进行开发和调试,当代码迁移到真实的树莓派上时,你只需要将Python代码中的串口号从COM50改为/dev/ttyAMA0(或树莓派上蓝牙模块对应的串口),逻辑几乎无需改动。

希望这篇笔记能帮助你顺利搭建起Windows下的蓝牙通信实验环境,为你的物联网项目开发提供便利。

相关推荐
2401_846341653 小时前
使用Python进行网络设备自动配置
jvm·数据库·python
钱多多_qdd3 小时前
第一次使用mac,安装java相关的东西
java·python·macos
小小小米粒3 小时前
CSV 是什么?
python
阿kun要赚马内3 小时前
Python五类数据容器的对比和通用方法
开发语言·python
好家伙VCC3 小时前
# 发散创新:用 Rust 实现高性能事件驱动架构的实践与优化 在现代软件系统中,**事件驱动编程模型**已经成为构
java·开发语言·python·架构·rust
梦醒过后说珍重3 小时前
Python 工程化实战:如何将复杂的EndoMamba感知损失封装为“即插即用”的独立模块包
python·深度学习
爱钓鱼的程序员小郭3 小时前
阿里云自动配置安全组IP白名单
python·tcp/ip·安全·阿里云
荔枝吻3 小时前
【保姆级喂饭教程】Windows各版本对.NET支持情况
windows·.net
梦醒过后说珍重3 小时前
PyTorch 工程实践:如何优雅地将 ViT 大模型封装为即插即用的感知损失(Perceptual Loss)
python·深度学习