1. 项目概述与主从一体架构拆解
1.1 AC6328A是什么,为什么它值得用
AC6328A是珠海杰理科技推出的一款低功耗蓝牙SoC芯片,这颗料在消费电子、物联网透传、智能家居控制这类场景里出镜率很高。它内置了BLE 5.x协议栈,原生支持串口透传,并且可以通过AT指令集完成几乎所有参数配置,不需要写一行嵌入式代码就能把设备跑起来。
我第一次接触AC6328A是被它的“主从一体”能力吸引的。市面上很多廉价蓝牙串口模块,要么只能做从机等主机来连,要么只能做主机去连别人,使用场景被锁死。AC6328A这类主从一体模块,同一颗芯片既能当主机去主动连接从机设备,也能当从机等待别人连接,甚至可以在双从、双主、主从混合这些模式下工作。这就意味着你不需要为不同的项目采购不同型号的模块,一个模块通吃,对做原型验证和批量量产都很友好。
如果拿它和经典的HC-05、HC-06对比,差异就更明显了。HC-06只能做从机,想改成主机基本没戏;HC-05虽然支持主从切换,但是必须通过按键或特定引脚进入AT模式,操作繁琐,且连接管理能力比较弱。AC6328A的AT指令直接通过串口下发,主从模式切换、扫描、绑定、回连都是软件指令完成,整个开发体验完全不一样,它更像一个带协议栈的蓝牙MCU,而不只是一个“串口转蓝牙”的桥。
1.2 主从一体的核心价值与应用场景
我先解释一下“主从”这两个角色在蓝牙BLE里的含义,方便刚接触的朋友建立基本认知。
在BLE体系里,发起连接的一方叫主机(Central),被连接的一方叫从机(Peripheral)。传统BLE设备的角色是固定的,主机永远是主机,从机永远是从机。但主从一体模块,你可以在出厂后通过AT指令随时把角色改过来,甚至在部分固件版本里做到同时维护两条连接:一条作为主机连出去,一条作为从设备被连进来。
这套能力在几个场景里非常有用:
- 两个单片机之间无线透传:A板上的MCU要把数据发给B板,如果两块板子都只用从机模块,那谁都没法主动发起连接,链路压根建不起来。用主从一体模块,把一边设为主机,一边设为从机,上电后自动回连即可。
- 手机APP+设备+传感器网关的桥接:设备作为从机与手机通信,同时作为主机去采集周边传感器的数据,一个模块承担双向角色,系统结构能简化不少。
- 替代有线串口调试:在产线工装、设备调试场景,用蓝牙透传替代USB转串口线,主从一体模块可以任意一端主动发起连接,灵活度更高。
所以在选型阶段,如果项目里存在“两个设备之间的数据通路方向不确定,或者角色可能变化”的情况,直接选主从一体模块,能省去后期改板的麻烦。
1.3 整体方案设计思路
整套方案的核心链路是:串口数据 -> AC6328A内部协议栈封装 -> 蓝牙射频发送 -> 对端蓝牙接收 -> 对端模块串口输出。
从开发的角度看,我们要做的只有三件事:
- 把一个AC6328A模块配成“主机”,并把要连接的从机蓝牙地址、连接参数写入配置。
- 把另一个AC6328A模块配成“从机”,设置好设备名称、服务UUID、波特率等广播参数。
- 两端上电后,主机自动扫描并连接从机,连接建立后,串口层完全透明,双向数据互通。
后面的章节我会一步一步展开,演示具体的AT指令怎么发、参数怎么选、连接怎么建、问题怎么排。我尽量把每个操作背后的“为什么”也讲清楚,而不是只丢一条指令让你去抄。
2. 硬件准备与AT指令体系详解
2.1 硬件接线与开发环境准备
虽然AC6328A是全功能SoC,但绝大多数市售模块已经把晶振、天线匹配电路、Flash都集成好了,我们只需要关心串口和电源部分。我这里以最常用的6Pin模块为例,引脚定义如下:
| 引脚名 | 电平 | 功能说明 |
|---|---|---|
| VCC | 3.3V-5.5V | 模块供电 |
| GND | - | 电源地 |
| TXD | 3.3V TTL | 模块串口发送,接MCU的RX |
| RXD | 3.3V TTL | 模块串口接收,接MCU的TX |
| EN/KEY | 3.3V TTL | 高电平进入AT指令模式,低电平/悬空为透传模式 |
| STATUS | 3.3V TTL输出 | 连接状态指示,连接成功输出高电平 |
接线这块有两个坑我需要特别提醒。
第一,AC6328A的串口电平是3.3V TTL,如果你的MCU用的是5V电平,比如老款Arduino UNO,一定要做电平转换或者用分压电阻把5V降到3.3V再进RXD。我见过不少朋友直接把5V单片机的TX接到模块RXD上,用了几次之后模块就再也没反应了,拆下来量才发现芯片已经烧了。
第二,EN/KEY引脚不能悬空不管。如果你想用默认配置直接透传,低电平或悬空没问题,但如果想改任何参数,必须先在上电前把EN引脚拉高,否则AT指令发过去全部石沉大海。这里说的“上电前”是硬性时序要求,不是上电后再拉高,很多新手在这个细节上栽跟头。
除了模块本身,还需要准备:
- 一个USB转TTL工具,推荐CP2102或CH340方案的,驱动稳定,别用那种几块钱的免驱版,兼容性太差。
- 一颗3.3V稳压芯片或带3.3V输出的开发板,给模块供电。虽然部分模块标了5.5V耐受,但长期用还是推荐3.3V供电。
- 串口调试助手,Windows下我用SSCOM,macOS/Linux下用minicom或CoolTerm都行。
2.2 进入AT指令模式的方法
AC6328A的启动逻辑比较简单但很严格,它通过上电瞬间的引脚电平状态来判断进入AT模式还是透传模式。
具体操作流程如下:
- 把EN引脚接到3.3V高电平。
- 给模块上电(VCC和GND接好)。
- 打开串口调试助手,波特率选择常见值(出厂通常为9600或115200,具体以模块铭牌为准),数据位8、停止位1、无校验。
- 发送AT测试指令,如果模块返回OK,说明已经进入AT模式。
这里有一个容易被忽略的细节:必须是“先拉高EN,再上电”。如果你先上电后拉EN,模块已经以透传模式启动了,这时候EN引脚不会再触发模式切换。要给模块重新断电再上电才能生效。
AC6328A在AT模式下,串口输出的是一些调试日志和[AT+OK]之类的响应文本,还有可能有乱码。如果你看到屏幕上跳出来一堆看不懂的字符,不用慌,这是模块内部协议栈的调试信息,不影响AT识别。有些固件版本可以通过AT指令关闭这些日志。
2.3 核心AT指令表与配置逻辑
AC6328A的AT指令集没有一个统一标准,不同固件版本多少有差异。我以最常用的一版固件为例,列出核心指令,大家拿到手先发AT确认固件版本,再对照自己的指令集调整。
| 指令 | 功能说明 | 返回值示例 |
|---|---|---|
| AT | 测试指令,确认串口通信正常 | OK |
| AT+NAME=XXX | 设置广播名称 | OK |
| AT+ROLE=M / AT+ROLE=S | 设置主/从模式 | OK |
| AT+BAUD=115200 | 设置串口波特率 | OK |
| AT+UUID=0xFFE0 | 设置服务UUID(16位) | OK |
| AT+CHAR=0xFFE1 | 设置特征值UUID | OK |
| AT+SCAN | 扫描周围广播设备 | +DISC: 地址,名称,RSSI |
| AT+CONN=MAC地址 | 主机主动连接指定从机 | +CONN:OK |
| AT+CONN=0 | 连接上次保存的设备 | +CONN:OK |
| AT+DISCON | 断开当前连接 | +DISC:OK |
| AT+RSSI | 查询当前连接信号强度 | +RSSI:-45dBm |
| AT+RESET | 软件复位模块 | OK |
| AT+VER | 查询固件版本 | +VER:V1.2.3 |
配置逻辑其实很简单,就三步走:先改角色,再改通信参数(名称、UUID、波特率),最后做连接操作。这里我不建议一上来就把所有参数改完,正确的做法是一次只改一个参数,改完发AT+RESET让模块重启,再继续下一步。如果所有参数一次性写完再重启,出了问题你根本不知道是哪个参数导致的。
关于UUID我再多说一句。BLE通信要建立起来,主机和从机必须使用同一组服务UUID和特征值UUID。市面上的通用透传模块通常默认采用0xFFE0/0xFFE1这一组,所以如果你拿两台同型号模块互连,不需要改UUID。但如果你要让AC6328A去连接一个自定义的蓝牙设备,比如自己做的心率计、温湿度传感器,必须先把UUID改成和设备端一致,否则扫描到也连不上。
3. 主从一体实战:从配置到透明传输
3.1 从机端配置流程详解
我先演示从机的配置,因为主机连接需要有目标从机存在,顺序上更合理。
假设我的场景是两个AC6328A模块做串口透传,A模块作为从机接在上位机USB转TTL上,B模块作为主机接在单片机UART上。我们一步步来。
第一步,按照上文的方法进入AT模式,发送AT确认模块在线。如果返回OK,继续,否则检查接线和EN时序。
第二步,设置从机模式:
AT+ROLE=S从机模式设置完成后,模块会停止扫描,进入持续广播状态。广播名称建议改成容易识别的,方便主机扫描时快速定位。
第三步,设置广播名称和设备参数:
AT+NAME=AC6328A_SLAVE AT+UUID=0xFFE0 AT+CHAR=0xFFE1这里有个细节:如果你在同一个串口会话里连续发送多条AT指令,需要等上一条返回OK之后再发下一条,不要一次性粘贴所有指令。模块的AT解析器在收到指令后需要时间处理,如果输入过快,部分指令会被丢弃,后续的所有配置都会乱套。
第四步,设置波特率。透传模式下两端模块的串口波特率必须一致,否则传出去的数据全是乱码。我这里统一用115200:
AT+BAUD=115200这里要特别提醒,AT+BAUD设置成功后,模块的串口波特率立即切换,不会再以旧波特率响应。你把波特率改成115200之后,串口助手必须立刻切成115200,否则后续所有指令都没反应。如果你不确定当前模块波特率是多少,可以在上电后逐个试9600、19200、38400、57600、115200这几个常见档位。
第五步,复位模块,让全部配置生效:
AT+RESET复位之后,模块会自动进入透传模式,以从机身份广播。如果此时用手机上的BLE调试工具,比如nRF Connect,应该能扫描到一个叫AC6328A_SLAVE的设备,服务列表里能看到UUID为0xFFE0的服务。
3.2 主机端配置流程详解
下一步配置主机端模块B。
第一步,同样先进AT模式,发AT确认在线。
第二步,设置主机模式:
AT+ROLE=M模块进入主机模式后,不会再被动等待连接,而是会主动扫描周围设备。如果你现在用手机扫,是扫不到这个模块的,因为它在主机模式下不广播。
第三步,执行扫描:
AT+SCAN扫描指令发出后,模块会持续工作几秒,然后返回周围发现的设备列表。设备列表的格式通常是:
+DISC:0A:00:00:11:22:33,AC6328A_SLAVE,-52这个格式依次是蓝牙物理地址、广播名称、信号强度RSSI。仔细核对名称,确保你要连接的确实是刚刚配置的那个从机模块,别连到旁边的AirPods或者别人的手环上。
如果列表里没有目标设备,先检查从机是不是还在正常广播,以及两个模块之间的距离。我实测下来,桌上放着一般没问题,但如果隔着金属外壳或者远距离,信号衰减会非常严重,RSSI低于-90dBm基本上是连不上的。
第四步,发起连接:
AT+CONN=0A:00:00:11:22:33连接建立后,模块会返回+CONN:OK。如果你的固件支持自动回连,配置过一次之后,下次上电发送AT+CONN=0即可快速重连上次的设备,不需要再次扫描。
第五步,设置相同波特率115200并复位:
AT+BAUD=115200 AT+RESET到这里,主机端配置完成,两端都是115200波特率,服务UUID一致。
3.3 建立连接与数据透传验证
现在两端都复位到了透传模式。上电后,从机开始广播,主机会按照内部配置自动扫描并连接之前保存的目标从机。此时你观察两个模块的STATUS引脚,连接成功后它们都会输出高电平。
验证透传最直观的方式是回环测试。我在实际调试中喜欢用这种办法:
- 主机端连接USB转TTL到电脑,串口助手打开COM口,波特率115200。
- 从机端连接另一个USB转TTL到电脑,同样打开串口助手,波特率115200。
- 在从机端串口发一段字符,主机端应该能收到同样的字符,反过来从主机发给从机也行。
如果数据收得到,说明整条链路已经打通,透明传输没问题。我给这个环节起个名字叫“双串口回环验证法”,它是我每次做蓝牙透传项目必跑的一步,能在最短时间内确认链路可用性,再把复杂的业务逻辑接进来。
到这里,最基础的主从透传已经实现了。再往深一点,如果单片机端的MCU要主动发送数据给上位机,只要把MCU的串口TX接到主机模块的RXD即可,MCU完全不需要关心蓝牙协议栈的细节,只需要按照串口115200、8N1格式发数据。
3.4 进阶场景:主从切换与双设备互联
有些项目需要A端既能主动发数据给B端,又能在需要时被C端控制。这时就要用到“同一模块在不同时刻切换主从角色”的能力。
操作命令很简单:
AT+ROLE=S AT+RESET模块重启后变为从机模式,可以被其他主机连接。需要切回主机时:
AT+ROLE=M AT+CONN=0 AT+RESET但我要给大家提个醒:这套“软切换”流程需要模块重启,丢数据是必然的。如果你的系统对实时性要求高,切换角色前必须确保当前没有正在传输的业务数据,否则会造成半包、丢包。在设计通信协议时,最好预留一个“角色切换”命令,让对端知道接下来可能有几秒不可用,避免误判为故障。
另一个进阶场景是透传带协议。刚才做的是最原始的“裸透传”,直接串口数据转发。但真实项目里,波特率不一致、半包问题、粘包问题都可能导致对端解析失败。我建议在应用层做一个简单的帧协议,比如定义帧头、长度、CRC校验,这样即使蓝牙链路有一两个字节的偶然错误,接收端也能通过校验发现并重发。
4. 常见问题排查与避坑经验
4.1 连不上、指令无响应等高频故障定位
我调试蓝牙模块这几年,把高频故障总结成一张速查表,你们可以按图索骥:
| 现象 | 可能原因 | 排查思路 |
|---|---|---|
| AT指令无任何返回 | EN引脚未拉高或上电时序错误 | 断电,把EN接3.3V再重新上电 |
| AT指令返回乱码,但仍能收到OK | 波特率不匹配 | 逐个尝试9600/19200/38400/57600/115200 |
| 扫描不到从机 | ②从机未正确进入广播模式 | 确认从机ROLE=S,且STATUS引脚为低电平 |
| 扫描到但连接不上 | UUID不一致 | 对比两端AT+UUID和AT+CHAR是否一致 |
| 连接后立刻断开 | 信号强度太差或从机地址变了 | 查看RSSI,确保大于-80dBm;重新扫描确认地址 |
| 透传数据全是乱码 | 两端波特率不一致或者数据位校验位设置不一致 | 统一两端波特率,建议8N1 |
这里面有个最常见的问题就是“AT指令没反应”。我怀疑很多模块不是坏了,而是上电时序错了。我的建议是:别怕麻烦,每次调试都严格按“EN拉高->上电->等1秒->发AT”这个顺序来,把操作固化成肌肉记忆,问题直接少一半。
如果你确定时序没问题、波特率也正确,但AT还是不响应,那可能是模块出厂默认波特率不是常规档位。部分定制固件会把波特率设成921600或者19200,这种情况就得用逻辑分析仪在模块TXD脚上抓波形,看实际波特率是多少。
4.2 透传丢包、乱码的深层原因与处理
连接建立成功但数据传错,这个问题比连不上更让人头疼。我遇到过几个典型情况,分享给各位。
第一个是供电问题。AC6328A在发射瞬间的峰值电流可以达到几十毫安,如果供电线太细或者USB转TTL工具的输出能力不够,电压会被拉低,导致模块射频前端工作异常。我实测下来,USB口接独立供电和直接用杜邦线从Arduino的3.3V引脚供电,透传丢包率有明显差异。建议模块供电用独立的LDO稳压输出,并且电容尽量靠近模块电源引脚放置。
第二个是串口缓冲区溢出。AC6328A的串口接收FIFO并不大,如果主机一次性发几百个字节过去,模块还来不及通过蓝牙发出去,后续的串口数据就会覆盖FIFO,造成丢包。解决办法是应用层做分包发送,我一般每包控制在20字节以内,包与包之间留10到20毫秒间隔。如果你的数据量很大,可以考虑启用模块的流控引脚,但大多数模块没有引出RTS/CTS,所以分包的思路更实用。
第三个是空中干扰。2.4GHz频段不只有蓝牙,Wi-Fi、微波炉、无线鼠标都在这个频段抢信道。如果环境中2.4GHz设备特别多,连接不稳定是常态。缓解办法是让模块使用BLE扩展广播或者跳到干净的信道,不过AC6328A默认协议栈不开放手动改信道,实战中更有效的办法是缩短两端距离、减少遮挡物。
4.3 AT配置无法保存的坑与恢复默认配置
我在群里见很多朋友反馈:AT指令明明返回OK了,断电重启之后配置全丢,又回到出厂状态。
这个问题多半是模块固件里配置保存标志位没有触发,或者写入Flash失败。AC6328A在AT模式下修改参数后,需要用AT+RESET软复位一次,让固件把当前RAM里的配置同步到Flash。如果你改完参数直接断电,配置可能还没落盘,重启后自然就还原了。
另外,如果你的模块已经改得乱七八糟,找不回正常工作状态了,可以直接恢复出厂设置。多数固件支持这条指令:
AT+RESTORE或者通过模块上的恢复按键触发:按住按键上电,保持几秒后松开,模块清空所有配置并恢复默认参数。恢复之后重新配置一遍即可。
我个人建议,在项目量产阶段,预先写一个配置文件,把整套AT指令放在上位机脚本里,一键配置,比手工逐个敲指令高效得多,也能避免人为错误。
4.4 手机连接不上或无法做透传测试
很多朋友习惯在调试时用手机上的BLE工具来测试透传,但发现手机虽然能连上模块,却发不了数据,或者收不到数据。这里要理解一个关键差异:BLE通信不是简单的“管道”,而是基于GATT的服务和特征值。
AC6328A透传框架里,0xFFE0服务下的0xFFE1特征值通常是可读写、可通知的。手机端要正确接收模块的数据,必须先对这个特征值开启通知(Notification),否则模块发给手机的数据会被丢弃。在nRF Connect里,操作路径是:
- 连接模块。
- 找到0xFFE0服务。
- 点开0xFFE1特征值。
- 点击“Enable Notifications”。
开启通知后,模块串口收到的数据会以Notification的形式推送到手机APP,手机端往0xFFE1写入数据,也能通过模块串口发出来。
另一个手机连不上的原因是模块的广播参数。部分模块默认广播间隔很长,手机APP可能扫描不到。遇到这种情况,可以短按模块上的配对按键,触发一次快速广播,大多数手机工具都能立刻扫到。
5. 实测总结:一条主从透传链路的完整验证记录
最后我再分享一次完整的实测记录,用的是手头两块AC6328A模块,一块做主机,一块做从机,中间做数据传输测试。这个过程可以当做一个标准验收流程,建议所有朋友在项目交货前都跑一遍。
测试环境:
- 主机模块 FW版本V1.2.3,从机模块同批次。
- 两个模块分别通过两个CH340G USB转TTL接入同一台电脑的不同COM口。
- 波特率统一115200,8N1。
- 两端间距1米,无遮挡。
配置过程:
- 从机:AT确认 -> AT+ROLE=S -> AT+NAME=TEST_S -> AT+UUID=0xFFE0 -> AT+CHAR=0xFFE1 -> AT+BAUD=115200 -> AT+RESET。
- 主机:AT确认 -> AT+ROLE=M -> AT+SCAN(返回TEST_S的MAC)-> AT+CONN=MAC -> AT+BAUD=115200 -> AT+RESET。
- 复位后分别打开两个串口窗口,从机端COM口发送“Test123”,主机端立即收到“Test123”。
- 反向发送“Pong456”,从机端也能收到。
连续测试10分钟,统计发送1000包数据(每包16字节),在无干扰环境下丢包为0,耗时约1分20秒。把距离拉到10米后,丢包开始增加,RSSI约为-78dBm,这就是能稳定工作的临界值。如果大家后续要做远距离传输,考虑加外部PA或者换更有方向性的天线设计。
我在实际测试中还发现一个情况:如果主从模块在开机后没有自动回连成功,主机的STATUS引脚会一直保持低电平。这时候只要给主机发送AT指令重新执行一次AT+CONN=0,链路很快就能恢复。这个过程可以用MCU的一个GPIO来检测并自动触发重连,我在项目里就写了一段简单的逻辑,检测到STATUS低电平超过5秒就拉高EN重启模块,实际运行非常稳定。
这套主从一体配置方案我已经在几个项目里反复用了,包括两板卡之间的无线数据同步、手持设备与工装的无线配置下发。AC6328A的性价比和灵活性都是非常出色的。如果你手头的项目正好有类似需求,完全可以按照这篇文章的思路,从AT指令入手,把主从透传链路打通,然后在上层去实现你自己的业务逻辑。