ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

蓝牙串口通讯实战:PC与安卓无线调试的完整指南

蓝牙串口通讯实战:PC与安卓无线调试的完整指南 1. 蓝牙串口通讯的整体思路与方案选型1.1 蓝牙SPP到底是什么为什么它对PC与安卓通讯这么合适做嵌入式开发或者自动化测试的朋友应该都有过这种经历手头有一块单片机板子想通过手机看它的调试日志或者写了一个安卓APP需要和PC端的上位机软件交换数据。最常见的老办法是USB转串口线线缆一插数据就通了但问题也很明显——线不够长、插拔麻烦、手机OTG转接还经常供电不稳定。蓝牙串口Bluetooth SPP全称Serial Port Profile解决的就是这个痛点。SPP是蓝牙协议栈里一个非常经典的剖面它的本质是把传统的有线串口UART在蓝牙链路上透传过去。也就是说你不需要关心蓝牙射频怎么编码、怎么跳频对应用层来说它呈现的就是一个标准串口有波特率、有数据位、有停止位甚至收发数据的方式和串口一模一样。对PC与安卓APP的通讯场景来说SPP方案天然具备几个优势其一绝大部分安卓手机从Android 2.x时代开始就支持SPP协议兼容性极好覆盖面广其二PC端无论是Win10还是Win11内置蓝牙驱动里都有虚拟串口功能手机和PC配对之后系统会自动生成一个COM口上位机软件直接打开这个COM口就能收发数据完全不需要额外的硬件其三整个过程是无线连接实测下来在没有大型遮挡的室内10米范围内数据稳定度非常好。适合看这篇文章的读者我大致归纳为三类一是做嵌入式开发、需要给单片机项目配一个无线调试通道的工程师二是安卓APP开发初学者尤其是期末大作业准备做个蓝牙控制小车或者蓝牙聊天室的在校学生三是喜欢折腾DIY硬件、想给手头老旧设备加一个无线调试口的玩家。无论你是哪一类这篇文章里讲到的思路和坑都是你绕不过去的。1.2 方案对比蓝牙串口 vs 有线串口 vs Wi-Fi我为什么推荐SPP在聊具体操作之前我先把几个常见通讯方案的优劣摆出来方便你判断自己到底需不需要蓝牙串口。方案优点缺点适用场景有线串口USB转TTL稳定、速度快、零延迟需要物理连线、长度受限台式设备调试、产线测试蓝牙SPP无线、配置简单、手机PC原生支持速率上限不高经典蓝牙约2Mbps、距离有限短距离无线调试、移动端交互Wi-FiTCP/UDP速率高、距离远配置麻烦、需要局域网环境大规模数据传输、视频流2.4G私有无线模块延迟低、抗干扰好需要专用收发模块成对遥控器、键鼠、无人机从表格就能看出蓝牙SPP的核心场景是短距离、低数据量、希望摆脱线缆束缚的交互型应用。实测下来如果你要传一个几百KB的图片蓝牙SPP会吃力传完也要等半天但如果你只是传传感器数据、控制指令、日志文本SPP完全够用而且配置成本几乎为零。我还要特别提醒一句蓝牙SPP和蓝牙BLE低功耗蓝牙是两码事。很多新接触蓝牙开发的读者在安卓手机上装了一个只支持BLE的调试APP去连接一个只支持SPP的蓝牙模块结果怎么都连不上然后怀疑是硬件坏了。其实在很多开发板上比如HC-05、HC-06模块默认就是SPP协议而几个主流蓝牙调试APP默认也主推SPP。所以方案选型的第一步是要确认你手上的设备走的是SPP协议。至于怎么确认、怎么区分我放在后面的问题排查章节详细说。2. 准备工作工具选型与软硬件清单2.1 PC端蓝牙适配器内置与外置怎么选如果你用的是笔记本电脑绝大多数型号都自带蓝牙模块直接跳过去看下一节就行。台式机用户要注意很多入门级台式机主板不带蓝牙或者蓝牙模块藏在机箱里信号很差这时候就需要一个外置蓝牙适配器。外置蓝牙适配器选择的核心参数只有一个是否支持蓝牙4.0及以上版本。支持蓝牙4.0以上的适配器既能连传统的SPP设备也能连低功耗蓝牙设备向下兼容没问题。市面上常见的USB蓝牙适配器价格一般就几十块钱插上以后Windows会自动安装驱动设备管理器里能看到蓝牙节点不需要额外折腾驱动。有一个坑我一定要单独拎出来说买适配器时别贪便宜买那种厂商很久不更新驱动的杂牌否则在Win10/Win11上经常出现蓝牙已配对但连接失败的问题。我踩过一次后来换成芯片方案是常见CSR和Realtek芯片的适配器一切就正常了。怎么确认芯片方案在设备管理器里右键蓝牙设备查看属性看硬件ID里有没有VID_0A12CSR或者VID_0BDARealtek这类标识这两个大厂的方案在Windows下兼容性最稳。2.2 安卓端APP选择这几个蓝牙串口工具值得装安卓端蓝牙串口调试APP的选择网上能找到不少但很多已经停止维护在高版本的安卓系统上运行会出现权限崩溃。我把自己长期用下来觉得靠谱的几个整理了一下按体验排序蓝牙串口助手Bluetooth Serial Controller这是一款老牌的SPP调试工具界面清爽支持收发十六进制和ASCII码、支持定时发送、支持保存日志。在Play商店和国内一些应用市场都能搜到注意认准图标别下到山寨版。它的核心优势是连接速度快和HC-05这类模块一配对就能用很少出现兼容性问题。Serial Bluetooth Terminal偏极客风格终端模式像当年用超级终端一样适合喜欢命令行风格的开发者。它的日志导出功能很好用方便做长期的数据采集。蓝牙调试器国内团队做的工具界面汉化支持SPP和BLE双协议也支持iBeacon扫描等功能。如果是初学者这个工具的中文界面更友好。无论用哪款安装后都建议顺手把后台运行和定位权限打开原因我在后面权限章节详说。另外我特别建议手机上保留至少两个不同的BLE/SPP调试APP因为不同APP对某些蓝牙芯片的兼容性表现差异很大遇到一个连不上换一个就连上了的情况太常见了。2.3 PC端串口调试工具虚拟串口认识与工具推荐蓝牙SPP的精妙之处在于PC把蓝牙连接伪装成了一个标准串口。当安卓手机和PC完成配对后你在设备管理器里打开端口COM和LPT节点会看到一个标准串行 over 蓝牙链接或者类似名字的COM口比如COM4、COM7。这个COM口的本质是操作系统通过蓝牙协议栈模拟出来的虚拟串口对它进行的打开、读写操作最后都会被映射到蓝牙无线信道上去。既然有了虚拟串口那PC端的调试工具就沿用普通的串口调试助手即可。我用得最多的是这几个SSCOM丁丁老师的作品功能全面支持自动发送、支持多种显示格式、支持保存接收数据。它的经典老版本体积小、开箱即用Windows 10上运行完全没问题。XCOM也是串口调试界的经典工具界面更现代一点支持定时收发、支持曲线显示适合看波形数据的场景。友善串口调试助手老牌工具简单稳定适合初学者上手。这几个工具都免费去官网或者CSDN下载频道搜就行。下载的时候注意核对文件信息避免下载到捆绑安装包的版本这些工具都只有几MB的绿色单文件如果下载下来是个几十MB的安装包大概率是坑。3. 保姆级实操从配对到双向收发全流程3.1 第一步PC与安卓手机配对以Windows 10/11为例准备工作做完我们进入正式实操。PC与安卓手机配对是整个流程里最关键的一步很多问题都是在这一步埋下的我一步步拆开讲。打开Windows的设置 - 蓝牙和其他设备确保蓝牙开关处于开启状态。在安卓手机上打开设置 - 蓝牙让手机处于可被搜索状态。不同手机叫法不一样比如小米的开放检测、华为的可被发现本质上都一样而且大部分手机默认在蓝牙设置页面就开启了可被搜索。回到PC端点击添加蓝牙或其他设备 - 蓝牙Windows会开始扫描附近的蓝牙设备。此时你手机上应该出现一个类似DESKTOP-XXXX或你自定义的电脑名称的设备条目点击它开始配对。配对过程中PC端会弹出一个6位数字的配对码同时手机上也显示同样的数字。核对无误后在两边都点击确认。这里有一个细节如果两边显示的配对码一样就说明两个设备的蓝牙协议栈都在正常工作这个配对环节就成功了。配对完成后PC端的设置页面里就能看到你的手机名称状态显示已配对。这里要重点提醒Windows和安卓手机配对一定要走输入配对码确认这个流程。如果你在PC端点击设备时提示PIN码错误或者连接失败多数情况是因为手机端的蓝牙配对模式没有正确弹出确认框。解决办法是在手机蓝牙设置里把已经配对的设备记录删掉然后重新在PC端发起配对。我遇到过一次非常诡异的情况手机提示配对成功但PC一直显示已配对却无法创建串口最后把两个设备都重启才恢复猜测是蓝牙协议栈状态机卡死了。3.2 第二步查看PC端生成的虚拟串口号配对成功只是第一步我们还要确认PC端有没有成功生成虚拟串口。这个环节经常被新手忽略但它是整个链路是否能打通的分水岭。右键点击Windows的开始菜单选择设备管理器展开端口COM和LPT节点。正常情况下你会在下面看到类似标准串行 over 蓝牙链接 (COM5)的条目。记下这个COM号一会儿PC端串口调试工具要用。如果你找遍了设备管理器都没有看到这个虚拟串口条目不用慌按下面的顺序排查检查Windows蓝牙驱动是否正常。在设备管理器里找到蓝牙节点看看有没有设备带黄色感叹号。如果有需要更新蓝牙驱动。检查手机端是否已经对PC开放了串口服务。安卓手机和PC配对后默认会开启一个蓝牙串口服务但少数手机系统把这个服务放在了开发者选项或者蓝牙高级设置里。我在某些国产手机上就遇到默认不开放的情况得去蓝牙设置 - 高级设置里勾选允许此设备使用蓝牙串口服务才能让PC识别到COM口。如果都找不到尝试把PC和手机的配对关系删掉重新配对一次注意观察配对过程中是否额外弹出授权设备访问串口之类的提示有就点允许。3.3 第三步安卓端APP连接与设置以蓝牙串口助手为例PC端虚拟串口准备好之后我们把注意力转到安卓APP这边。打开手机上安装好的蓝牙串口助手APP首次打开会申请附近设备权限和定位权限这两个都必须允许。很多人不理解为什么连蓝牙还要定位权限这是安卓系统的硬性要求——从Android 6.0开始蓝牙扫描被归入了定位相关的权限组不授权就无法扫描到设备。在APP主界面点击连接按钮APP会弹出一个设备列表列表中会出现之前配对过的PC名称。这个列表读的是系统蓝牙配对记录不是扫描结果所以PC必须先在系统蓝牙设置里和手机配对过否则在这里看不到。点击PC名称APP会开始向PC发起SPP连接。连接成功后APP界面上的状态指示会变成已连接有些APP还会显示对端设备的MAC地址。进入APP的设置界面确认工作模式。重点检查两处一是字符集/编码默认选ASCII即可二是波特率这里有个容易踩的坑——蓝牙SPP连接在建立之后波特率其实已经不影响实际传输了因为蓝牙链路是数字信道没有传统UART那种物理波特率的概念。但很多APP仍然会在界面上保留一个波特率选项这个值随便选PC端串口调试工具的波特率也随便选两边数值即使不一致也不影响通信。这一点和有线串口完全不同后面排查乱码时一定要记得。设置好后在APP的发送框里输入一串测试文本比如hello from android点击发送。3.4 第四步PC端串口调试工具收发测试现在我们打开PC端的串口调试工具以SSCOM为例在串口下拉列表中选择刚才记下的COM号比如COM5波特率可以选9600或者115200其他参数保持默认8位数据位、1位停止位、无校验。点击打开串口此时如果虚拟串口被其他程序占用工具会提示打开失败你需要先关闭占用程序。我建议整个测试过程中不要同时开两个串口工具去打开同一个COM口容易造成数据竞争。打开成功后你在PC工具发送框输入hello from PC点击发送。此时看手机上的蓝牙串口助手APP如果收到了这段文本说明PC到安卓的下行链路是通的。然后在手机APP上发送hello from android回到PC工具看接收区如果能看到这段文本说明安卓到PC的上行链路也是通的。到这里一个双向透明的蓝牙串口通讯链路就已经完全打通了。测试过程中我建议先在无遮挡、距离1米内的环境做排除距离因素干扰。确认链路通了以后再逐步拉开距离测试实际有效范围。4. 常见问题与排查技巧实录4.1 配对成功但APP连接失败SPP和BLE的坑这是我在社区里被问得最多的问题没有之一。现象是手机和PC在系统蓝牙设置里明明已经配对成功但在蓝牙串口助手里点击连接却报连接失败或者直接连接超时。这个问题的九成原因是APP连接时走的是BLE扫描而PC端提供的是SPP服务。简单区分一下SPP是经典蓝牙的服务配对方式就是传统配对码BLE是低功耗蓝牙连接机制完全不一样。你用的调试APP如果只支持BLE那它去连一个SPP设备必然失败。解决办法也很直观换一个支持SPP的调试APP。我前面推荐的蓝牙串口助手和Serial Bluetooth Terminal都支持SPP你可以在APP里的连接方式设置中明确选择经典蓝牙SPP或者传统蓝牙不要选BLE。另外还有一种隐蔽情况即使APP支持SPP如果在安卓系统底层层面手机和PC的配对状态是已配对但未连接APP发起SPP连接时系统可能不会自动建立通道此时在手机系统蓝牙设置里先点一下PC名称看看能否建立系统级连接然后再回APP里点连接。4.2 串口号找不到或突然消失怎么办PC端设备管理器里虚拟串口条目不见了这通常是Windows蓝牙协议栈的非正常状态导致的。我先给一个速查清单重启蓝牙驱动设备管理器里找到蓝牙适配器右键禁用再启用能解决多数偶发性问题。删除设备并重新配对在PC蓝牙设置里选中手机设备点删除设备然后再重新配对一次。重启蓝牙支持服务WinR打开运行框输入services.msc回车找到蓝牙支持服务Bluetooth Support Service右键重启它。这个操作会把整个系统的蓝牙服务重置实测对串口消失问题有奇效。检查是否被其他程序占用有些虚拟串口消失不是驱动问题而是被某个后台程序占用后异常退出导致的。可以尝试注销Windows再登录让系统重新初始化串口设备。还有一个小众问题部分更新到Windows 11的电脑默认关闭了蓝牙串口组策略。你可以用gpedit.msc打开组策略编辑器依次进入计算机配置 - 管理模板 - Windows组件 - 应用程序兼容性检查与蓝牙相关的策略是否有异常不过这个概率很低一般家庭版系统也没有组策略编辑器不用太纠结。4.3 数据乱码、收发不稳定先查这三个地方链路通了之后很多朋友会立刻遇到乱码问题。这里我要先破除一个迷思——前面也提过蓝牙SPP链路本身和波特率无关真正导致乱码的通常是以下三个原因APP与PC工具的字符编码不一致比如手机APP发送的是UTF-8编码的字符串而PC工具以GBK/ASCII解析中文内容就会变成乱码。解决办法是把两边的编码都统一为UTF-8SSCOM和新版XCOM都有编码选择或者干脆先只收发英文和十六进制数据测试排除编码干扰。发送缓冲区溢出蓝牙链路的吞吐量有限如果你在PC工具上设置了一个很大的循环发送间隔比如1毫秒发送一次单次发几百字节安卓APP来不及处理就会丢包、乱码。解决办法是适当拉长发送间隔比如100毫秒一次或者减少单次数据量。数据尾部的多余字节某些蓝牙模块尤其是HC-05在数据链路层会附加一些帧尾信息如果你用的是这类硬件模块需要对收到的数据做过滤。但PC与手机直接通过系统蓝牙连接时一般不会出现这个情况。如果你做完以上三点检查仍然乱码我的建议是直接用十六进制模式收发。在PC工具和手机APP里都切到HEX显示然后用一串固定数据比如AA BB CC DD做回环测试。如果十六进制数据完全正确就说明链路没问题问题出在文本编码上。4.4 安卓版本权限问题汇总Android 6~14蓝牙相关的安卓运行时权限从Android 6.0到Android 14经历了好几次变化我按版本整理了一个对照表安卓版本需要授权的权限备注Android 6.0~11定位权限ACCESS_FINE_LOCATION蓝牙扫描被归入定位权限不授权搜不到设备Android 12附近的设备权限BLUETOOTH_SCAN、BLUETOOTH_CONNECT不再依赖定位权限但要单独授权附近设备Android 13基本同上但系统UI会单独弹出附近的设备授权窗如果拒绝过需要在系统设置里手动打开很多初次接触蓝牙开发的读者APP装上后点了允许但连接还是失败就是因为安卓12之后旧的应用没有适配新的权限模型导致系统没弹出附近的设备授权窗口。解决办法在手机设置 - 应用 - 找到该APP - 权限里手动把附近的设备权限打开。另外国产手机小米、OPPO、vivo等的权限管理更加激进除了系统权限外还有后台弹出界面、允许自启动等限制这些虽然不影响SPP连接但会影响APP在后台收数据。如果你测试时切换到其他APP再切回来发现蓝牙连接断开了先别怀疑程序逻辑去检查一下系统是否把APP的后台权限给限制了。5. 进阶扩展从能通信到能干活5.1 把安卓手机变成单片机无线调试终端打通了PC和安卓的通信链路你手里的工具组合就已经很强大了。最常见的进阶玩法是把安卓手机变成一个独立的无线调试终端配合单片机开发板使用。思路是这样的单片机板子比如STM32、ESP32、Arduino通过蓝牙模块如HC-05建立串口透传通道手机里的蓝牙串口助手APP直接连接这个蓝牙模块。这样你在调试现场不用抱着电脑手机就能实时查看单片机的日志输出、发送调试指令、甚至修改参数。很多做机器人、智能小车项目的朋友现场调试时都是这么干的比传统USB线方便太多。接线方案也简单。以STM32 HC-05为例HC-05的TXD接STM32的RXPA10RXD接STM32的TXPA9VCC接5VGND接GND。注意电平匹配问题STM32的GPIO一般是3.3V逻辑HC-05的VCC虽然标称5V但逻辑电平一般兼容3.3V不过为了稳妥最好用逻辑电平转换模块避免长期跑高压损坏单片机引脚。单片机固件里把串口1初始化的波特率设置为9600然后正常调用printf走串口发送数据就会通过蓝牙模块透明转发到手机上不需要做任何额外的协议转换。5.2 用Python PySerial写一个PC端自动收发程序如果你的需求是PC端要做自动化测试、批量数据采集那么手动用串口调试工具肯定不够我建议用Python配合PySerial库写一个小程序。PySerial是Python操作串口的标准库使用非常简单import serial import time # 打开虚拟串口注意替换成你自己的COM号 ser serial.Serial( portCOM5, baudrate115200, bytesizeserial.EIGHTBITS, parityserial.PARITY_NONE, stopbitsserial.STOPBITS_ONE, timeout1 ) if ser.is_open: print(串口已打开, ser.name) # 向安卓APP发送数据 ser.write(bhello from python\n) time.sleep(0.5) # 读取安卓APP回复的数据 data ser.readline() print(收到回复, data) ser.close()这段代码的逻辑很直白打开虚拟串口发送一行文本等待回复然后关闭串口。实际项目中你可以在此基础上加循环、加超时重试、加数据解析。有一点要提醒PySerial的readline函数是按\n分割的所以发送端手机APP的每条消息末尾要加换行符否则PC端会一直等待数据。我做过一个温湿度采集的小项目就是用PC端Python程序通过蓝牙串口从手机APP转发过来的传感器数据里解析出温度值然后自动写进Excel整个采集过程完全不需要人盯着屏幕效率提升非常明显。5.3 自己做一款安卓蓝牙串口APP期末大作业版思路如果你正在准备安卓APP开发期末大作业用蓝牙串口做主题是一个性价比极高的选择——功能明确、逻辑简洁、演示效果好。我梳理一下核心实现步骤第一步在AndroidManifest.xml中声明蓝牙权限。在Android 12及以上你需要声明BLUETOOTH_SCAN、BLUETOOTH_CONNECT这两个运行时权限同时将android:usesPermissionFlagsneverForLocation标记加在BLUETOOTH_SCAN上可以避免不必要的位置权限弹窗。第二步获取蓝牙适配器列出已配对设备。核心代码如下BluetoothAdapter adapter BluetoothAdapter.getDefaultAdapter(); SetBluetoothDevice pairedDevices adapter.getBondedDevices(); for (BluetoothDevice device : pairedDevices) { // 这里把device列表填充到UI }第三步建立SPP连接。SPP连接的经典做法是通过UUID00001101-0000-1000-8000-00805F9B34FB来匹配串口服务UUID sppUUID UUID.fromString(00001101-0000-1000-8000-00805F9B34FB); BluetoothSocket socket device.createRfcommSocketToServiceRecord(sppUUID); socket.connect(); InputStream in socket.getInputStream(); OutputStream out socket.getOutputStream();第四步数据的收发逻辑。可以直接起一个子线程读InputStream拿到数据后用Handler或LiveData更新UI界面发送时调用out.write()即可。我把这套流程给好几个学生朋友演示过他们做完这个作业之后普遍反馈最大的收获不是蓝牙API本身而是理清了权限申请、线程通信、UI更新这三大安卓基础模块的协作关系。如果你时间紧张建议优先做一个连接、发送、接收日志显示三件套足够支撑起一份完整的大作业报告。5.4 ESP32无线透传让蓝牙串口变成物联网桥接器如果你手头有ESP32开发板还有一个更现代的玩法ESP32自带经典蓝牙和BLE双模能力官方提供的BluetoothSerial库可以直接把它变成蓝牙串口透传设备。不需要外接任何蓝牙模块Arduino环境里几行代码就能实现#include BluetoothSerial.h BluetoothSerial SerialBT; void setup() { Serial.begin(115200); SerialBT.begin(ESP32_Bridge); Serial.println(蓝牙透传已启动名称: ESP32_Bridge); } void loop() { if (SerialBT.available()) { Serial.write(SerialBT.read()); } if (Serial.available()) { SerialBT.write(Serial.read()); } }这个例程把USB串口和蓝牙串口双向桥接。手机蓝牙串口助手连接上ESP32之后你发给ESP32的数据会从UART口转发出去连接在UART上的任何传感器或单片机都能收到反过来传感器上报的数据也会被蓝牙转发到手机上。加上ESP32自带的Wi-Fi能力你就可以设计一个蓝牙接入、Wi-Fi上报的物联网网关模型这个方案在很多大学生电子设计竞赛里见过非常实用。6. 写在最后我的几点实用体会做技术调试点亮的瞬间很爽但通往点亮的路往往布满各种小坑。这篇文章里提到的很多排查经验都是我一次次配对失败、连接超时、乱码之后总结出来的。我个人最大的体会是蓝牙串口通讯这个项目技术门槛并不高真正考验人的是对协议栈概念的理解深度和排查问题的耐心。很多人一遇到连不上就怀疑是硬件坏了其实99%的情况都出在权限、协议、占用这三个维度上按着本文的思路逐层排查绝大多数问题都能解决。另外想说一点工具不在多顺手最重要。我电脑里常驻SSCOM手机里只留一个SPP一个BLE的调试APP足够了。每次拿到一个新设备、一个新模块先用这套组合拳打通链路再谈业务逻辑。最后再分享一个小技巧如果你在PC工具里发送了数据但手机一直没收到你可以尝试先断开蓝牙重新连接一次有时候蓝牙协议栈在半连接状态下收不到数据重新连接是成本最低的恢复手段。祝大家一次点亮。
返回列表