STM32F103ZET6单片机双串口互发程序设计与实现

STM32库函数开发系列文章目录

第一篇:STM32F103ZET6单片机双串口互发程序设计与实现



前言

    daodanjishui物联网核心原创技术之STM32F103ZET6单片机双串口互发程序设计与实现。


一、STM32F103ZET6单片机双串口互发程序设计与实现是什么?

    单片机初学者用串口来调试程序是非常方便的,用什么仿真器,用什么寄存器等等都不如串口打印来得方便快捷。正点原子官方出品的串口调试工具也涉及到串口调试。不过我这个串口互发程序属于自己原创出品,主要当时用STM32的串口连接ESP8266的时候发AT指令太麻烦了,先用串口调试助手接USB转TTL给ESP8266发AT指令,然后再在单片机编写串口发送程序发送AT指令,最后在单片机编写串口接收程序接收ESP8266的数据。
    后来就设计出一个串口互发程序来加速程序开发进程,直接给串口2发送AT指令,然后单片机接收到串口2的指令之后转发给串口1直接跟ESP8266通信。后期智能小车的设计中也直接利用了这个技术,让串口蓝牙和串口wifi的数据都可以实现串口互发。

二、使用步骤

1.下载程序

代码如下(示例):

#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include "usart2.h"
//ALIENTEK战舰STM32开发板
//串口实验  
//技术支持:daodanjishui 
 int main(void)
 {		
 	u8 t;
	u8 len;	
  u8 len2;	
	delay_init();	    	 //延时函数初始化	  
	NVIC_Configuration(); 	 //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
	uart_init(9600);	 //串口初始化为9600
	
  uart2_init(9600);
 	//LED_Init();			     //LED端口初始化
	//KEY_Init();          //初始化与按键连接的硬件接口
 	while(1)
	{
		if(USART_RX_STA&0x8000)
		{					   
			len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
			
			/* //因为我这里要把气象站的数据传回来,所以不能直接返回数据给气象站,否则可能出错
			printf("电脑 send to串口1的数据为:\r\n");
			for(t=0;t<len;t++)
			{
				USART_SendData(USART1, USART_RX_BUF[t]);//单片机通过串口1发送数据给电脑
				while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
			  //printf("\r\n发送成功\r\n");//插入换行
			}
      printf("\r\n");//插入换行
			*/
			
			
			
			
      u2_printf("电脑 send to串口2的数据为:\r\n");		
			for(t=0;t<len;t++)
			{
				USART_SendData(USART2, USART_RX_BUF[t]);//将串口1收到的数据转发给串口2输出
				while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET);//等待发送结束
			}
			u2_printf("\r\n");//插入换行

			
			USART_RX_STA=0;
		} 
		
		
		
		
		if(USART2_RX_STA&0x8000)
		{					   
			len2=USART2_RX_STA&0x3fff;//得到此次接收到的数据长度
			
      u2_printf("电脑 send to串口2的数据为:\r\n");
			for(t=0;t<len2;t++)
			{
				USART_SendData(USART2, USART2_RX_BUF[t]);//单片机通过串口2给电脑发数据
				while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET);//等待发送结束
			}
			u2_printf("\r\n");//插入换行		
			
			
			
			
      //printf("电脑 send to串口1的数据为:\r\n");
      printf("\r\n");//作为指令响应的开头		
			for(t=0;t<len2;t++)
			{
				USART_SendData(USART1, USART2_RX_BUF[t]);//将串口2收到的数据转发给串口1输出
				while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
			}			
			printf("\r\n");//插入换行
			
			USART2_RX_STA=0;
		} 
	}	 
 }


2.测试步骤和程序说明

为什么用51单片机调试串口蓝牙模块或者是串口wifi模块很困难呢?因为串口只有一个,串口一旦用于与模块通信之后,就没有办法进行调试信息的打印了,这次分享的程序是基于stm32f103zet6单片机,串口1和串口2的信息可以互发,举一个例子说明:

这里面 写了串口1 和串口2

串口一的打印语句是printf()

串口二的打印语句是u2_printf()

串口一接pa9 pa10

串口二接pa2 pa3

这个代码的功能就是双串口的消息互相发送
在这里插入图片描述

比如电脑给串口1发送 aaa,则单片机通过串口1和串口2向电脑发送aaa,在电脑的串口调试助手可以看出来

比如电脑给串口2发送 bbb,则单片机通过串口1和串口2向电脑发送bbb,在电脑的串口调试助手可以看出来


总结

    通过修改这套程序,可以让串口蓝牙调试模块或者是串口wifi模块的调试再也不需要用到usb转ttl模块进行测试了,可以直接用单片机两个串口来联合测试,单片机用一个串口接模块,用一个串口接电脑,这样用电脑串口助手给单片机发送AT指令的时候,单片机的串口就会将AT指令通过另一个串口转发到模块上,同时模块返回的信息也可以打印回电脑串口调试助手,相当方便。
    后期会推出基于串口蓝牙的智能小车程序,用双串口进行调试。
工程截图:
在这里插入图片描述

源码工程下载链接:https://www.cirmall.com/circuit/19782/
点我直接跳转

  • 1
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

daodanjishui

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

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

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

打赏作者

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

抵扣说明:

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

余额充值