引言
在物联网学习和开发中,树莓派+蓝牙模块是一个经典的组合。但有时手边没有树莓派硬件,或者想在熟悉的Windows环境下先进行调试和验证,该怎么办?本文将带你一步步在Windows上模拟树莓派的蓝牙串口功能,让你的手机通过蓝牙与PC上的Python程序进行通信。
同时,博主也会详细记录自己在此过程中的各种报错,供各位参考。
目录
[1. 下载与安装](#1. 下载与安装)
[2. 创建并命名虚拟串口对](#2. 创建并命名虚拟串口对)
[1. 安装ble-serial](#1. 安装ble-serial)
[2. 启动ble-serial(服务器模式)](#2. 启动ble-serial(服务器模式))
论文投稿:
第五届光电信息与功能材料国际学术会议(OIFM 2026)
大会时间:2026年4月10-12日
大会地点:中国-武汉



方案概述
我们将使用ble-serial工具,它在Windows上创建一个虚拟串口,并将这个串口桥接到电脑的蓝牙低功耗(BLE)上。手机端通过通用的BLE串口App连接后,你的Python程序就可以像操作普通串口一样收发数据。
整体流程:
-
安装虚拟串口驱动(
com0com),创建一对虚拟串口(如COM50和BLE) -
安装并启动
ble-serial服务,将BLE端口广播出去 -
手机连接电脑蓝牙
-
运行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键点击"重启" -> 进入"疑难解答" -> "高级选项" -> "启动设置" -> "重启"。重启后按数字键7或F7选择"禁用驱动程序强制签名"。在此模式下完成安装和配置。
- 方法 :按住
2. 创建并命名虚拟串口对
安装完成后,默认会创建一对名为 CNCA0 和 CNCB0 的端口。我们需要将它们改名,并避开可能被占用的端口号。
找到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或使用虚拟环境重新安装)
第三步:手机端准备
-
在手机上安装一款支持BLE串口的App。推荐使用 Serial Bluetooth Terminal (Android) 或 LightBlue (iOS)。
-
打开App,扫描附近的蓝牙设备。
-
找到名为
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上实现了原文章(树莓派方案)的核心功能:
-
硬件模拟 :用
com0com虚拟串口替代了物理的HC-05蓝牙模块与树莓派GPIO的连接。 -
蓝牙服务 :用
ble-serial替代了树莓派上通过Python直接操作蓝牙底层的工作,它在Windows上提供了稳定、标准的BLE串口服务。 -
应用逻辑:Python代码部分保持了高度的相似性,都是通过读写串口来与"外部"(手机)进行通信。
这个方案让你无需硬件即可进行开发和调试,当代码迁移到真实的树莓派上时,你只需要将Python代码中的串口号从COM50改为/dev/ttyAMA0(或树莓派上蓝牙模块对应的串口),逻辑几乎无需改动。
希望这篇笔记能帮助你顺利搭建起Windows下的蓝牙通信实验环境,为你的物联网项目开发提供便利。