历史上的今天

今天是:2024年09月07日(星期六)

2019年09月07日 | 串口接收数据并对数据进行处理

发布者:古通闲人 来源: eefocus关键字:串口  接收数据  处理 手机看文章 扫描二维码
随时随地手机看文章

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


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;//无奇偶校验位

[1] [2]
关键字:串口  接收数据  处理 引用地址:串口接收数据并对数据进行处理

上一篇:单片机中Sprint函数
下一篇:I2C总线详解笔记

推荐阅读

如今,中国人正在面临比较严峻的身体健康问题。据不完全统计,乳腺癌是中国女性最常见的癌症,为每10万人21.6例;中国高血压患者有3.3亿,相当于每4个人里面就有1个高血压患者;而随着人口的老龄化,每年新增帕金森病患者人数达10万人以上,目前达300万左右。现今生活中对人们身体健康造成威胁的因素越来越多,随着人们的健康保护意识不断提升,各种医疗...
实验过程中的笔记 在持续更新中 只是一个简化版本利用定时器1 2 3 4 配置的PWM输出 PWM输出注意外部接入的高电平还是低电平 注意修改 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性高TIM_OCPolarity_High 接高电平极性为高 接低电平输出极性为低TIM_OCPolarity_Low //定时器3 ,输出T...
近日获悉,智能骨科手术机器人企业“键嘉机器人”宣布完成超亿元人民币B轮融资,由高瓴创投、复星医药及老股东BV百度风投共同投资。据了解,本轮融资资金将用于推进公司现有关节置换手术机器人的临床注册及新产品研发。对于连续获得知名机构投资,键嘉机器人创始人许靖表示:“目前,关节置换手术的成功与否非常依赖医生的经验和手术技巧。在这一背景下,...
当前,汽车缺芯已经成为全球汽车行业的公认难题,丰田、本田、大众、通用等跨国全球车企,也不得不限产、减产来应对芯片短缺。而诸如大众这样的全球车企,在国内的受到的打击更大。  近日,大众CEO赫伯特·迪斯在接受CNBC采访时表示:“由于芯片短缺,我们正在失去中国的市场”。  事实上,迪斯也并非危言耸听,大众集团在话的销量数据,一直在直线下...

史海拾趣

问答坊 | AI 解惑

我是新手,请教一个问题啊!!!

请问我用mulitism仿真时,电容C1的电压不变,请问这是为什么啊!!!!…

查看全部问答∨

地的分类

Vref是ADC (Analog to Digital Converter 模数变换器)功能的参考电压输入脚,当ADC的参考电压源选用外部参考电压时,必须用一路电压输入到Verf。如,MCU工作电压是5V,若想将ADC的最大采样电压定为2.5V时,则可以整一路电压稳定在2.5V输入到Vref即可 ...…

查看全部问答∨

Freescale的MC13224芯片如何能得到RSSI的值呢?

手上有Freescale MC13224的开发板,有一个用ZigBee人员定位的项目,知道可以通过RSSI来得到被测目标到通信节点的距离,但不知道如何得到RSSI的值。请教各位高手!!…

查看全部问答∨

有个问题

我目前有个项目,正在做系统硬件设计,就是单板硬件系统的设计,此前是一张白纸,对系统硬件类一点不懂,请问高手入门的方法。…

查看全部问答∨

ATMega16驱动12864lcd-绘图-画点

因为我在网上看了很久,12864绘图中的画点有些难度。因为可以液晶芯片不一样驱动会有差别。 所以把我写的贴出来大家分享,不明白的加我QQ:343700980一起交流! 我使用的环境是: 单片机:ATMega16 开发板:DDC-16B 液晶是:YJD12864C-1(可以 ...…

查看全部问答∨

向高手求救:WinCE的手机如何定时运行程序?

Wince 一段时间后会进入休眠状态,Timer不能用。 CeRunAppAtTime短时间能用,休眠状态也不能用。 我目前的方法是用CeSetUserNotificationEx这个函数,但是也有问题,代码如下,请高手指点,感激不尽!          C ...…

查看全部问答∨

操作系统的地址问题

我想问一下,1.wince和linux的内核在内存中启动的地址是怎么确定的?             2.我用的是64M的NAND FLASH ,我要将wince内核烧写到FLASH中,从FLASH中的哪个地址开始烧写 谢谢了…

查看全部问答∨

为什么IFG(中断标识位)会自动置1

我的程序中每次中断处理都将相应的IFG置为0了,可是过一下这个标识位又自动变成1了,而我的程序根本没有处理过这个IFG位。 我用的是133,不知道这是为什么。盼望高手解答。谢谢!…

查看全部问答∨

IAR C编译器中如何选择才能不初始化 片内RAM

现写一程序,用 IAR C 3.0版本. 希望在系统复位后不初始化 片内RAM 要怎么设置 因为系统中有电池,所以在复位后不初始化RAM区,因其中有数据 这个问题可能大家都要用到的.…

查看全部问答∨

msp430 application uart 驱动安装失败啊,求助大神们

我W732旗舰,提示已找到驱动程序,但是试图安装时错误,前一个求助帖方法不顶用啊,有人说USB线问题,但是在别人机子上能装上, [ 本帖最后由 井头咖 于 2012-7-11 16:09 编辑 ]…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved