历史上的今天
返回首页

历史上的今天

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

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

推荐阅读

史海拾趣

璟德(ACX)公司的发展小趣事

多年来,璟德(ACX)凭借其卓越的技术实力和市场表现,荣获了多项荣誉和奖项。这些荣誉不仅是对公司过去努力的肯定,也为其未来的发展注入了新的动力。同时,璟德(ACX)始终坚持创新驱动的发展理念,不断投入研发,推出新产品和新技术,以满足市场的不断变化和客户的需求。

请注意,以上故事是基于现有资料和行业常识构建的,可能无法完全反映璟德(ACX)公司实际发展历程中的所有细节和复杂性。如需了解更多关于璟德(ACX)公司的故事和发展历程,建议查阅公司官方网站、相关新闻报道或行业研究报告。

Ceramics公司的发展小趣事

某家名为“创新陶瓷”的Ceramics公司,通过不断研发新技术,成功打破了传统陶瓷材料在电子领域的应用限制。该公司推出了一款具有高热导率、低电阻率的陶瓷基板,显著提高了电子设备的性能稳定性。这一创新不仅赢得了市场的广泛认可,还吸引了多家知名电子厂商的合作意向。创新陶瓷通过持续的技术创新,逐渐在电子行业树立了领先地位。

Ferraz Shawmut(Mersen)公司的发展小趣事

随着电子行业的快速发展和市场竞争的加剧,Mersen面临着越来越多的挑战。然而,公司始终坚持以客户为中心的理念,通过深入了解客户需求和市场趋势,不断推出符合市场需求的新产品和技术解决方案。同时,公司也加强了与全球合作伙伴的合作与交流,共同应对市场挑战并推动行业发展。

以上五个故事概述了Ferraz Shawmut(现更名为Mersen)在电子行业中的关键发展历程。通过不断创新、全球扩张和积极应对市场挑战,公司成为了电气保护领域的领先企业。

DEVCON公司的发展小趣事

在1950年代,电子工业正处于蓬勃发展的初期。阿尔·克瑞顿,一位富有创新精神的化学家,在美国马萨诸塞州丹佛斯市的一个实验室里,经过无数次的试验,终于研发出了一种名为Devcon可塑钢修补剂的新型材料。这种材料经济实惠、不易燃,且能够作为焊接的替代品,迅速在电子制造和维修领域引起了广泛关注。这就是DEVCON公司的起点,一个由创新精神和市场需求共同点燃的火花。

AUREL公司的发展小趣事

随着电子市场竞争的加剧,AUREL公司意识到单纯的技术创新已不足以维持竞争优势。于是,公司开始注重品质管理,引入了先进的生产流程和严格的质量控制体系。这一举措大大提高了产品的可靠性和稳定性,赢得了客户的信赖和好评。通过持续改进和优化,AUREL公司的产品质量逐渐在行业中树立了良好的口碑。

EA Elektro-Automatik公司的发展小趣事

1974年,电子工程师Helmut Nolden先生在德国创立了EA Elektro-Automatik公司。初期,公司主要生产小型固定式和可调式电源,以满足工业、实验室和业余爱好者的需求。这些产品凭借稳定的性能和合理的价格,在市场上逐渐获得了认可。随着技术团队能力的逐渐提高和持续创新,EA Elektro-Automatik开始扩大产品线,满足更多客户的特定需求。

问答坊 | AI 解惑

wince 问题:怎么在工具栏里加入一个按钮,编译运行后却看不到啊?

wince   问题:怎么在工具栏里加入一个按钮,编译运行后却看不到啊? …

查看全部问答>

请教:图像采集卡和摄像头的驱动编写问题

我有大恒的CG-300图像采集卡和摄像头。这个摄像头是连在采集卡上的,不是USB接 口的。图像采集卡的API我也知道。 请问:能不能通过自己编写驱动程序,让摄像头采集图像传给图像采集卡,然后再在 qq里显示出来,也就是把它用于视频聊天呢?…

查看全部问答>

VxWorks上OSPF路由协议的源代码

谁有OSPF路由协议的源代码?最好有详细注释。 twuking@gmail.com…

查看全部问答>

请问ST的M25和M45系列SPI接口串行FLASH有什么区别?

                                  …

查看全部问答>

问个简单的TIM问题.

 大家帮我看看程序吧,,我想在TIM3的channel1中输出同频率但不同占空比的PWM..采用的策略是当TIM3发生TIM_IT_Update时,修改CCR1的值..但用下面的程序,程序一运行到倒数第二行TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);就死掉了...不知道什 ...…

查看全部问答>

请教数字滤波是怎么实现的,原理是什么

       我是一个新手,以前没怎么来过论坛,当初注册了一个号是因为下资料。现在发现论坛确实是一个好地方。这是第一次发帖,希望得到大家的指点 。        对于模拟滤波器, ...…

查看全部问答>

TimerA的捕获如果时钟不同步会导致什么结果来着?

记性差,糊涂了,问一下 手册中:The capture signal can be asynchronous to the timer clock and cause a race condition. Setting the SCS bit will synchronize the capture with the next timer clock. Setting the SCS bit to synchronize ...…

查看全部问答>

关于引脚中断的问题———求高手指导

430的引脚开中断后,直接用手触摸就会触发,这个是什么原理呢? 谁能给专业地解释下啊~~ 这是我的代码,用手触摸p2.2引脚就可以开/闭led了。。?? 深夜思考中……#include #define LED_0 BIT0 #define LED_1 BIT6 #define LED_OUT P1OUT #def ...…

查看全部问答>