ARTICLE DETAIL

资讯详情

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

JDY-33蓝牙模组实现无线串口通信,告别USB线束缚

JDY-33蓝牙模组实现无线串口通信,告别USB线束缚 做嵌入式开发的朋友应该都有过这种体验调试摆臂机器人、四轴或者手持设备时板子和电脑之间永远拖着一根USB线稍微挪个位置就得小心翼翼线材老化接触不良还会导致偶尔的通信失败。JDY-33这颗蓝牙模组我愿称之为“无线串口届的万金油”它的核心用途就是把传统UART串口信号变成蓝牙无线信号让PC或手机可以隔着几米甚至十几米跟开发板通信。这篇文章我会从模组选型、硬件接线、AT指令配置到实际代码示例完整走一遍用JDY-33打通PC与开发板通讯的流程并对常用AT指令做一个实测整理。不管你是刚入门的单片机爱好者还是调试过程中被线缆束缚的嵌入式工程师这套方案都能直接抄作业。1. JDY-33蓝牙模组是什么为什么选它来做无线串口1.1 模组定位与核心参数JDY-33是市面上常见的一款低成本蓝牙透传模组本质上它就是一个把串口数据“塞进”蓝牙协议的透明管道。你往它的TXD/RXD引脚扔什么数据另一端配对的设备就能收到什么数据反之亦然完全不需要关心蓝牙协议栈的实现细节。对开发者来说它就是一个“没有线的串口线”。我手里这颗模块主要参数如下工作电压3.3V5V板载LDO所以用开发板上的3.3V或者5V供电都能跑支持蓝牙BLE和经典SPP两种模式也就是说既能连手机APP也能连电脑的蓝牙适配器默认串口波特率一般是9600可以通过AT指令改到1200921600区间空旷环境通信距离实测在10米左右隔一堵墙会衰减到五六米够大多数桌面调试场景用。体积大概一元硬币大小四颗2.54mm排针引出VCC、GND、TXD、RXD面包板也能直接插。需要注意不同批次固件在指令集和默认状态上可能有一点差异但核心功能是一致的。我测试的是常见的出厂固件版本文章里每个指令都实际跑过稳定复现。1.2 为什么不用ESP32自带蓝牙或HC-05——选型思路很多人会问ESP32本身就带蓝牙直接用不好吗或者用老牌的HC-05/HC-06不是更大众这里说下我的选型逻辑。ESP32的蓝牙虽然功能强大但BLE和SPP的开发都依赖ESP-IDF或Arduino库。如果只是想把一个串口设备无线化为了这点功能去写蓝牙回调、GATT服务完全是杀鸡用牛刀。而且ESP32本身是主控占用它去做透传角色属于浪费算力。HC-05是经典SPP模组稳定性没问题但它不支持BLE新出的笔记本电脑和手机对经典蓝牙SPP的支持越来越差很多安卓手机从Android 8开始就砍掉了SPP接口Windows 10/11也逐步移除了系统级SPP支持直接用PC蓝牙连HC-05会非常痛苦。JDY-33的优势在于它“两条腿走路”既可以走BLE用手机调试也能切换到SPP模式配合PC的串口工具或USB蓝牙适配器使用。再加上它的成本只有几块钱供电范围宽对新手极其友好。如果你只是需要给现有项目快速加一个无线调试通道JDY-33是性价比很高的选择。2. 硬件准备与接线把模组“唤醒”2.1 材料清单与工具选择在动手之前先把准备工作做齐。我列一份参考清单JDY-33蓝牙模组2个PC端和开发板端各一个如果只是PC直连开发板开发板自带蓝牙则只需1个但使用两个模块的无线串口桥接方案最通用USB转TTL模块1个推荐CP2102或CH340芯片的注意选择带3.3V/5V电平跳线的型号杜邦线若干公对母、母对母都备一点开发板任意STM32、ESP32、51、树莓派Pico都可以本文章节4以STM32F103为例电脑上安装串口调试助手Windows推荐XCOM或SSCOMmacOS推荐SerialLinux用户直接minicom或screen就行这里特别说一下USB转TTL模块它是PC侧与JDY-33之间的“翻译官”因为电脑本身没有UART接口必须通过USB转串口芯片虚拟出一个COM口。CH340便宜且够用CP2102的抗干扰和稳定性稍好实际调试中两者差别不大哪个顺眼用哪个。2.2 接线原理与注意事项JDY-33的接线非常简单但有一个新手最容易踩的坑TXD和RXD要交叉连接。也就是说模组的TXD要接USB转TTL模块的RXD模组的RXD要接USB转TTL模块的TXD。因为串口通信是“你发送我接收”两个设备的发送脚如果接到一起谁也收不到谁的数据。以USB转TTL模块那一侧为参照接线关系如下JDY-33引脚接USB转TTL模块说明VCC3.3V或5V推荐3.3V发热更小GNDGND必须共地否则电平无法判断TXDRXD模组发送电脑接收RXDTXD电脑发送模组接收通电之前再检查一遍VCC和GND有没有接反接反了模块会直接冒烟。另外如果USB转TTL模块是5V供电输出而JDY-33的RXD引脚不是5V耐受设计最好把模块供电跳到3.3V或者用电阻分压。不过大多数标称宽电压的JDY-33内部有电平转换处理我实测5V供电也能正常工作但为了长期稳定还是建议3.3V供电。2.3 上电验证第一句AT指令接好线后把USB转TTL模块插到电脑打开设备管理器确认COM口号。然后打开串口助手按下图设置波特率9600数据位8停止位1校验位None打开串口这时候给模块上电USB转TTL的供电开关或者直接插上USB即可串口助手可能收到一条类似BTAUTHREQUEST或启动日志的信息不用管它。然后在发送区输入AT两个大写字母注意勾选“发送新行”或手动加上回车换行也就是发送AT\r\n点击发送。如果一切正常接收区会立刻回显OK。看到这两个字母恭喜模组已经活了串口链路是通的接下来就可以进入配置阶段。如果没有反应不要急着怀疑模组坏了先用万用表量一下VCC对GND是否有3.3V左右电压以及TXD/RXD有没有接反。我遇到过九成的问题都是这两类。3. AT指令配置让模组按你的规则工作3.1 AT指令工作模式与发送格式JDY-33上电后默认工作在透传模式也就是数据直接收发。但如果串口收到特定格式的AT指令它会临时切换到命令模式对配置进行修改。这里有个容易混淆的点不是所有AT指令都能在透传状态下乱发比如ATNAME这种修改参数的指令在连接状态下可能无效或者会中断连接。最稳妥的做法是模组上电后不连接任何设备处于待机状态时再通过串口发AT指令。发送格式方面所有指令以AT开头以回车换行结束也就是常见的\r\n。我一般建议在串口助手打开“发送新行”功能这样每条指令后面会自动追加回车换行。有些模组对\n或\r的结尾敏感如果指令没响应试试把“发送新行”改为“发送CRLF”再试一次。在代码中发送时记得在指令字符串末尾拼接\r\n否则模组会一直等待不处理。3.2 JDY-33常用AT指令大全实测整理下面是我在JDY-33上逐一测试过的指令清单按功能分类整理成表格方便大家直接查阅。指令参数与示例功能说明AT无测试指令返回OKATNAMEATNAMEJDY33设置广播名称最长不超过11个字符ATBAUDATBAUD9600设置串口波特率常见值1200/2400/4800/9600/19200/38400/57600/115200ATROLEATROLE0设置主从模式0从机1主机部分固件为0从1主2回环ATMAC无查询模块MAC地址ATTYPEATTYPE0设置蓝牙类型0表示BLE模式1表示SPP模式2表示双模ATUUIDATUUID0xFFE0设置BLE服务UUID两位或四位十六进制ATCHARATCHAR0xFFE1设置BLE特征值UUIDATPOWRATPOWR0设置发射功率等级0~30最强ATENLOGATENLOG1关闭/开启调试日志输出0关闭1开启ATDEFAULT无恢复出厂设置ATRESET无软复位模块ATCLEAR无清除配对信息ATCONNATCONNMAC地址主机模式下主动连接指定从机ATDISC无断开当前连接ATRADD无查询上次连接的从机MAC地址注意ATROLE和ATTYPE在不同固件下含义可能略有差异。比如有些固件里ATROLE1表示从机2表示主机。拿到模块后第一件事就是先发ATDEFAULT恢复出厂再发ATROLE?或ATROLE?查一下当前支持的值范围别照着网上老版本的参数直接改不然容易把自己绕晕。3.3 配置实例设置从机、名称与波特率假设我们做最简单的应用场景JDY-33一个接PCUSB转TTL一个接开发板两者组成无线串口桥。那这两个模块的角色一个设成主机、一个设成从机由主机主动去连接从机。以“PC端模块作为从机开发板端模块作为主机”为例先在PC端USB转TTL已经连好了的那个模块依次执行ATDEFAULT ATROLE0 ATNAMEPC_SLAVE ATBAUD115200 ATRESET每条指令都要等模组返回OK再发下一条复位后重新等待约2秒。如果想把波特率改成115200记得PC端串口助手的波特率也要同步改成115200再发送后续指令否则就会出现“指令发过去没反应接收区全是乱码”的现象这是新手高频翻车点。改波特率之前也请先确认你的USB转TTL和开发板能不能稳定跑这个速率如果不能稳定9600其实完全够用。开发板端模块同样接线到另一个USB转TTL执行ATDEFAULT ATROLE1 ATNAMEDEV_MASTER ATBAUD115200 ATRESET两个模块配置完成后给主机上电它会自动搜索周围的从机并尝试连接。连接成功之后从机的STATE引脚电平会变化或者主机返回CONNECT OK之类的提示信息。不同固件提示信息不同遇到没有提示的情况直接发一段测试数据看另一端能不能收到即可。4. PC与开发板无线通讯从“零”到“通”4.1 整体通讯拓扑解析当两个JDY-33成功配对后整个链路可以这样理解PC上打开的串口助手往COM口写入数据USB转TTL模块把电平变成UART信号发给“从机JDY-33”“从机JDY-33”把数据通过蓝牙射频发出“主机JDY-33”从空中收到数据包从自己的TXD引脚吐出来开发板的UART RX引脚再把数据收进内存。整个链路对PC和开发板来说完全透明双方都以为自己在跟一根正常的串口线通信。也就是说JDY-33的本质作用是把“物理导线”替换成了“无线射频管道”。你不需要在PC端写任何蓝牙协议代码也不需要给开发板移植蓝牙库所有代码都还是基于最普通的printf和串口中断实现。这是我觉得它最有价值的地方对现有工程改造成本无限接近零。4.2 开发板端串口初始化与数据收发代码以STM32为例开发板端的任务是初始化USART把JDY-33的TXD/RXD接到对应的USART引脚然后在中断回调里处理收到的数据。以STM32F103C8T6 HAL库为例接线如下JDY-33 VCC - 3.3VJDY-33 GND - GNDJDY-33 TXD - PA10USART1_RXJDY-33 RXD - PA9USART1_TX初始化代码在MX_USART1_UART_Init里设置波特率115200、8位数据、1位停止位然后在主循环或中断里收发。uint8_t rx_buffer; uint8_t echo_buffer[128]; uint16_t echo_len 0; void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if (huart-Instance USART1) { echo_buffer[echo_len] rx_buffer; if (echo_len 128) { echo_len 0; } // 将收到的一个字节原样发回验证通路 HAL_UART_Transmit(huart1, rx_buffer, 1, 100); HAL_UART_Receive_IT(huart1, rx_buffer, 1); } } int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_USART1_UART_Init(); HAL_UART_Receive_IT(huart1, rx_buffer, 1); while (1) { // 应用逻辑 HAL_Delay(10); } }这段代码的逻辑很简单每次收到一个字节把它存进缓冲区然后原样回传再继续接收下一个字节。在PC端的串口助手里发送“Hello JDY-33”应该能立刻收到一模一样的字符串这就代表整个无线链路双向打通了。实际项目里你可以把echo_buffer里的数据解析成指令控制LED、电机或者上报传感器数据。4.3 PC端串口助手与Python收发验证如果只是想手工验证链路通不通用串口助手最方便。将PC端的串口打开波特率设为115200发送任意字符串然后在开发板端通过LED反转、串口返回等方式确认收到。如果开发板接了OLED或者调试屏也可以把收到的字符显示出来直观感受“明明隔着一两米却跟插着线一样”。不过串口助手只能手动操作自动化测试或者后续做上位机时我更推荐用Python。pyserial库可以让PC在代码里直接读写COM口这样可以写一个脚本循环发送数据自动比对开发板回传的内容。import serial import time ser serial.Serial(COM10, 115200, timeout1) def test_loop(times10): for i in range(times): msg ftest_{i}\r\n ser.write(msg.encode()) time.sleep(0.2) resp ser.read_all().decode(errorsignore) print(fsend: {msg.strip()} - recv: {resp.strip()}) test_loop() ser.close()这段脚本每200毫秒发送一条带序号的字符串然后打印开发板回传的数据。如果回传数据偶发丢失或者乱码那就要回头检查波特率是不是真的匹配、供电是不是充足、两个模块之间的距离是不是太远。我也遇到过USB转TTL模块本身不稳的情况尤其是笔记本USB口供电不足时串口会出现周期性丢字节换个USB口或加根带屏蔽的线就好很多。5. 常见问题与排查技巧实录5.1 问题速查表这里把这段时间调试JDY-33过程中遇到的高频问题整理成一张速查表按“现象—原因—解决办法”的格式列出方便大家快速定位。现象可能原因解决办法发送AT无任何返回波特率不对、TXD/RXD接反、模块未上电检查电源电压交叉检查TX/RX尝试常见波特率逐个扫描接收区全是乱码两端波特率不一致确保USB转TTL和模组配置的波特率相同一般9600或115200能收到数据但丢字节供电不足、通信距离过远、干扰严重改用独立3.3V供电缩短距离降低波特率到9600AT指令返回ERROR指令格式不对、当前固件不支持该指令确认指令结尾带\r\n查看规格书确认真实指令名主机搜不到从机主从角色配置错误、从机广播关闭、MAC地址不可见用ATROLE确认角色从机发送ATNAME配置名称距离靠近再试连接成功后无法透传误入AT指令模式、串口参数被改动、模块未复位发送ATDISC断开后重连检查波特率恢复出厂设置ATDEFAULT断电重连后配置丢失配置未写入Flash或操作顺序不对配置完成后发送ATRESET等待稳定后重新上电5.2 独家调试心得与避坑指南写到这里分享几个实操中摸索出来的经验。第一配对成功后先不要急着写代码。先把PC端串口助手打开开发板端程序里做一个最简单的“收到什么就原样回传”的循环两端先跑通物理链路再往工程里加业务逻辑。这样一旦出问题能快速定位是链路问题还是业务代码问题不会两个因素搅在一起越查越乱。第二JDY-33的RXD/TXD引脚在3.3V逻辑下工作最稳定。如果你用的开发板是5V的IO电平比如老款AVR或者51单片机建议用两个电阻分压把5V降到3.3V再接RXD否则长期运行有烧引脚的风险。当然你也可以直接用3.3V供电的开发板比如STM32F103大部分IO可以容忍5V但ESP32、nRF52这类3.3V MCU就没这个问题麻烦少一些。第三模组供电尽量别直接跟电机、舵机共用一个电源轨。蓝牙射频对电源纹波比较敏感电机启动瞬间的压降会导致模组复位或者数据出错。我做一个小四轴调试时就踩过这个坑电机一转PC端立刻掉线后来把模组的VCC单独接到一个LDO输出问题迎刃而解。如果项目空间紧张至少也要在模组供电脚并联一个100uF电解电容和0.1uF陶瓷电容。第四如果板子上有多个串口设备一定注意中断优先级和接收缓冲。JDY-33的透传波特率最高可以跑921600但MCU中断处理不过来时数据就会溢出丢包。我的经验是单纯做透传转发115200对绝大多数场景都是甜点速率超过这个值就要用DMA或者在协议层加重传机制否则省下的时间都会花在查丢包上。我个人在实际项目里还习惯把模块的STATE引脚接一个LED或GPIO做连接状态指示。JDY-33这类模组在未连接时和已连接时STATE引脚的电平或闪烁频率会有变化看到状态灯就能确认链路正常省去了反复看串口日志的麻烦。调试完成后再把这个引脚腾出来不影响其他功能。最后再分享一个小技巧如果PC没有蓝牙适配器或者不想专门买个USB转TTL模块插在电脑上也可以用手机下载一个“蓝牙串口”类APP先跟JDY-33的从机配对然后在APP里收发数据。这样做的好处是能快速验证模组本身工作是否正常同时也能测出模组的真实广播名称、UUID等参数。等手机通路确认没问题了再切回PC和开发板的完整链路排查范围马上缩小一半。
返回列表