目录
项目需求
通过蓝牙模块,实现手机控制蓝牙插座 / 风扇 / 灯。本质:
- 采用蓝牙的透传功能;
- 控制 IO 口的输出。
项目框图
硬件清单
HC01 蓝牙模块CH340杜邦线
项目设计及实现
项目设计
- HC01_TX -- RX1
- HC01_RX -- TX1
项目实现
1. 串口非中断法
while (1)
{
HAL_UART_Receive(&huart1,cmd,20,100);
//HAL_UART_Transmit(&huart1,cmd,sizeof(cmd),100);
printf("%s",cmd);
if(!strcmp((const char *)cmd,"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 *)cmd,"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(cmd[0] != '\0')
{
printf("输入错误:%s\r\n",cmd);
}
}
memset(cmd,'\0',sizeof(cmd));
}
2. 串口中断法
while (1)
{
//判断判断串口是否接收完成
if(UART1_RX_STA & 0x8000)
{
printf("收到数据:");
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);
}
}
//printf("hello world\r\n");
memset(UART1_RX_Buffer,0,sizeof(UART1_RX_Buffer));
HAL_Delay(40);
//printf("\r\n");
// 重新开始下一次接收
UART1_RX_STA = 0;
}
}
}