基于STM32F103C8T6与HC-08蓝牙模块实现手机连接方案

基于STM32F103C8T6与HC-08蓝牙模块实现手机连接方案


一、硬件连接规范

1.1 引脚连接表

STM32引脚 HC-08引脚 说明
3.3V VCC 供电(严禁接5V)
GND GND 共地
PA9(TX) RX 交叉连接
PA10(RX) TX 交叉连接

1.2 电源优化


二、CubeMX配置

2.1 时钟配置

// 系统时钟配置(72MHz)
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;

2.2 USART配置

// USART1参数设置
huart1.Instance = USART1;
huart1.Init.BaudRate = 9600;    // 需与HC-08设置一致
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TXRX;
HAL_UART_Init(&huart1);

2.3 NVIC中断配置

// 启用USART1中断(优先级3)
HAL_NVIC_SetPriority(USART1_IRQn, 3, 0);
HAL_NVIC_EnableIRQ(USART1_IRQn);

三、核心代码实现

3.1 UART初始化(main.c)

UART_HandleTypeDef huart1;

void MX_USART1_UART_Init(void)
{
  huart1.Instance = USART1;
  huart1.Init.BaudRate = 9600;
  huart1.Init.WordLength = UART_WORDLENGTH_8B;
  huart1.Init.StopBits = UART_STOPBITS_1;
  huart1.Init.Parity = UART_PARITY_NONE;
  huart1.Init.Mode = UART_MODE_TXRX;
  HAL_UART_Init(&huart1);
}

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_USART1_UART_Init();
  
  HAL_UART_Receive_IT(&huart1, rx_buff, 1); // 开启接收中断
  while(1){}
}

3.2 中断回调函数

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  if(huart->Instance == USART1)
  {
    static uint8_t index = 0;
    if(rx_buff[index] == '\n') // 帧结束符检测
    {
      process_command(rx_buff); // 自定义命令处理函数
      memset(rx_buff,0,sizeof(rx_buff));
      index = 0;
    }
    else
    {
      index = (index + 1) % sizeof(rx_buff);
    }
    HAL_UART_Receive_IT(&huart1, &rx_buff[index], 1);
  }
}

四、HC-08 AT指令配置

4.1 进入AT模式

  1. 断开STM32与HC-08的TX/RX连接

  2. 给HC-08供电(3.3V)

  3. 通过USB转TTL模块发送指令:

    AT+ORGL\r\n  # 恢复出厂设置
    AT+NAME=STM32_BT\r\n  # 设置模块名称
    AT+ROLE=0\r\n  # 设置从机模式
    AT+UART=9600,0,0\r\n  # 设置波特率
    

4.2 常用指令集

指令 作用 响应示例
AT 测试模块响应 OK
AT+VERSION? 查询固件版本 +VERSION:…
AT+BAUD=3 设置波特率9600 OK+BAUD=3
AT+CMODE=1 允许任何地址连接 OK

五、手机端连接

5.1 Android示例代码(Kotlin)

val bluetoothAdapter = BluetoothAdapter.getDefaultAdapter()
val device = bluetoothAdapter.bondedDevices.first { it.name == "STM32_BT" }

val uuid = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB")
val socket = device.createRfcommSocketToServiceRecord(uuid)
socket.connect()

val outputStream = socket.outputStream
outputStream.write("Hello STM32!".toByteArray())

5.2 手机APP推荐


六、调试技巧

6.1 串口调试助手测试

  1. 使用USB转TTL模块连接HC-08

  2. 设置波特率9600,发送测试指令:

    AT+GATT?  # 查询GATT服务状态
    

6.2 常见问题解决

现象 解决方案
无法进入AT模式 检查EN引脚是否拉高
数据丢失 增加接收缓冲区(建议256字节)
波特率不匹配 使用AT+UART重新配置
手机无法搜索到 检查模块名称和配对密码设置

七、完整工程示例

// 发送函数示例
void send_to_bt(uint8_t* data, uint16_t len)
{
  HAL_UART_Transmit(&huart1, data, len, 100);
  HAL_UART_Transmit(&huart1, (uint8_t*)"\r\n", 2, 100); // 添加结束符
}

// 接收数据处理
void process_command(uint8_t* cmd)
{
  if(strncmp((char*)cmd, "LED_ON", 6) == 0)
  {
    HAL_GPIO_WritePin(GPIOA, LED_PIN, GPIO_PIN_SET);
  }
  else if(strncmp((char*)cmd, "LED_OFF", 7) == 0)
  {
    HAL_GPIO_WritePin(GPIOA, LED_PIN, GPIO_PIN_RESET);
  }
}

八、参考资料

  1. 代码 stm32F103c8t6 连接HC08蓝牙串口模块与手机通过蓝牙连接 www.youwenfan.com/contentcsh/56147.html
  2. HC-08 AT指令手册(参考) wenku.csdn.net/answer/3cvmm3vspj

 

专注于matlab/simulink,电子电路,编程