串口接收数据并对数据进行处理
正点原子的串口中断函数如下:
void USART1_IRQHandler(void) //串口1中断服务程序
{
u8 Res;
#if SYSTEM_SUPPORT_OS //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
OSIntEnter();
#endif
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾)
{
Res =USART_ReceiveData(USART1); //读取接收到的数据
if((USART_RX_STA&0x8000)==0)//接收未完成
{
if(USART_RX_STA&0x4000)//接收到了0x0d
{
if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
else USART_RX_STA|=0x8000; //接收完成了
}
else //还没收到0X0D
{
if(Res==0x0d)USART_RX_STA|=0x4000;
else
{
USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
USART_RX_STA++;
if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收
}
}
}
}
此函数只是单纯的接收函数 ,没有对数据进行处理 ,由于本人做了一个项目需要对数据进行大量的处理
以前都是串口接收函数存取,然后对接收函数进行判断 处理
下面的方法是在中断处理函数中对数据进行处理。
/*使用microLib的方法*/
/*
int fputc(int ch, FILE *f)
{
USART_SendData(USART1, (uint8_t) ch);
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {}
return ch;
}
int GetKey (void) {
while (!(USART1->SR & USART_FLAG_RXNE));
return ((int)(USART1->DR & 0x1FF));
}
*/
//#if EN_USART1_RX //如果使能了接收
//#if EN_USART1_RX //如果使能了接收
//串口1中断服务程序
//注意,读取USARTx->SR能避免莫名其妙的错误
//u8 USART_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.
//接收状态
//bit15, 接收完成标志
//bit14, 接收到0x0d
//bit13~0, 接收到的有效字节数目
u16 USART_RX_STA=0; //接收状态标记
//串口1队列定义
u8 UART1SendBuff[UART1BuffSize]; //发送数据
u8 UART1ReceBuff[UART1BuffSize]; //接收数据?
u16 UART1ReceIn = 0;//接收状态标记数据位
u8 UART1ReceFullFlag = 0;
//串口2队列定义
u8 UART2SendBuff[UART2BuffSize];
u8 UART2ReceBuff[UART2BuffSize];
u16 UART2ReceIn = 0;
u8 UART2ReceFullFlag = 0;
//串口3队列定义
u8 UART3SendBuff[UART3BuffSize];
u8 UART3ReceBuff[UART3BuffSize];
u16 UART3ReceIn = 0;
u8 UART3ReceFullFlag = 0;
//串口1初始化
void USART1_Configuration(u32 bound)
{
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
USART_InitTypeDef USART_InitStructure;;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE);//开启GPIOA和USART1时钟
//USART1_TX GPIOA.9
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9
//USART1_RX GPIOA.10初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10
//Usart1 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
//USART 初始化设置
USART_InitStructure.USART_BaudRate = bound;//串口波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式
USART_Init(USART1, &USART_InitStructure); //初始化串口1
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); //开启串口接收中断
USART_Cmd(USART1, ENABLE); //使能串口1
}
//串口2初始化
void USART2_Configuration(u32 bound)
{
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
USART_InitTypeDef USART_InitStructure;;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//开启GPIOA和USART1时钟
//USART2_TX GPIOA.2
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA.2
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.2
//USART2_RX GPIOA.3初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//PA3
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.3
//Usart2 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;//抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
//USART 初始化设置
USART_InitStructure.USART_BaudRate = bound;//串口波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式
USART_Init(USART2, &USART_InitStructure); //初始化串口2
USART_ITConfig(USART2,USART_IT_RXNE,ENABLE); //开启串口接收中断
USART_Cmd(USART2, ENABLE); //使能串口2
}
//串口3初始化
void USART3_Configuration(u32 bound)
{
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
USART_InitTypeDef USART_InitStructure;;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//开启GPIOA和USART1时钟
//USART3_TX GPIOB.10
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB.10
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOA.10
//USART3_RX GPIOB.3初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//PB11
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB.11
//Usart3 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;//抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
//USART 初始化设置
USART_InitStructure.USART_BaudRate = bound;//串口波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式
USART_Init(USART3, &USART_InitStructure); //初始化串口3
USART_ITConfig(USART3,USART_IT_RXNE,ENABLE); //开启串口接收中断
USART_Cmd(USART3, ENABLE); //使能串口3
}
//串口1发送一帧数据
void USART1_SendOneData(uint8_t SendOneData)
{
USART_SendData(USART1, SendOneData);
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
{}
}
//串口2发送一帧数据
void USART2_SendOneData(uint8_t SendOneData)
{
USART_SendData(USART2, SendOneData);
while (USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET)
{}
}
//串口3发送一帧数据
void USART3_SendOneData(uint8_t SendOneData)
{
USART_SendData(USART3, SendOneData);
while (USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET)
{}
}
//串口1发送一列数据
void USART1_SendUnfixedData(uint8_t *Buffer, uint8_t Length)
{
uint8_t i;
for(i=0;i<Length;i++)
{
USART1_SendOneData(*Buffer++);
}
}
//串口2发送一列数据
void USART2_SendUnfixedData(uint8_t *Buffer, uint8_t Length)
{
uint8_t i;
for(i=0;i<Length;i++)
{
USART2_SendOneData(*Buffer++);
}
}
//串口3发送一列数据
void USART3_SendUnfixedData(uint8_t *Buffer, uint8_t Length)
{
uint8_t i;
LED_ON;
for(i=0;i<Length;i++)
{
重点讲解串口中断的服务函数
//串口1中断服务函数
void USART1_IRQHandler(void)
{
u8 Res;//数据暂存
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断
{
Res =USART_ReceiveData(USART1); //读取接收到的数据
switch(UART1ReceIn)//读取接收到的数据有几位 每一位对应的数据协议校验
{
case 0:
if(Res=='T')
UART1ReceBuff[UART1ReceIn++] = Res;
else
UART1ReceIn = 0;
break;
case 1:
if(Res=='M')
UART1ReceBuff[UART1ReceIn++] = Res;
else
UART1ReceIn = 0;
break;
case 2:
if(Res==0x0f)
UART1ReceBuff[UART1ReceIn++] = Res;
else
UART1ReceIn = 0;
break;
case 3:
if(Res==0x01)
UART1ReceBuff[UART1ReceIn++] = Res;
else
UART1ReceIn = 0;
break;
case 4:
if(Res==0x31)
UART1ReceBuff[UART1ReceIn++] = Res;
else
UART1ReceIn = 0;
break;
default:
UART1ReceBuff[UART1ReceIn++] = Res;
break;
}
if(UART1ReceIn >= 57)
{
UART1ReceFullFlag = 1;
}
USART_ClearITPendingBit(USART1, USART_IT_RXNE);//清除相对应的中断位
}
else if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET) // 发送中断
{
USART_ClearITPendingBit(USART1, USART_IT_TXE); // clear interrupt
}
}
串口接收数据并对数据进行处理相关推荐
- Linux串口接收不到0X11数据
转自:http://www.2cto.com/os/201302/189931.html linux串口接收不到0x11解决 网上许多流行的linux串口编程的版本中都没对c_iflag(termio ...
- java 串口判断报文完整_如何判断串口接收完成一帧数据
1 使用定时器判断 这种方式建立在两帧数据不可能连续发送的基础上,也是modbus判断帧结束的方式,在接收到第一个字节的时候打开定时器,如果继续接收到数据则更新定时器,在被设定时间内没有接收到数据则定 ...
- Windows USB串口接收GPS北斗模块数据和数据说明
陈拓 2022/05/07-2022/05/09 1. 简介 本文以GPS+北斗卫星定位授时导航模块HT1818Z3G5L为例,在Win10下读数据. 产品参数 引脚定义 2. 连接PC机和HT181 ...
- matlab串口陀螺仪,matlab通过串口接收ARM7外设陀螺仪数据并绘图有困难急求解答...
我用STM32的板子接了个陀螺仪,想用matlab画个图看看数据,但是从网上扒了个代码不好用,,,,串口应该是连上了,就是数据送不到matlab里,也不报错,就是显示不出来,哪位大神帮忙看看问题在哪啊 ...
- openmv串口数据 串口助手_STM32 串口接收不定长数据 STM32 USART空闲检测中断
编者注: 单片机串口接收不定长数据时,必须面对的一个问题为:怎么判断这一包数据接收完成了呢?常见的方法主要有以下两种: 1.在接收数据时启动一个定时器,在指定时间间隔内没有接收到新数据,认为数据接收完 ...
- C# 串口接收1次数据会进入2次串口接收事件serialPort1_DataReceived,第2次进入时串口缓冲区为空
在C#中使用串口接收数据时发现,在完整的接收完一次数据后,还会再次进入串口接收事件. 在网上搜索资料发现其他开发者也有遇到该问题: [1] c#串口事件接受一次数据莫名其妙会触发两次 原文链接: ...
- stm32串口接收不定长数据_基于STM32之UART串口通信协议--接收
一.前言 1.简介 回顾上一篇UART发送当中,已经讲解了如何实现UART的发送操作了,接下来这一篇将会继续讲解如何实现UART的接收操作. 2.UART简介 嵌入式开发中,UART串口通信协议是我们 ...
- stc51单片机串口接收多字节数据
stc51单片机串口接收多字节数据 简介 51单片机有2个定时器,一个做串口波特率,一个做数据截止帧延时检测,硬件平台测试使用的是stc8的单片机,但是可以往51移植 代码 #include &quo ...
- STM32F0 串口接收超时
STM32F030F4上自带的串口硬件接收超时机制,使用很方便下面就来说说. 用于设定超时时间函数 USART_SetReceiverTimeOut( USARTx, USART_ReceiverT ...
- 单片机串口接收的几种常用的数据处理方法
单片机串口接收的几种常用的数据处理方法 一.为什么串口接收的数据需要处理 我们在做项目的时候经常会用到串口,当我们用串口和别的设备通讯的时候就需要严格遵循通讯协议,然而,仅仅是遵循通讯协议是不够的,因 ...
最新文章
- Java程序员修炼之路(一)我们为什么选择Java
- 【翻译】Pro LINQ Language Integrated Query in C# 2008 -- 第三章 (LINQ TO Objects) 第一节
- java private 变量_java 的private的用法保护成员变量的值,将值判断
- javascript的self和this使用小结
- 计算机一级文档题,计算机一级模拟题
- C/C++——输入输出字符相关,cin.get()、getchar()和cin.getline()
- MySQL(2)--MYSQL 安装
- 1. 初识 Lucene
- 【Oracle】SQLPLUS命令
- spring之初识IocAop
- Linux之DHCP服务及配置
- java 解密pdf文件_Java 加密和解密PDF文档
- 检测报告上CNAS、CMA资质含义及联系
- 人工神经网络有哪些算法,神经网络都有哪些算法
- 通信工程考研英语复试专有名词翻译
- #智能宿舍门禁 esp8266+RC522模块+DFPlay Mini Mp3模块实现宿舍智能门锁//NFC//物联网
- Franka Emika 机械臂在ROS下控制
- 专访小熊戴欣,从国内最贵婚尚大咖到仪式感大师的进阶之路
- 开尔文夹接线图解_什么是开尔文四线检测|Kelvin Four-terminal sensing|开尔文|Kelvin 4|开尔文四线电阻检测-产品知识-资讯-深圳华壬电子...
- 计算机在语文教学中的用场,信息技术在语文教学中的作用