STM32F103学习记录——通过额外添加串口接口来接入ZigBee/蓝牙模块实现数据的远程传输


项目场景

本人在做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——两个模块代码的合并的博客对传感器采集到的数据进行整合,通过这里的传输方式上传到电脑中!
过程中可能有些地方没有说明清楚,还请大家多多交流,记得点赞+关注哦!!
请添加图片描述

以下是基于串口连接的示例代码: ```c #include "stm32f10x.h" #include "stm32f10x_usart.h" // 定义USART外设 #define USARTx USART1 #define USARTx_CLK RCC_APB2Periph_USART1 #define USARTx_GPIO GPIOA #define USARTx_GPIO_CLK RCC_APB2Periph_GPIOA #define USARTx_RxPin GPIO_Pin_10 #define USARTx_TxPin GPIO_Pin_9 // 定义缓冲区 #define USARTx_BUFFER_SIZE 256 volatile uint8_t USARTx_RxBuffer[USARTx_BUFFER_SIZE]; volatile uint8_t USARTx_TxBuffer[USARTx_BUFFER_SIZE]; volatile uint16_t USARTx_RxHead = 0; volatile uint16_t USARTx_RxTail = 0; volatile uint16_t USARTx_TxHead = 0; volatile uint16_t USARTx_TxTail = 0; // 初始化USART外设 void USARTx_Init(uint32_t baudrate) { USART_InitTypeDef USART_InitStruct; GPIO_InitTypeDef GPIO_InitStruct; // 使能USART时钟 RCC_APB2PeriphClockCmd(USARTx_CLK, ENABLE); RCC_APB2PeriphClockCmd(USARTx_GPIO_CLK, ENABLE); // 配置USART Tx和Rx引脚 GPIO_InitStruct.GPIO_Pin = USARTx_TxPin; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(USARTx_GPIO, &GPIO_InitStruct); GPIO_InitStruct.GPIO_Pin = USARTx_RxPin; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(USARTx_GPIO, &GPIO_InitStruct); // 配置USART USART_InitStruct.USART_BaudRate = baudrate; USART_InitStruct.USART_WordLength = USART_WordLength_8b; USART_InitStruct.USART_StopBits = USART_StopBits_1; USART_InitStruct.USART_Parity = USART_Parity_No; USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USARTx, &USART_InitStruct); // 使能USART接收中断 USART_ITConfig(USARTx, USART_IT_RXNE, ENABLE); // 使能USART USART_Cmd(USARTx, ENABLE); } // USARTx中断处理函数 void USARTx_IRQHandler(void) { if (USART_GetITStatus(USARTx, USART_IT_RXNE) != RESET) { uint8_t data = USART_ReceiveData(USARTx); uint16_t next_tail = (USARTx_RxTail + 1) % USARTx_BUFFER_SIZE; if (next_tail != USARTx_RxHead) { USARTx_RxBuffer[USARTx_RxTail] = data; USARTx_RxTail = next_tail; } USART_ClearITPendingBit(USARTx, USART_IT_RXNE); } if (USART_GetITStatus(USARTx, USART_IT_TXE) != RESET) { if (USARTx_TxHead == USARTx_TxTail) { // 发送完成 USART_ITConfig(USARTx, USART_IT_TXE, DISABLE); } else { // 继续发送 uint8_t data = USARTx_TxBuffer[USARTx_TxHead]; USARTx_TxHead = (USARTx_TxHead + 1) % USARTx_BUFFER_SIZE; USART_SendData(USARTx, data); } USART_ClearITPendingBit(USARTx, USART_IT_TXE); } } // 发送数据到USARTx void USARTx_SendData(uint8_t *data, uint16_t length) { for (uint16_t i = 0; i < length; i++) { uint16_t next_tail = (USARTx_TxTail + 1) % USARTx_BUFFER_SIZE; if (next_tail != USARTx_TxHead) { USARTx_TxBuffer[USARTx_TxTail] = data[i]; USARTx_TxTail = next_tail; } } USART_ITConfig(USARTx, USART_IT_TXE, ENABLE); } int main(void) { USARTx_Init(115200); while (1) { // 读取USARTx接收缓冲区数据 while (USARTx_RxHead != USARTx_RxTail) { uint8_t data = USARTx_RxBuffer[USARTx_RxHead]; USARTx_RxHead = (USARTx_RxHead + 1) % USARTx_BUFFER_SIZE; // 处理接收到的数据 } // 发送数据到USARTx uint8_t data[] = {0x01, 0x02, 0x03}; USARTx_SendData(data, sizeof(data)); // 延时 for (uint32_t i = 0; i < 100000; i++) {} } } ``` 以上代码仅供参考,具体实现取决于具体的zigbee通信模块和其提供的通信协议。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拾柒#_17

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值