项目场景
本人在做STM32硬件开发项目中,传输数据这一块的通信模块基本都是ZigBee或者蓝牙HC-05模块,这两个模块引脚上都有TX/RX进行数据的输出与输入;在开发前会以为通信这方面应该会非常的难,但其实数据传输的原理在代码上非常的简单,本文主要以ZigBee模块进行详细解释。
硬件准备
本项目前期需要准备的硬件有:
STM32开发板(我这边主要用的是STM32F103ZET6精英版,后续的代码在STM32F1都是通用的):
ZigBee模块(两个):
USB-TTL模块:
实现过程
实现缘由
代码链接:https://pan.baidu.com/s/1b4SwmOc-bZfcHyeL5mNzLw
提取码:adeh
本项目使用的是正点原子的代码模板,打开工程后,可以看到在HAREWARW文件里多了timer.c和usart3.c两个C语言文件,而SYSTEM文件中本身也有一个usart.c文件。
而usart3.c就是ZigBee模块进行通信的关键。
在原本的代码中,我们可以直接通过prinf();函数将数据以串口1的方式通过USB_232接口传入到电脑中,通过串口调试助手直接打印显示,并且打印的数据中英文都可以适用(中文可能会有传输损耗)。
然而这个串口接口很多时候也可以用来烧录代码,有很多功能的复用。因此我们大多情况下不能通过这个串口1接入ZigBee/蓝牙模块实现数据的远程传输
而且prinf();这个应该是C语言自带的函数方法,在keil5编程软件中是找不到源头的。
因此我们需要启用其他的串口接口,参考串口1的传输方式,采用串口3的接口,自己另写一个新的u3_printf();使得数据能够通过串口3,接入ZigBee模块,使得数据能够打印到电脑的串口调试助手中,实现数据的远程传输。
原理展现
在usart3.c中有这样一段代码:
是对串口3的初始化,对应的引脚为PB10和PB11;我们首先通过USB-TTL模块进行引脚连接,连接方式如下:
PB10-RX
PB11-TX
主函数代码如下所示:
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);
}
}
可以看到有两个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数据同步输出,进行展现。
成果展现
USB-TTL模块有线数据展示
首先按之前串口3的连接方式连接硬件,如下图所示:
另一端连接到电脑,若烧录好代码后,该模块中的TXD附近的LED等会不断的闪烁:
由于本人用的是串口烧录,因此串口1也可以输出数据,打开两个串口调试助手,分别设置对应的串口和波特率,打开后数据接收情况如下图所示:
可以看到数据能够同步在两个串口中进行显示。
ZigBee模块远程传输数据展示
将两个ZigBee模块通过以下方式进行对应的配置:
接下来将其中一个ZigBee模块同之前的USB-TTL模块连接STM32板子的方式对应连接(USB-TTL模块在连接时可以不连接电源和地 但是Zigbee必须连接电源和地);
PB10-RX
PB11-TX
另一个ZigBee模块和USB-TTL模块连接到电脑,呈现样式如下:
本人是将STM32一方的ZigBee模块设为A端(呈现为双红色),接入电脑的一端为B端(呈现为双绿色);
两边连接成功之后,STM32一方的ZigBee模块会变成一红一绿,并且图中两个标红框位置的地方会同步闪烁红光,说明数据正在实时传输。
全文到这个地方,便基本实现了添加串口接口来接入ZigBee模块实现数据的远程传输。
最后总结
至此,我们就基本完成了再STM32上搭建ZigBee/蓝牙模块来实现数据的远程传输,可以结合之前STM32——两个模块代码的合并的博客对传感器采集到的数据进行整合,通过这里的传输方式上传到电脑中!
过程中可能有些地方没有说明清楚,还请大家多多交流,记得点赞+关注哦!!