打印
[其他ST产品]

蓝牙模块实现数据的远程传输

[复制链接]
2267|34
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
项目场景
本人在做STM32硬件开发项目中,传输数据这一块的通信模块基本都是ZigBee或者蓝牙HC-05模块,这两个模块引脚上都有TX/RX进行数据的输出与输入;在开发前会以为通信这方面应该会非常的难,但其实数据传输的原理在代码上非常的简单,本文主要以ZigBee模块进行详细解释。

硬件准备
本项目前期需要准备的硬件有:
STM32开发板(我这边主要用的是STM32F103ZET6精英版,后续的代码在STM32F1都是通用的):


ZigBee模块(两个):


USB-TTL模块:



使用特权

评论回复
沙发
雨果喝水|  楼主 | 2023-5-30 16:59 | 只看该作者
实现过程
实现缘由
代码链接:https://pan.baidu.com/s/1b4SwmOc-bZfcHyeL5mNzLw
提取码:adeh
本项目使用的是正点原子的代码模板,打开工程后,可以看到在HAREWARW文件里多了timer.c和usart3.c两个C语言文件,而SYSTEM文件中本身也有一个usart.c文件。


使用特权

评论回复
板凳
雨果喝水|  楼主 | 2023-5-30 16:59 | 只看该作者
而usart3.c就是ZigBee模块进行通信的关键。
在原本的代码中,我们可以直接通过prinf();函数将数据以串口1的方式通过USB_232接口传入到电脑中,通过串口调试助手直接打印显示,并且打印的数据中英文都可以适用(中文可能会有传输损耗)。
然而这个串口接口很多时候也可以用来烧录代码,有很多功能的复用。因此我们大多情况下不能通过这个串口1接入ZigBee/蓝牙模块实现数据的远程传输

使用特权

评论回复
地板
雨果喝水|  楼主 | 2023-5-30 16:59 | 只看该作者
而且prinf();这个应该是C语言自带的函数方法,在keil5编程软件中是找不到源头的。

使用特权

评论回复
5
雨果喝水|  楼主 | 2023-5-30 17:00 | 只看该作者
因此我们需要启用其他的串口接口,参考串口1的传输方式,采用串口3的接口,自己另写一个新的u3_printf();使得数据能够通过串口3,接入ZigBee模块,使得数据能够打印到电脑的串口调试助手中,实现数据的远程传输。

使用特权

评论回复
6
雨果喝水|  楼主 | 2023-5-30 17:00 | 只看该作者
原理展现
在usart3.c中有这样一段代码:

使用特权

评论回复
7
雨果喝水|  楼主 | 2023-5-30 17:00 | 只看该作者
是对串口3的初始化,对应的引脚为PB10和PB11;我们首先通过USB-TTL模块进行引脚连接,连接方式如下:

PB10-RX
PB11-TX

使用特权

评论回复
8
雨果喝水|  楼主 | 2023-5-30 17:00 | 只看该作者
主函数代码如下所示:
 int main(void)
{               
        delay_init();                     //延时函数初始化          
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先
       
        usart3_init(9600);       
        uart_init(115200);         //串口初始化为115200
       
        while(1)
        {                                  
                delay_ms(300);
                printf("\r\n串口1发出消息");//串口1发出消息 通过(正常RS232串口)引线
                delay_ms(300);
                u3_printf("\r\n串口3发出消息");//串口3发出消息 通过(PB10输出 PB11输入  连接USB-TTL模块)引线
                delay_ms(300);
  }
}

使用特权

评论回复
9
雨果喝水|  楼主 | 2023-5-30 17:01 | 只看该作者
可以看到有两个printf进行数据打印;其中u3_printf();的代码原理体现在uasrt3.c中的:

void u3_printf(char* fmt,...)  
{  
        u16 i,j;
        va_list ap;
        va_start(ap,fmt);
        vsprintf((char*)USART3_TX_BUF,fmt,ap);
        va_end(ap);
        i=strlen((const char*)USART3_TX_BUF);                //此次发送数据的长度
        for(j=0;j<i;j++)                                                        //循环发送数据
        {
          while(USART_GetFlagStatus(USART3,USART_FLAG_TC)==RESET); //循环发送,直到发送完毕   
                USART_SendData(USART3,USART3_TX_BUF[j]);
        }
}


通过这样的写法,就可以将数据通过串口3进行展现了,代码为了突出效果,将串口1和串口3数据同步输出,进行展现。

使用特权

评论回复
10
雨果喝水|  楼主 | 2023-5-30 17:02 | 只看该作者
成果展现
USB-TTL模块有线数据展示
首先按之前串口3的连接方式连接硬件,如下图所示:



使用特权

评论回复
11
雨果喝水|  楼主 | 2023-5-30 17:02 | 只看该作者
另一端连接到电脑,若烧录好代码后,该模块中的TXD附近的LED等会不断的闪烁:



由于本人用的是串口烧录,因此串口1也可以输出数据,打开两个串口调试助手,分别设置对应的串口和波特率,打开后数据接收情况如下图所示:

可以看到数据能够同步在两个串口中进行显示。

使用特权

评论回复
12
雨果喝水|  楼主 | 2023-5-30 17:20 | 只看该作者
ZigBee模块远程传输数据展示
将两个ZigBee模块通过以下方式进行对应的配置:

使用特权

评论回复
13
雨果喝水|  楼主 | 2023-5-30 17:21 | 只看该作者
接下来将其中一个ZigBee模块同之前的USB-TTL模块连接STM32板子的方式对应连接(USB-TTL模块在连接时可以不连接电源和地 但是Zigbee必须连接电源和地);

PB10-RX
PB11-TX

使用特权

评论回复
14
雨果喝水|  楼主 | 2023-5-30 17:21 | 只看该作者
另一个ZigBee模块和USB-TTL模块连接到电脑,呈现样式如下:

使用特权

评论回复
15
雨果喝水|  楼主 | 2023-5-30 17:21 | 只看该作者
本人是将STM32一方的ZigBee模块设为A端(呈现为双红色),接入电脑的一端为B端(呈现为双绿色);
两边连接成功之后,STM32一方的ZigBee模块会变成一红一绿,并且图中两个标红框位置的地方会同步闪烁红光,说明数据正在实时传输。
全文到这个地方,便基本实现了添加串口接口来接入ZigBee模块实现数据的远程传输。

使用特权

评论回复
16
雨果喝水|  楼主 | 2023-5-30 17:22 | 只看该作者
最后总结
至此,我们就基本完成了再STM32上搭建ZigBee/蓝牙模块来实现数据的远程传输,可以结合之前STM32——两个模块代码的合并的博客对传感器采集到的数据进行整合,通过这里的传输方式上传到电脑中!

使用特权

评论回复
17
loutin| | 2023-6-7 13:39 | 只看该作者
将蓝牙模块的TXD、RXD、GND等引脚连接到STM32芯片上,并设置相应的串口参数。

使用特权

评论回复
18
MessageRing| | 2023-6-7 23:14 | 只看该作者
串口可以远距离通信吗

使用特权

评论回复
19
fengm| | 2023-6-8 13:35 | 只看该作者
在STM32芯片中,可以通过连接蓝牙模块实现数据的远程传输。

使用特权

评论回复
20
loutin| | 2023-6-8 15:28 | 只看该作者
基于STM32的两个蓝牙(HC-05)之间的相互通信。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

85

主题

1153

帖子

0

粉丝