历史上的今天
返回首页

历史上的今天

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

正在发生

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

2019-09-09 来源: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;//无奇偶校验位

推荐阅读

史海拾趣

Anderson Electronics Inc公司的发展小趣事

Anderson Electronics Inc公司成立于电子行业的初期,创始人凭借对电子技术的深厚造诣和对市场需求的敏锐洞察,成功开发出了一款具有划时代意义的电子产品。这款产品以其卓越的性能和稳定的品质迅速占领了市场,为公司赢得了良好的口碑和丰厚的利润。在创业初期,公司注重技术创新和研发投入,不断推出新产品,逐步在电子行业中崭露头角。

ALLEN BRADLEY公司的发展小趣事

随着全球化趋势的加强,Anderson Electronics Inc公司开始寻求国际合作,与国外知名电子企业开展技术交流和合作研发。通过与国际先进技术的融合和创新,公司成功开发出了一系列具有国际竞争力的新产品。这些产品不仅在国内市场取得了成功,还远销海外,为公司带来了可观的利润和更广阔的发展空间。

Helium_Systems__Inc.公司的发展小趣事

海曼电子深知人才是企业发展的根本动力。因此,公司一直将人才培养和团队建设放在重要位置。公司建立了完善的人才培养体系,通过内部培训、外部交流等方式,不断提升员工的专业技能和综合素质。同时,公司还注重营造积极向上的企业文化氛围,鼓励员工创新思维和团队合作。这些举措不仅吸引了大量优秀人才加入海曼电子的大家庭,还为公司的持续发展提供了强有力的保障。

AMICC [AMIC TECHNOLOGY]公司的发展小趣事

近年来,电子行业面临着技术升级、市场变革等多重挑战。AMICC积极应对这些挑战,不断调整战略和业务模式。公司加大了对新兴技术的研发投入,加快了产品更新换代的速度。同时,AMICC还加强了与产业链上下游企业的合作,共同应对市场变化。这些措施使AMICC在行业中保持了领先地位,实现了持续稳健的发展。

DOMINANT公司的发展小趣事

在LED产业蓬勃发展的背景下,统明亮(DOMINANT)公司在2000年应运而生。它的诞生源于欧司朗(OSRAM)在马六甲工厂的分拆,加上马来西亚财团的加持,这家新公司迅速崭露头角。统明亮公司从成立之初就专注于LED技术的研发和生产,凭借其卓越的技术实力和创新能力,逐渐在电子行业中树立了良好的口碑。经过数年的不懈努力,统明亮在全球贴片式LED领域取得了领先地位,特别是在车用LED封装领域,其产品质量和技术水平均处于行业前列。

FLEX LTD公司的发展小趣事

在LED产业蓬勃发展的背景下,统明亮(DOMINANT)公司在2000年应运而生。它的诞生源于欧司朗(OSRAM)在马六甲工厂的分拆,加上马来西亚财团的加持,这家新公司迅速崭露头角。统明亮公司从成立之初就专注于LED技术的研发和生产,凭借其卓越的技术实力和创新能力,逐渐在电子行业中树立了良好的口碑。经过数年的不懈努力,统明亮在全球贴片式LED领域取得了领先地位,特别是在车用LED封装领域,其产品质量和技术水平均处于行业前列。

问答坊 | AI 解惑

自己做的超声波模块(带仿真)

本帖最后由 paulhyde 于 2014-9-15 09:02 编辑 自己做的超声波模块(带仿真),与大家分享,希望大家不希赐教  …

查看全部问答>

我自己定制的sdk为什么无法安装

每次安装到最后都是出现一个错误提示对话框: ToolsMsmCA(Error):Setup package issue: Xml file not found: 然后进度条就发生了传说中的自动回滚Rolling back 那位大侠遇到过我这种情况啊   麻烦指导一下啊   谢谢…

查看全部问答>

关于WIN CE嵌入式系统的流接口驱动的问题~~

没做过嵌入式系统,现在要做这个的开发,闹心~~~买了个开发板,想好好研究发现了好多疑问。目的是想通过ARM芯片最终控制自定义的外设~~。看了些资料原来是要定义IO的流接口驱动。买的开发板提供了一个例程,就是控制开发板上的4个LED灯的熄、灭,程 ...…

查看全部问答>

技术联盟-软件交流

eeworld.NET中国最大IT技术讨论社区,为IT人士提供最全面的服务交流平台和源代码,致力于嵌入式方面的深度研究,wince开发研究QQ群:8660981…

查看全部问答>

看了向农姐姐的帖子后。。。。

       今天中午闲暇之余,看了向农姐姐的一个帖子,是关于面试的,拒绝了一个女孩子,源于一个问题“如果她来EEWORLD,只能从最底层做起,做些别人不愿意做的事。。。”这不得不勾起了我的回忆,往事历历在目啊。。 ...…

查看全部问答>

有谁用过ST7576 128*64 LCD 吗?

有谁用过ST7576  128*64 LCD 吗?可不可以给我发个Datasheet,多谢了!…

查看全部问答>

【原创】在编译通过后,出现连接问题,请帮忙,谢谢

undefined 用的是C语言,CPU使用的是MSP430F135,使用了库函数,能编译通过,但是无法连接成功,出现如下提示: Making target Debug... Linking... Error[e46]: Undefined external "log10" referred in na ( E:\\jiemei\\program\\NA ...…

查看全部问答>

关于 伪随机序列发生器,有几个问题请教下

各位好,最近在看伪随机序列发生器,看了些资料,但是有个地方还是没有看明白。主要是从生成多项式与生成框图和verilog代码怎么对应的。比如下面的资料:他的生成多项式是P=X15+X14+1,但是看生成框图,只是把第14位和第15位抽头异或了,这样不就成 ...…

查看全部问答>