正点原子的串口中断函数如下:

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
    }    
}

串口接收数据并对数据进行处理相关推荐

  1. Linux串口接收不到0X11数据

    转自:http://www.2cto.com/os/201302/189931.html linux串口接收不到0x11解决 网上许多流行的linux串口编程的版本中都没对c_iflag(termio ...

  2. java 串口判断报文完整_如何判断串口接收完成一帧数据

    1 使用定时器判断 这种方式建立在两帧数据不可能连续发送的基础上,也是modbus判断帧结束的方式,在接收到第一个字节的时候打开定时器,如果继续接收到数据则更新定时器,在被设定时间内没有接收到数据则定 ...

  3. Windows USB串口接收GPS北斗模块数据和数据说明

    陈拓 2022/05/07-2022/05/09 1. 简介 本文以GPS+北斗卫星定位授时导航模块HT1818Z3G5L为例,在Win10下读数据. 产品参数 引脚定义 2. 连接PC机和HT181 ...

  4. matlab串口陀螺仪,matlab通过串口接收ARM7外设陀螺仪数据并绘图有困难急求解答...

    我用STM32的板子接了个陀螺仪,想用matlab画个图看看数据,但是从网上扒了个代码不好用,,,,串口应该是连上了,就是数据送不到matlab里,也不报错,就是显示不出来,哪位大神帮忙看看问题在哪啊 ...

  5. openmv串口数据 串口助手_STM32 串口接收不定长数据 STM32 USART空闲检测中断

    编者注: 单片机串口接收不定长数据时,必须面对的一个问题为:怎么判断这一包数据接收完成了呢?常见的方法主要有以下两种: 1.在接收数据时启动一个定时器,在指定时间间隔内没有接收到新数据,认为数据接收完 ...

  6. C# 串口接收1次数据会进入2次串口接收事件serialPort1_DataReceived,第2次进入时串口缓冲区为空

    在C#中使用串口接收数据时发现,在完整的接收完一次数据后,还会再次进入串口接收事件. 在网上搜索资料发现其他开发者也有遇到该问题: [1]  c#串口事件接受一次数据莫名其妙会触发两次   原文链接: ...

  7. stm32串口接收不定长数据_基于STM32之UART串口通信协议--接收

    一.前言 1.简介 回顾上一篇UART发送当中,已经讲解了如何实现UART的发送操作了,接下来这一篇将会继续讲解如何实现UART的接收操作. 2.UART简介 嵌入式开发中,UART串口通信协议是我们 ...

  8. stc51单片机串口接收多字节数据

    stc51单片机串口接收多字节数据 简介 51单片机有2个定时器,一个做串口波特率,一个做数据截止帧延时检测,硬件平台测试使用的是stc8的单片机,但是可以往51移植 代码 #include &quo ...

  9. STM32F0 串口接收超时

    STM32F030F4上自带的串口硬件接收超时机制,使用很方便下面就来说说. 用于设定超时时间函数 USART_SetReceiverTimeOut( USARTx,  USART_ReceiverT ...

  10. 单片机串口接收的几种常用的数据处理方法

    单片机串口接收的几种常用的数据处理方法 一.为什么串口接收的数据需要处理 我们在做项目的时候经常会用到串口,当我们用串口和别的设备通讯的时候就需要严格遵循通讯协议,然而,仅仅是遵循通讯协议是不够的,因 ...

最新文章

  1. Java程序员修炼之路(一)我们为什么选择Java
  2. 【翻译】Pro LINQ Language Integrated Query in C# 2008 -- 第三章 (LINQ TO Objects) 第一节
  3. java private 变量_java 的private的用法保护成员变量的值,将值判断
  4. javascript的self和this使用小结
  5. 计算机一级文档题,计算机一级模拟题
  6. C/C++——输入输出字符相关,cin.get()、getchar()和cin.getline()
  7. MySQL(2)--MYSQL 安装
  8. 1. 初识 Lucene
  9. 【Oracle】SQLPLUS命令
  10. spring之初识IocAop
  11. Linux之DHCP服务及配置
  12. java 解密pdf文件_Java 加密和解密PDF文档
  13. 检测报告上CNAS、CMA资质含义及联系
  14. 人工神经网络有哪些算法,神经网络都有哪些算法
  15. 通信工程考研英语复试专有名词翻译
  16. #智能宿舍门禁 esp8266+RC522模块+DFPlay Mini Mp3模块实现宿舍智能门锁//NFC//物联网
  17. Franka Emika 机械臂在ROS下控制
  18. 专访小熊戴欣,从国内最贵婚尚大咖到仪式感大师的进阶之路
  19. 开尔文夹接线图解_什么是开尔文四线检测|Kelvin Four-terminal sensing|开尔文|Kelvin 4|开尔文四线电阻检测-产品知识-资讯-深圳华壬电子...
  20. 计算机在语文教学中的用场,信息技术在语文教学中的作用

热门文章

  1. SpringBoot-yaml语法规则和读取数据
  2. 我花了十八年时间才能和你坐在一起喝咖啡
  3. linux下查找网口_Linux服务器查看对应网卡的网口
  4. smina 基于结构的虚拟筛选
  5. 微信小程序仿猫眼电影在线选座实现
  6. 【火灾检测】基于matlab GUI森林火灾检测系统(带面板)【含Matlab源码 1921期】
  7. Linux驱动——mmc card热插拔检测机制(十)
  8. javascript遍历方法
  9. 区块链数字藏品平台怎么开发?
  10. c++实现sqrt函数功能