历史上的今天
返回首页

历史上的今天

今天是:2025年03月23日(星期日)

正在发生

2021年03月23日 | STM32-串口实验学习笔记

2021-03-23 来源:eefocus

USART1_IRQHandler(void)函数:


当串口1发生了相应的中断,就会跳到改函数执行。这里设计了一个小小的接收协议(系统并未定义):通过这个函数,配合一个数组USART_RX_BUF[ ],一个接收状态寄存器USART_RX_STA实现对串口的数据的接收管理。USART_RX_BUF[ ]最大值为64,也就是一次接收的数据最大不能超过64字节。USART_RX_STA是一个接收状态寄存器,其各位的定义如表所示:

(注意:这个是作者设计的协议,怎样判断串口接收一组数据完毕?由于每次接收的数据长度不一样,少的就3个8位数据,多的时候有十多个,这个数据个数是不定的,且没规律的数据,有什么好的方法让它接收完整?

协议的设计思路如下:


当接收到从电脑发过来的数据,把接收到的数据保存在 USART_RX_BUF 中,同时在接收状态寄存器(USART_RX_STA)中计数接收到的有效数据个数,当收到回车(0X0D,0X0A)的第一个字节 0X0D时,标志位即第六位置1,计数器将不再增加,等待 0X0A的到来,而如果 0X0A 没有来到,则认为这次接收失败,重新开始下一次接收。如果顺利接收到 0X0A,则标记 USART_RX_STA的第七位,这样完成一次接收,并等待该位被其他程序清除,从而开始下一次的接收,而如果迟迟没有收到 0X0D,那么在接收数据超过 64 个了,则会丢弃前面的数据,重新接收。由于这个寄存器是作者定义,我们理解时可能容易迷糊,其实这个跟普通寄存器类似,只不过是作者定义了一个8位数,规定了它每位的定义,前两位是两个个标志位,后六位用来计数,这样就好理解了。函数代码如下:


void USART1_IRQHandler(void)  

{  

    u8 res;       

    if(USART1->SR&(1<<5))//接收到数据    USART1应该是作者定义的一个结构体,内含各个寄存器   

    {      

        res=USART1->DR;   

        if((USART_RX_STA&0x80)==0)//接收未完成   

        {  

            if(USART_RX_STA&0x40)//接收到了0x0d   

            {  

                if(res!=0x0a)USART_RX_STA=0;//接收错误,重新开始   

                else USART_RX_STA|=0x80;    //接收完成了    

            }else //还没收到0X0D   

            {     

                if(res==0x0d)USART_RX_STA|=0x40;  

                else  

                {  

                    USART_RX_BUF[USART_RX_STA&0X3F]=res;  

                    USART_RX_STA++;  

                    if(USART_RX_STA>63)USART_RX_STA=0;//接收数据错误,重新开始接收         

                }          

            }  

        }                                                  

    }                                              

}   


其实我们可以不用协议法


推荐阅读

史海拾趣

C-TON Industries公司的发展小趣事

随着公司规模的扩大,C-TON意识到单凭自己的力量难以在竞争激烈的电子行业中立足。于是,公司开始积极寻求与其他企业的战略合作。通过与一家知名的电子产品制造商建立合作伙伴关系,C-TON成功将其芯片技术应用于对方的产品中,进一步扩大了市场份额。这一合作不仅提升了C-TON的知名度,也为其带来了稳定的订单和收入来源。

DB Unlimited公司的发展小趣事

DB Unlimited公司最初只是一个生产基础音频组件的小型企业。随着技术的不断发展和市场的变化,公司意识到单纯的组件生产已经无法满足客户的需求。于是,DB Unlimited开始转型,致力于提供完整的音频解决方案。通过不断研发和创新,公司成功开发出了一系列高性能的音频产品,并凭借其卓越的品质和性能,赢得了客户的广泛认可。

Connector City公司的发展小趣事

随着电子行业的快速发展,连接器技术也在不断更新换代。Connector City公司意识到,只有不断创新才能在激烈的市场竞争中立于不败之地。因此,公司加大了研发投入,组建了一支高素质的研发团队,专注于连接器技术的创新研究。经过多年的努力,公司成功开发出了一款具有高性能、高可靠性和高稳定性的新型连接器产品,赢得了客户的广泛认可和好评。

American Power Design Inc公司的发展小趣事

为了进一步增强自身实力,APDI积极寻求与其他公司的并购与合作机会。它成功收购了一家在半导体制造领域具有领先技术的公司,从而完善了自身的产品线和技术体系。同时,APDI还与多家行业巨头建立了战略合作关系,共同研发新技术和新产品,实现了资源共享和优势互补。

GarrettCom公司的发展小趣事

研发:GarrettCom(现为Belden的一部分)始终将技术创新作为企业发展的核心驱动力。公司不断投入研发资源,致力于开发更加先进、可靠的工业网络通信产品。通过持续的技术创新,GarrettCom不仅推动了工业通信技术的进步,还为客户提供了更加高效、便捷的通信解决方案。

应用:这些创新产品被广泛应用于工业自动化、交通监控、能源管理等多个领域,为客户创造了巨大的价值。同时,GarrettCom还积极参与国际标准的制定和推广工作,为行业的标准化发展做出了积极贡献。

Global Mixed-Mode Technology Inc公司的发展小趣事
三相缺相报警灯电路的维护周期和注意事项应根据实际情况来制定。一般来说,建议定期检查电路的连接情况、继电器的动作情况以及报警灯的工作状态等。同时,还需要注意保持电路的清洁和干燥以防止短路或腐蚀等问题的发生。在维护过程中应严格遵守操作规程和安全规范以确保人员和设备的安全。

问答坊 | AI 解惑

超声波模块+红外遥控资料

本帖最后由 paulhyde 于 2014-9-15 04:00 编辑 1超声波测距已通过实物测试 2专门针对SMK1838遥控接收头的红外遥控装置  …

查看全部问答>

刚才把开发板单片机的串口烧了,郁闷!

单片机(STC89C52)VCC是5V, GPS(MTK M89)VCC是4.3V RXD连TXD,TXD连RXD 用万用表量的时候GPS的串口是4.8V,GPS的是3.6V 不知道怎么的就烧了?为什么没接串口之前MCU的RXD、TXD都有4.8的电压? 小弟刚入门还请指点迷经,要怎么联才可以让MCU读到GPS ...…

查看全部问答>

Freescale的单片机RTI的一个问题

   实时中断定时0.625ms,难道是中断的时间太快了?怎么For里面的循环都没有执行了呢?    现在想明白的就是一个问题,在进入中断响应的处理过程中,定时器是不是还在定时?我感觉应该在退出响应之后才可以,要不然,如果响应 ...…

查看全部问答>

wince系统下 compact framework程序崩溃的求救

我的wince系统,已经按照过compact framwork 2.0 ,期间运行 dotnet 程序都很正常(程序比较经常读写文件)。大约持续运行1个月后,dotnet程序无法启动,报异常。而且我用任意一个dotnet程序都是出现这个异常。怀疑系统中产生了什么异常。具体不明 ...…

查看全部问答>

请问:什么叫上位机,下位机啊,它们是干什么用的啊?

什么叫上位机,下位机啊,它们是干什么用的啊?…

查看全部问答>

IR new ic Rugged AEC-Q100 Qualified 600V ICs

IR Introduces Family of Rugged AEC-Q100 Qualified 600V ICs for Energy-Efficient Automotive Gate Drive Applications International Rectifier has launched a family of rugged 600V ICs for energy-efficient automotive ga ...…

查看全部问答>

请教城主一个MCO的问题,你以前回复的帖子!

版主发表于 2010-8-24 17:44 | 只看该作者 回复 引用 评分 报告 返回版面 TOP   得分:0…

查看全部问答>

菜鸟求组用CCS设置PWM的问题

用16F690做一个PWM信号的项目,但是总是不出来PWM信号,程序如下 #include #use delay(clock = 12000000) #fuses HS,NOWDT,NOPROTECT,PUT,NOBROWNOUT,MCLR #use fixed_io(c_outputs = PIN_C4,PIN_C6, PIN_C7) void main(void) { setup_ ...…

查看全部问答>

AD620双级放大电路

本系统要采集的信号十分微弱,5~100uV,设计电路要放大40000倍。由于AD620放大倍数越大,误差就越大,故本电路用了两片AD620形成二级放大。其中U1放大100倍,U2放大10倍。图中IN1,IN2为经过差分放大后的信号,输入到U1。U1放大后形成一路信号输入到U ...…

查看全部问答>