最近用STM32驱动ADS1256做了个数据采集系统(DAQ),在电脑端用MATLAB设计了APP,通过RS232转USB数据线实现了数据的串口收发和实时显示。上位机通过串口发送指令,可以设置单片机和ADC的参数,比如波特率、采样速率、增益、数据包长等等。为了摆脱数据线的束缚,最近又学习了一下蓝牙模块的使用,实现了上位机与下位机之间的无线交互。以下是实现的方法:

所需材料

图1. 主要材料:左边为数据线,右边为蓝牙模块

所需的材料很简单,一条USB转TTL串口线,2个蓝牙模块,几条杜邦线。蓝牙模块选用的是HC-05主从一体模块。

一个蓝牙模块与串口线连接。接线时需要注意:RXD连对方的TXD,TXD连对方的RXD。另外两个引脚,VCC和GND与对方同名端连接。STATE和EN引脚悬空。接好后通过USB口接到电脑上。通常还需要安装USB转串口模块中转换芯片的驱动,安装好以后在设备管理器-端口区才能查询到对应的端口号。

另一个蓝牙模块连接到STM32。我用的是USART1,因此蓝牙模块的RXD接PA9,TXD接PA10,VCC接5V,GND接地。STATE引脚用于监控蓝牙工作状态,蓝牙配对成功时会在这个引脚输出一个高电平。EN引脚用于使能蓝牙芯片,接高电平使模块进入AT命令模式,接低电平使模块进入正常工作模式。STATE和EN接两个方便使用的GPIO即可,比如分别接PB0和PB1。如果不需要在下位机控制蓝牙模块,这两个引脚悬空即可。

两个蓝牙模块的绑定

要实现两个蓝牙模块间的通信,首先要将它们配对。我们将与上位机连接的蓝牙模块A设为主模式,与STM32连接的蓝牙模块B设为从模式。二者设置和建立连接的步骤如下:

  1. 恢复出厂设置:将串口线连接到电脑,将模块A与串口线连接。此时模块默认进入工作模式,红灯高频闪烁。电脑上打开串口助手,按住模块上的黑色按钮,发送AT+ORGL,恢复出厂设置。
  2. 进入AT命令模式:为了避免每次发送命令都按黑色按钮,可将模块拔下,先按住黑色按钮再插回去,此时模块进入AT命令模式,红灯低频闪烁,可以连续发送命令。
  3. 查询模块地址:电脑上打开串口助手,连接串口。AT命令模式下默认波特率为38400,停止位1,校验位none。发送AT+ADDR?,串口助手会收到类似这样的信息:+ADDR 98D3:31:F6DAB8 OK。中间冒号间隔的3个字段即为蓝牙模块的地址。
  4. 设置波特率:发送AT+UART=230400,0,0,逗号间隔的3组数字分别为波特率、停止位(0-1位;1-2位)和校验位(0-none;1-odd;2-even)。HC-05数据位是8。HC-05支持的波特率为:9600,19200,38400,57600,115200,230400,460800。设置完成后可以发送AT+UART?查询是否设置成功。
  5. 设置工作模式:串口助手发送AT+ROLE=1,将模块A设为Master模式。如果发送0设为Slave模式;发送2设为Slave-loop回环模式。
  6. 设置模块名称:发送AT+NAME=Master,重命名模块A。默认名称为HC-05。重命名是为了便于识别。
  7. 完成上述设置后将模块A取下,将模块B接到串口线上。重复上述步骤1-6。注意:第5步要将模块B设为从模式,第6步将模块命名为Slave。
  8. 绑定到主模块:发送AT+BIND=98D3,31,F6DAB8。逗号间隔的为主模块的地址。修改连接模式:发送AT+CMODE=0,修改连接模式为指定蓝牙地址。如果不修改,默认值为1,即任意地址都可以连接。由于只有2个蓝牙模块,这一步忽略也没问题。蓝牙模块较多时,可将从模块都绑定到主模块并修改连接模式为指定地址,通过拉低EN引脚选择要通信的从模块。
  9. 设置完成后将模块B取下,接到单片机上。将模块A重新插回串口线。这次不要按住黑色按钮,默认进入工作模式。从模块B也上电。两个模块上的指示灯一开始是快闪,自动搜索并完成连接后会变为间歇双闪,即快闪2次间隔2秒。

图2. 建立连接后的蓝牙模块。上方为从模块。

完成上述设置,两个蓝牙模块就建立连接了。由于HC-05蓝牙模块是串口透传,连接后跟使用普通串口是一样的,只是二者之间不再需要物理线缆直接相连罢了。

效果展示

图3. 上位机实时画面

STM32驱动ADS1256采集两路信号,通过蓝牙发送到计算机,结果如上图所示。双方数据和指令交互非常顺畅。

总结

  • 两个蓝牙模块一个设为主模式,一个设为从模式。从模块绑定到主模块的地址。
  • 两个模块的串口参数要严格一致。
  • 连接成功后作为无线串口使用即可。如果不用STATE和EN引脚,原来的程序无需任何改动。
  • 下次通电后,两个模块会自动建立连接。