开头;这里我们就只针对串口中断服务函数来写。
大体思路 就是定义帧头 和帧尾 当串口接收到帧头的时候就将数据存入指定临时数组,当数据收到帧尾的时候将数据存入所定义的全局变量数组(定义全局变量是为了保证在别的.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);
}