历史上的今天
返回首页

历史上的今天

今天是:2025年04月20日(星期日)

正在发生

2021年04月20日 | STM32串口中断接收方式详细比较

2021-04-20 来源:eefocus

简介:本例程通过PC机的串口调试助手将数据发送至STM32,接收数据后将所接收的数据又发送至PC机,具体下面详谈


实例一:

void USART1_IRQHandler(u8 GetData)

{

u8 BackData;

if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //中断产生

{

USART_ClearITPendingBit(USART1,USART_IT_RXNE); //清除中断标志.

GetData = UART1_GetByte(BackData); //也行GetData=USART1->DR;

USART1_SendByte(GetData); //发送数据

GPIO_SetBits(GPIOE, GPIO_Pin_8 ); //LED闪烁,接收成功发送完成

delay(1000);

GPIO_ResetBits(GPIOE, GPIO_Pin_8 );

}

}


这是最基本的,将数据接收完成后又发送出去,接收和发送在中断函数里执行,main函数里无其他要处理的。


优点:简单,适合很少量数据传输。


缺点:无缓存区,并且对数据的正确性没有判断,数据量稍大可能导致数据丢失 。


实例二:

void USART2_IRQHandler()

{

if(USART_GetITStatus(USART2,USART_IT_RXNE) != RESET) //中断产生

{

USART_ClearITPendingBit(USART2,USART_IT_RXNE); //清除中断标志

Uart2_Buffer[Uart2_Rx_Num] = USART_ReceiveData(USART2);

Uart2_Rx_Num++;

}


if((Uart2_Buffer[0] == 0x5A)&&(Uart2_Buffer[Uart2_Rx_Num-1] == 0xA5))//判断最后接收的数据是否为设定值,确定数据正确性

Uart2_Sta=1;

if(USART_GetFlagStatus(USART2,USART_FLAG_ORE) == SET) //溢出

{

USART_ClearFlag(USART2,USART_FLAG_ORE);//读SR

USART_ReceiveData(USART2); //读DR

}

}


if( Uart2_Sta )

{

for(Uart2_Tx_Num=0;Uart2_Tx_Num < Uart2_Rx_Num;Uart2_Tx_Num++)

USART2_SendByte(Uart2_Buffer[Uart2_Tx_Num]); //发送数据


Uart2_Rx_Num = 0; //初始化

Uart2_Tx_Num = 0;

Uart2_Sta = 0;

}

这是加了数据头和数据尾的接收方式,数据头和尾的个数可增加,此处只用于调试之用。中断函数用于接收数据以及判断数据的头尾,第二个函数在main函数里按照查询方式执行。

优点:较简单,采用缓存区接收,对提高数据的正确行有一定的改善 。

缺点:要是第一次数据接收错误,回不到初始化状态,必须复位操作 。


实例三:

vvoid USART2_IRQHandler()

{

if(USART_GetITStatus(USART2,USART_IT_RXNE) != RESET) //中断产生

{

USART_ClearITPendingBit(USART2,USART_IT_RXNE); //清除中断标志.

Uart2_Buffer[Uart2_Rx] = USART_ReceiveData(USART2);

Uart2_Rx++;

Uart2_Rx &= 0x3F; //判断是否计数到最大

}

if(USART_GetFlagStatus(USART2,USART_FLAG_ORE) == SET) //溢出

{

USART_ClearFlag(USART2,USART_FLAG_ORE); //读SR

USART_ReceiveData(USART2); //读DR

}

}


if( Uart2_Tx != Uart2_Rx )

{

USART2_SendByte(Uart2_Buffer[Uart2_Tx]); //发送数据

Uart2_Tx++;

Uart2_Tx &= 0x3F; //判断是否计数到最大

}

采用FIFO方式接收数据,由0x3F可知此处最大接收量为64个,可变,中断函数只负责收,另一函数在main函数里执行,FIFO方式发送。

优点:发送和接收都很自由,中断占用时间少,有利于MCU处理其它。

缺点:对数据的正确性没有判断,一概全部接收。


实例四:

void USART2_IRQHandler()

{

if(USART_GetITStatus(USART2,USART_IT_RXNE) != RESET) //中断产生

{

USART_ClearITPendingBit(USART2,USART_IT_RXNE); //清除中断标志

Uart2_Buffer[Uart2_Rx] = USART_ReceiveData(USART2);

Uart2_Rx++;

Uart2_Rx &= 0xFF;

}

if(Uart2_Buffer[Uart2_Rx-1] == 0x5A) //头

Uart2_Tx = Uart2_Rx-1;

if((Uart2_Buffer[Uart2_Tx] == 0x5A)&&(Uart2_Buffer[Uart2_Rx-1] == 0xA5)) //检测到头的情况下检测到尾

{

Uart2_Len = Uart2_Rx-1- Uart2_Tx; //长度

Uart2_Sta=1; //标志位

}

if(USART_GetFlagStatus(USART2,USART_FLAG_ORE) == SET) //溢出

{

USART_ClearFlag(USART2,USART_FLAG_ORE); //读SR

USART_ReceiveData(USART2); //读DR

}

}


if( Uart2_Sta )

{

for(tx2=0;tx2 <= Uart2_Len;tx2++,Uart2_Tx++)

USART2_SendByte(Uart2_Buffer[Uart2_Tx]); //发送数据

Uart2_Rx = 0; //初始化

Uart2_Tx = 0;

Uart2_Sta = 0;

}


数据采用数据包的形式接收,接收后存放于缓存区,通过判断数据头和数据尾(可变)来判断数据的“包”及有效性,中断函数用于接收数据和判断头尾以及数据包长度,另一函数在main函数里执行,负责发送该段数据。


优点:适合打包传输,稳定性和可靠性很有保证,可随意发送,自动挑选有效数据。


缺点:缓存区数据长度要根据“包裹”长度设定, 要是多次接收后无头无尾,到有头有尾的那一段数据恰好跨越缓存区最前和最后位置时,可能导致本次数据丢失,不过这种情况几乎没有可能。

推荐阅读

史海拾趣

Defender Security公司的发展小趣事

随着勒索软件的日益猖獗,Defender Security公司迅速调整战略,成立了专门的研究小组来对抗这种威胁。他们深入分析了勒索软件的传播方式和攻击手段,开发出了高效的检测和防御系统。通过不断的技术创新和优化,Defender Security成功帮助多家企业抵御了勒索软件的攻击,赢得了市场的广泛认可。

Bourns公司的发展小趣事

随着公司的不断发展,Bourns在1952年取得了世界上第一个可调式电阻的专利,即TrimpotR。这一技术突破标志着Bourns在电子元器件领域的领先地位,也为公司的产品线增添了核心竞争力。可调电阻的广泛应用推动了Bourns在电子行业的快速发展。

启英泰伦(Chiplntelli)公司的发展小趣事

近期,启英泰伦完成了数千万元的B++轮融资,由水木春锦资本、盛裕资本和自觉资本共同投资。这笔资金将主要用于产品的大规模量产和新产品的研发,以进一步加速启英泰伦在智能语音芯片市场的布局。资本的注入不仅为公司的发展提供了强有力的支持,也反映了市场对启英泰伦技术和市场前景的认可。

ASPEED Technology公司的发展小趣事

自成立以来,ASPEED Technology一直致力于自主创新技术的研发与客户需求的快速响应。公司拥有一支专业的研发团队,不断推出具有竞争力的新产品和解决方案。同时,ASPEED还积极拓展全球市场,与众多知名企业和机构建立了合作关系,为公司的发展奠定了坚实的基础。正是这种持续的创新与研发精神,使得ASPEED在电子行业中不断发展壮大,成为了一家备受瞩目的企业。

以上五个故事均基于ASPEED Technology公司发展起来的相关事实,展现了公司在并购、产品创新、合作研发等方面的努力和成果。这些故事不仅反映了ASPEED在电子行业中的成长轨迹,也展示了其不断追求卓越、推动行业发展的决心和实力。

Block USA Inc.公司的发展小趣事

在发展过程中,Block USA Inc.也面临着来自竞争对手和行业变化的挑战。然而,公司始终保持着创新精神,不断调整和优化产品与服务,以适应市场的变化。例如,面对数据安全和隐私保护的日益严格要求,Block加强了其数据保护措施,并公开承认了数据泄露事件并积极采取措施进行补救。同时,公司还继续拓展其业务边界,探索新的增长点,以保持其在电子行业中的竞争优势。

这些故事只是Block USA Inc.在电子行业发展历程中的一部分,它们展示了公司如何通过不断创新和拓展业务领域,逐步成为一家具有影响力的综合性电子企业。然而,随着市场的不断变化和竞争的加剧,Block仍需保持警惕并持续努力,以应对未来的挑战和机遇。

Helicomm公司的发展小趣事

Block USA Inc.最初以其线下支付业务Square在电子支付领域崭露头角。公司创始人杰克·多尔西洞察到小型商户在支付处理方面的需求,并推出了简单易用的磁条卡读卡器Square Reader。这一创新产品迅速受到市场欢迎,帮助无数小型企业和个体经营者实现了便捷、安全的电子支付。随着Square品牌的知名度不断提升,Block逐渐在支付领域建立了坚实的地位。

问答坊 | AI 解惑

电子设计 (遥控车)

本帖最后由 paulhyde 于 2014-9-15 08:54 编辑 有人猜测会有遥控车的题目 就跟大家分享一下  …

查看全部问答>

摇摇棒制作

网上这些东西都比较多了,今天也把我做的东东跟大家共享一下,前些日子就送给女朋友了。所以没有照片,真不好意思,这里有原理图,源程序(c语言),和去摸软件,可以自由更换源代码,对于初学单片机的人来说无疑是个不错的选择,而且可以把作品送 ...…

查看全部问答>

一个按钮通过SetWindowPos( )函数移动了位置,通过ShowWindow(SW_HIDE)却隐藏不了,怪事!

一个按钮通过SetWindowPos( )函数移动了位置,通过ShowWindow(SW_HIDE)却隐藏不了,怪事!…

查看全部问答>

关于对数据总线操作的问题

最近写了个应用程序对数据总线上的数据进行操作,关于物理地址和虚拟地址的映射我知道 假设*vi_adress为映射好的虚拟地址 先是写操作 *vi_adress=tmp  (tmp是数据) 这个操作是成功的 现在我想读取外面从过来的数据 tmp=*vi_adress& ...…

查看全部问答>

Wince 5.0 如何实现 AlphaBlend?

Wince 5.0 如何实现 AlphaBlend? Requirements OS Versions: Microsoft? Windows CE? 5.0 and later. Header: Windows.h. Link Library: Coredll.lib. 加入以上 lib后,编译仍出错。 应如何处理,找了些算法来代替,但速度太慢。 谢谢。…

查看全部问答>

问一个比较傻子的问题!硬件中断如何跳转到软件代码

偶菜鸟, 问一个傻子问题,硬件中断如何跳转到软件代码 例如,我有一个键盘,按一下, CPU是如何通过中断服务程序跳转到程序中的代码中? …

查看全部问答>

像迷一样的问题

想控制驱动程序,使用 CreateFile 取驱动句柄, 为什么有些驱动程序能够取到,有些取不到?驱动名称和路径是肯定正确的。 比较了代码,也没找出什么区别。 关键在哪里? 请高手帮助一下。 谢谢 。…

查看全部问答>

【诚聘】Analog Custom Layout Engineer

美资公司 LSI 上海研发中心高薪诚聘存储通讯领域人才,薪水待遇优厚,部分人员有出国培训机会。(部门内部推荐,成功机会更高)有意者请将中英文简历发送至:asic_tapeout@hotmail.comAnalog Custom Layout EngineerDESCRIPTION OF DUTIES IN ADDITION ...…

查看全部问答>

DDR测试内容与规范

DDR测试内容与规范,不错的资料:  …

查看全部问答>

小功率LED驱动电源

   保险丝,压敏电阻,热敏电阻,EMI,EMC,整流,PFC,漏极尖峰吸收,IC,电流检测,频率设定,反馈(TL431,光耦,运放),输出.  我现在是在弄电焊机相关方面的工作,可以感觉工作不怎么给力,后听个同学介绍说LED方面还行,这样就自己去学习了下LED ...…

查看全部问答>