基于STM32的无线通信模块使用——HC_05蓝牙串口

本文详细介绍了一款HC-05蓝牙串口模块的配置与使用方法,包括模块的供电、AT指令集配置、PC端及手机端连接步骤,以及STM32串口配置模块的使用指南。此外,还涉及串口通信、模块小结等内容,旨在帮助用户快速掌握该模块的使用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注:以下某些资料来自于该模块淘宝店里有介绍,规格书没找到啊。

  • 模块介绍
  • PC端配置模块,手机端连接模块
  • STM32串口配置模块
  • 串口通信
  • 小结

一、模块介绍

1、供电电压3.3V~3.6V;
2、支持AT指令集配置模块;
3、采用CSR主流蓝牙芯片,蓝牙V2.0协议标准;
4、波特率最高为1382400bps;
5、配对以后当全双工串口使用,无需了解任何蓝牙协议,但仅支持8位数据位、1位停止位、无奇偶校验的通信格式,这也是最常用的通信格式,不支持其他格式。
6、接口电平3.3V,可以直接连接各种单片机(51,AVR,PIC,ARM,MSP430等),5V单片机最好串联一个1K电阻再与模块直接连接,无需MAX232也不能经过MAX232!

二、PC端配置模块,手机端连接模块

如果要配置模块的参数,那么就必须要进入AT命令模式,我们首先通过PC机来配置一个模块。

1、进入AT模式设置

1.1、通过一条USB转串口线与模块相连,注意是要交叉连接。
1.2、在PC端上使用串口调试助手设置正确的波特率、校验位、停止位。AT模式下波特率固定为38400bps。这个波特率是不能更改的。
1.3、进入AT模式有如下两种方法:

1:在模块上电之前(也可以同时),把KEY脚设置为高电平(或接VCC),然后再对模块上电。此时LED慢闪(2S一次),模块进入AT状态,波特率固定为38400.
2:在模块上电的时候,把KEY脚设置为低电平(或接GND),此时LED快闪(1S两次),然后再把KEY脚设置为高电平(或接VCC),模块也会进入AT指令,但是LED依旧快闪,此时波特率为默认波特率9600.

按照上述的方法,进入AT模式后,此时led由原先的快闪变成2s闪一次,在串口调试助手中输入”AT”,如果响应”OK”,说明进入AT命令模式成功,此后就可以测试其他的命令了。注意,AT指令集最后面都要跟着发送 \r\n也就是回车换行符,这样模块才认这个指令

2、模块的配置为从机

从机只能用来被搜索,不能主动搜索其他设备。
因为前期是要熟悉模块的配置以及使用,所以先配置为从机供其他设备(PC机、手机)搜索连接。在PC机上的串口调试助手中依次输入如下AT指令进行配置。
-> 首先回复初始化设置 AT+ORGL
初始化设置

-> 设置从机名字 AT+NAME=SLAVE
设置名字

-> 设置波特率 AT+UART=115200,1,2
设置波特率

-> 设置为从机角色 AT+ROLE=0
设置设备角色

-> 重启设备 AT+RESET
重启设备

当重启设备成功后,此时模块会自动进入正常工作模式(还未被连接或连接上)led快闪

3、通过手机蓝牙连接模块

按照上面的步骤配置完成后,无论是通过手机或者是PC机都可以进行配对连接。手机的话可以安装”蓝牙串口助手”与模块进行配对连接,这样两者之间就可以与模块进行通信了。当两者连接成功后,模块进入透传模式,此时led等2闪1停。

三、STM32串口配置模块

若未进行初始化操作,该模块只需配置一次即可使用。在使用的时候,我们可以通过PC来配置模块,当然也可以通过软件来配置模块。两者实际上是一样的,都是通过串口往模块写入AT指令。在PC端我们通过串口调试助手写入一个AT指令,模块就会响应相应的内容显示在串口调试助手上,我们也就能判断刚刚写入的指令是否OK。但是,通过stm32的串口配置模块有一点需要注意的,那就是要准确的识别模块的响应操作的内容。

1、写入指令
// 往串口中写入指定大小的数据
int16_t WriteATCmd(USART_TypeDef* USARTx, char *cmd, uint16_t size)
{
    uint16_t i = 0;
    if(cmd != NULL)
    {
        for(i=0; i<size; i++)
        {
            USART_TrasmitData(USARTx, cmd[i]);
        }
        // 注意最后要写入 \r\n
        USART_TrasmitData(USARTx, 0x0d);
        USART_TrasmitData(USARTx, 0x0a);
        return 0;
    }
    else
    {
        printf("cmd is NULL\n");
        return -1;
    }
}
// 设置模块名称
int16_t HC_05_ATName(char *name)
{
    uint16_t cmd_size = 0;
    uint16_t name_size = 0;
    int16_t ret = 0;
    int16_t res_size = 0;
    // 存放模块响应字符串的数组,这个数 组的长度可以根据AT指令集文档中响应的字符串长度做调整
    char respon[10] = {0};        
    char AT_NAME_CMD[20] = "AT+NAME=";
    name_size = strlen(name);
    cmd_size = strlen(AT_NAME_CMD);
    // 当name的长度过大,只取20-cmd_size个字符
    if((name_size+cmd_size) > 20)
        strncat(AT_NAME_CMD, name, 20-cmd_size);
    else
        strcat(AT_NAME_CMD, name);
    cmd_size = strlen(AT_NAME_CMD);
    // 通过STM32的USART1往串口写入数据AT_NAME_CMD,共写入cmd_size大小
    ret = WriteATCmd(USART1, AT_NAME_CMD, cmd_size);
    if(ret == 0)
    {
        printf("Write AT_NAME_CMD OK\n");
    }
    else
    {
        printf("Write AT_NAME_CMD ERROR\n");
    }
    res_size = ReadResponse(USART2, respon);
    ret = isResponseOK(res_size, respon);
    return ret; 
}
2、读取模块的响应数据

当写入AT指令正确后,模块就会响应一个相应的字符串给我们,从HC-05 AT指令集的文档中我们看到,无论写入哪种AT指令,如果正确,最终都会反馈一个”OK”的字符串,我们可以通过这个字符串来判断写入的指令是否响应正确。

int16_t ReadResponse(USART_TypeDef* USARTx, char *Str)
{
    uint16_t data = 0;
    uint16_t Status = 0;    
    uint16_t pos = 0;
    int16_t size = 0;
    while(1)
    {
        // 每次从串口读取一个字符前都要启动定时器
        TIM2_Config_Init(1000);
        TIM_Cmd(TIM2, ENABLE);
        while(USART_GetFlagStatus(USARTx, USART_FLAG_RXNE) == RESET)
        {
            // 表示已读取到末尾
            if(Status == 1)
            {
                size = strlen(Str);
                TIM_Cmd(TIM2, DISABLE);
                break;
            }
            // 表示已经超时,此时不再等待从串口中读取数据
            if(TimeoutFlag == 1)
            {
                break;
            }
        }
        if(TimeoutFlag != 1)   // 未超时
        {
            if(Status != 1)           // 读取未结束
            {
                data = USART_ReceiveData(USARTx);  // 从串口中读取数据
                // 只有存放非 \r和 \n的字符
                if((data != '\r') && (data != '\n'))    
                {
                    Str[pos++] = data;
                    if(pos > 1)
                    {
                        // 判断倒数第四和第三个字符是否是"OK",若是则表明已读取到末尾(注:倒数第一和第二个字符是\r\n,已被过滤掉)
                        if((Str[pos-2] == 'O') && (Str[pos-1] == 'K'))      
                        {
                            Str[pos] = '\0';                // 为了便于计算,在获取的字符串中加入字符结束标志
                            Status = 1;
                        }
                    }
                }
            }
            else
            {
                break;
            }
        }
        else
        {
            TimeoutFlag = 0;
            size = -1;
            printf("Read AT_Cmd response timeout\n");
            break;
        }       
    }
    return size;
}

在读取模块的响应数据中加入了超时机制,当一定的时间到达后如果没有接收到串口的数据,我们就认为AT模块不响应我们的操作,此时认为写AT指令错误。若响应数据中包含”OK”字符串,我们就认为AT指令成功。

四、串口通信

当主从模块都配置成功后,接下来的事情就简单了。你就把操作模块之间的数据发送接收当做串口直接的读写数据。

五、小结

HC-05这个模块用起来非常的便捷,不要求熟悉蓝牙协议什么的。只要你懂得用串口就知道这个模块怎么用。

### HC蓝牙助手使用指南及相关下载 HC蓝牙助手是一款用于辅助配置和测试蓝牙模块(如HC-05HC-06等)的工具软件。以下是关于其使用的详细介绍: #### 一、HC蓝牙助手的功能概述 HC蓝牙助手主要用于通过串口通信与蓝牙模块交互,支持发送AT指令来设置模块参数,例如波特率、名称、密码等。它能够帮助用户更便捷地完成蓝牙模块的初始化配置和功能验证[^3]。 #### 二、HC蓝牙助手的主要特点 1. **图形化界面**:提供直观的操作窗口,方便用户输入命令并查看返回结果。 2. **自动检测端口**:可以扫描当前计算机可用的COM端口,并允许用户手动选择目标设备所在的端口号。 3. **常用AT指令预设**:内置常用的AT指令列表,减少记忆负担,只需点击即可执行相应操作。 4. **日志记录功能**:保存每次通讯过程中的数据流信息以便后续分析或排查问题。 #### 三、如何获取HC蓝牙助手? 目前市面上存在多个版本的HC蓝牙助手程序可供选择,具体可以从以下几个途径获得: - 官方网站或其他可信的技术论坛; - GitHub/GitCode等开源平台搜索关键词“HC Bluetooth Assistant”可能找到对应的项目仓库链接; - 部分硬件厂商在其产品资料包里附带专用版的应用程序安装文件。 对于您提到的内容,“https://gitcode.com/Resource-Bundle-Collection/986dd”,这里似乎是一个公共资源集合页面,虽然未明确指出是否有直接关联到HC蓝牙助手本身,但是其中或许包含了有关于HC系列蓝牙模块的相关文档和技术指导材料[^1]。 另外需要注意的是,在实际应用过程中,请务必确认所选用软件的安全性和兼容性,避免因恶意代码感染而导致不必要的麻烦。 #### 四、基本使用流程说明 假设已经成功安装好HC蓝牙助手之后,则按照如下方式来进行初步尝试: ```plaintext 打开应用程序 -> 设置合适的波特率(默认一般为9600bps) -> 连接指定串口-> 输入相应的AT指令进行查询或者修改属性 -> 断开连接结束会话 ``` 如果针对HC-05型号特别强调一点的话,记得依据之前描述过的方法先让模块处于正确的响应状态下才能正常接收来自PC端发出的消息[^2]。 --- ### 示例代码片段展示 下面给出一段简单的Python脚本作为替代方案之一实现基础的数据交换逻辑演示目的仅限于此并不构成完整的解决方案: ```python import serial from time import sleep def send_at_command(port, baudrate=9600): try: ser = serial.Serial(port, baudrate) if not ser.isOpen(): raise Exception('Serial port is closed.') cmd_list = ['AT', 'AT+NAME?', 'AT+VERSION?'] result = [] for c in cmd_list: ser.write((c+'\r\n').encode()) sleep(.5) # wait half second between commands res = ser.read_all().decode() result.append(res) return '\n'.join(result) except Exception as e: print(f'Error occurred: {e}') finally: if 'ser' in locals() and ser.is_open: ser.close() if __name__ == '__main__': output = send_at_command('COM3') print(output) ``` 此段代码利用pyserial库模拟实现了向已知串行接口发送几个典型询问请求的过程,并收集反馈消息打印出来供观察效果之用。 ---
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值