项目需求
通过蓝牙模块,实现手机控制蓝牙插座/风扇/灯。
本质:
-
采用蓝牙的透传功能;
-
控制 IO 口的输出。
硬件
HC01蓝牙模块
CH340
杜邦线
项目设计及实现
HC01_TX – RX1
HC01_RX – TX1
代码如下:
- 串口非中断法
// main
HAL_UART_Receive(&huart1, ch, 19, 100);
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_UART_Receive(&huart1, ch, 19, 100);
//HAL_UART_Transmit(&huart1, ch, strlen(ch), 100);
//printf(ch);
printf("%s",ch);
if(!strcmp((const char *)ch, "open")){
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET);
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_8) == GPIO_PIN_RESET){
printf("LED1已经打开\r\n");
}
}else if(!strcmp((const char *)ch, "close")){
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET);
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_8) == GPIO_PIN_SET){
printf("LED1已经关闭\r\n");
}
}else{
if(ch[0] != '\0'){
printf("指令发送错误:%s\r\n", ch);
}
}
memset(ch, 0, strlen((const char *)ch));
}
- 串口中断法
printf("hello zg\r\n");
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
//判断判断串口是否接收完成
if(UART1_RX_STA & 0x8000){
printf("收到数据:");
if (!strcmp((const char *)UART1_RX_Buffer, "open")) {
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET);
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_8) == GPIO_PIN_RESET){
printf("LED1已打开\n");
}
}else if(!strcmp((const char *)UART1_RX_Buffer, "close")){
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET);
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_8) == GPIO_PIN_SET){
printf("LED1已关闭\n");
}
} else {
if(UART1_RX_Buffer[0] != '\0'){
printf("指令发送错误:%s", UART1_RX_Buffer);
}
}
memset(UART1_RX_Buffer, 0, strlen((const char *)UART1_RX_Buffer));
printf("\r\n");
UART1_RX_STA = 0;
}
//printf("hello zg\r\n");
HAL_Delay(40);
}