stm32学习之用串口调试助手向单片机发送指定字符串,并存储进指定数组

本文介绍了一个基于串口中断服务函数实现的数据帧解析方法。通过定义帧头'A'和帧尾'D',当检测到帧头时开始存储数据,直到接收到帧尾时,使用sprintf函数将接收到的数据拼接并存储到全局变量中。在中断服务程序中,利用标志位'm'控制数据写入,并在接收到帧尾时关闭标志位,打印有效数据。
摘要由CSDN通过智能技术生成

 

开头;这里我们就只针对串口中断服务函数来写。

大体思路 就是定义帧头 和帧尾   当串口接收到帧头的时候就将数据存入指定临时数组,当数据收到帧尾的时候将数据存入所定义的全局变量数组(定义全局变量是为了保证在别的.c文件中也可以使用)中  ,数据的拼接使用sprintf函数

一、sprintf用法

1、 给指定数组赋值字符串


sprintf(buf,"love");
printf("%s",buf);
//输出结果:love

2、sprintf赋值拼接,

char buf[60]={0};
char*who="I";
char*whom="CSDN";
sprintf(buf,"%slove%s.",who,whom);
printf("%s",buf);
//输出结果:"IloveCSDN.

二、串口中断服务函数(功能部分的代码)

这里采用的帧头为A  , 帧尾为D   数据存储标志位m为’B‘的时候开始写入数组,m不是‘B’的时候停止写入数组

/*******************************************************************************
* 函 数 名         : USART1_IRQHandler
* 函数功能		   : USART1中断函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/ 
u8 r,m,n;                                
char str_Buffer[100]="",str_Data[100]="";             //这五个变量必须在串口中断服务函数外边定义
void USART1_IRQHandler(void)                	//串口1中断服务程序
{

	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断
	{
		r =USART_ReceiveData(USART1);    //(USART1->DR);	//读取接收到的数据
		if(m=='B')                       //写入数据标志位打开后,下一次进入中断 
		{
			if(r=='D')                     //接收到帧尾 
			{
				sprintf(str_Data,"%s",str_Buffer); //将str_Buffer数据写入str_Data
				m='0';                       //将数据写入标志位关闭  一次数据解析完成
                                printf("%s",str_Data)        //打印出有效数据
			}
			sprintf(str_Buffer,"%s%c",str_Buffer,r);    //将数据r拼接在str_Buffer的数组中
		}
		if(r=='A')
		{
		  sprintf(str_Buffer,"%c",r);    //如果接收到帧头A 则将数据写入str_Buffer
			m='B';                         //将数据写入标志位打开
		}

		//USART_SendData(USART1,r);
		//while(USART_GetFlagStatus(USART1,USART_FLAG_TC) != SET);
	} 
	//USART_ClearFlag(USART1,USART_FLAG_TC);
} 

 

  • 7
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值