STM32学习100步之第三十三-八步——USART串口介绍

USART串口发送的三种方式

         发送方式如果以字符方式发送,则按照ASCLL码表中该数值对应的字符发送即可,也可使用‘u’加单引号的方式发送。
        /* 发送方法1 */
		USART_SendData(USART1 , 0x55); //发送单个数值
		while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET); //检查发送中断标志位
		
		/* 发送方法2 */
		printf("STM32F103 "); //纯字符串发送数据到串口

		printf("STM32 %d %d ",a,b); //纯字符串和变量发送数据到串口,a符号变量
		//其中%d的意思是将后面的字母a,b转换成十进制数显示,%d的位置可以随意摆放,显示时用后面的字母以%d的形式代替。
		
				/* 发送方法3 */
    	USART1_printf("STM32 %d %d ",a,b);
    	USART2_printf("STM32 %d %d ",a,b);
    	USART3_printf("STM32 %d %d ",a,b);
    	
//      printf是专用与某个串口的函数,需要通过下面宏定义来实现,某时刻只能用于一个串口。
#define USART_n		USART1  //定义使用printf函数的串口,其他串口要使用USART_printf专用函数发送

//利用相同的方法定义,使用发送方法3可以同时使用串口的发送。

USART串口接收的两种方式

		//查询方式接收
		if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE) != RESET){  //查询串口待处理标志位
			a =USART_ReceiveData(USART1);//读取接收到的数据	  
		}
	    //电脑发送的数据正好是8位数据,a定义的是8位类型,缺点是实时性不高,占用CPU空间。
	    
	    //中断方式接收(只要有中断标志位置1,则进入中断服务程序)
	        USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);//开启ENABLE/关闭DISABLE中断
            void USART1_IRQHandler(void){ //串口1中断服务程序(固定的函数名不能修改)	
	u8 a;
	          if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET){  //接收中断(接收到的数据必须是0x0d 0x0a结尾)	,检查是否是接收中断(中断原因很多,只要有一个中断标志位变化,就进入中断,因此需要判断)
		a =USART_ReceiveData(USART1);//读取接收到的数据
		printf("%c",a); //把收到的数据发送回电脑		  
	} 
} 

超级终端

超级终端中回车键按下后,会连续返回发送两个值给单片机,分别为0x0d(回车)、0x0a(换行)这时分别检测即可,在程序中通过设置相关的中断标志变量来检测回车键的按下。

extern u16 USART1_RX_STA; //接收状态标记

初值为0,通过接收修改改变其值,在中断程序中判断:
程序如下:

void USART1_IRQHandler(void){ //串口1中断服务程序(固定的函数名不能修改)	
	u8 Res;
	//以下是字符串接收到USART_RX_BUF[]的程序,(USART_RX_STA&0x3FFF)是数据的长度(不包括回车)
	//当(USART_RX_STA&0xC000)为真时表示数据接收完成,即超级终端里按下回车键。
	//在主函数里写判断if(USART_RX_STA&0xC000),然后读USART_RX_BUF[]数组,读到0x0d 0x0a即是结束。
	//注意在主函数处理完串口数据后,要将USART_RX_STA清0
	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET){  //接收中断(接收到的数据必须是0x0d 0x0a结尾)		
		Res =USART_ReceiveData(USART1);//(USART1->DR);	//读取接收到的数据
		printf("%c",Res); //把收到的数据以 a符号变量 发送回电脑		
		if((USART1_RX_STA&0x8000)==0){//接收未完成			
			if(USART1_RX_STA&0x4000){//接收到了0x0d				
				if(Res!=0x0a)USART1_RX_STA=0;//接收错误,重新开始
				else USART1_RX_STA|=0x8000;	//接收完成了 
			}else{ //还没收到0X0D					
				if(Res==0x0d)USART1_RX_STA|=0x4000;
				else{
					USART1_RX_BUF[USART1_RX_STA&0X3FFF]=Res ; //将收到的数据放入数组
					USART1_RX_STA++;	//数据长度计数加1
					if(USART1_RX_STA>(USART1_REC_LEN-1))USART1_RX_STA=0;//接收数据错误,重新开始接收	  
				}		 
			}
		}   		 
	} 
} 

通过中断接收函数如果发送给单片机的字符串发送完毕,则USART1_RX_STA的高2位为1,在主函数main中便符合if的条件进入程序进行预期的执行命令。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值