赞
踩
前面的文章学习了串口通过轮询和中断的简单使用方法,现在就来用这个串口实践一下,巩固串口使用轮询的方式实现串口通信,实现手机和蓝牙串口模块通信。
实验目的:
学习使用蓝牙无线串口和手机进行通信功能的使用,实现手机蓝牙调试助手发送指令给蓝牙模块从而通过给单片机串口处理,进而实现单片机控制LED的功能。
接线如下表所示:
引脚标号 | 单片机 | HC05蓝牙模块 |
---|---|---|
1 | 5V | VCC |
2 | GND | GND |
3 | PB11 | TXD |
4 | PB10 | RXD |
注意:
1、单片机串口配置的波特率是多少,那么蓝牙模块的通信波特率也需要对应设置为多少才行,也就是两者的通信波特率需要保持一致才行,不然手机会显示乱码的。
2、本实验可以直接使用蓝牙模块的通信功能,不用配置相关功能及参数了,所以代码不用添加配置指令代码,直接添加串口功能代码即可。
本实验将采用前面的LED工程作为模板,直接拷贝在上面添加串口功能配置即可。
按照标号的顺序依次配置即可,如下图所示:
串口模式选择异步通信,下面串口的参数可以随意自己设置合适的,我设置波特率为115200,8位数据位,1位停止位,无奇偶校验。
参数配置完成后如下图所示:
可以看到芯片处多了一个USART3的定义。
到此,串口3相关配置就完成了,生成工程就可以编写代码了。
生成代码后,可以看到main文件里面多了一个串口3的初始化函数,如下图所示:
进去该函数以后,可以看到相关串口参数定义,如下图所示:
串口引脚配置如下图所示:
当检查代码没有问题以后,就可以进行功能代码的编写了。
变量定义如下图所示:
代码片示例如下:
/* USER CODE BEGIN 1 */
char bufcahr[] = "system is ready!"; /* 开机提示 */
uint8_t rx_buf = 0;
/* USER CODE END 1 */
main函数里面编写串口轮询功能代码如下图所示:
代码片示例如下:
/* Infinite loop */
/* USER CODE BEGIN WHILE */
HAL_UART_Transmit(&huart3, (uint8_t *)bufcahr, sizeof(bufcahr), 1000); /* 开机提示 */
while (1)
{
HAL_UART_Receive(&huart3, (uint8_t *)&rx_buf, sizeof(rx_buf), 1000);/* 串口接收 */
if (rx_buf == 'O') /* 开灯指令 */
{
LED(0); /* 点亮LED */
}
else if (rx_buf == 'F') /* 关灯指令 */
{
LED(1); /* 关闭LED */
}
else
{
HAL_UART_Transmit(&huart3, (uint8_t *)"please input cmd!", 17, 1000);/* 发送提示 */
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
在while循环外面写一个串口发送函数,用来提示正常开机并且说明串口正常,从而可以发送控制指令。
接着在while循环里面添加串口接收函数,用来接收手机发给蓝牙的指令。
下面添加if判断,如果判断接收的指令和手机发过来的一致,那么就执行里面开/关灯的功能操作,否则就执行后面的提示语句。
编译下载代码后,等待手机蓝牙调试助手正常连接蓝牙名字后,就可以进入消息收发对话模式界面了。
按一下开发板复位按键,可以看到打印一条开机提示语句,接着就可以输入控制指令‘O’或‘F’了。效果如下图所示。
或者直接在按钮控制界面点击按钮控制即可,提前编辑好相关指令就行,如下图所示:
发送大写字母O就可以看到单片机的LED被点亮了,发送大写字母F就可以看到单片机的LED熄灭了。
如果要有提示,可以在LED功能代码下面添加串口发送函数提示即可。如下图所示:
通过蓝牙模块实现无线通信,从而实现串口控制功能。主要手机指令发送正确基本没有什么问题的。
APP可以直接在手机应用商店搜索下载,一般搜索蓝牙调试助手就行(具体需要下载测试才行)。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。