【实战经验】STM32串口接收数据的几种不同方式

发布时间:2017-09-22 阅读量:3581 来源: 我爱方案网 作者: candytang

本文教大家通过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 USART2_SendByte(Uart2_Buffer[Uart2_Tx_Num]); //发送数据
Uart2_Rx_Num = 0; //初始化
Uart2_Tx_Num = 0;
Uart2_Sta = 0;
}

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


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

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


实例三:


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 &= 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函数里执行,负责发送该段数据。


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

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

相关资讯
突破性瘤胃监测技术!smaXtec生物胶囊搭载艾迈斯欧司朗高精度温度传感器上市

在全球畜牧业迈向精准化管理的关键时期,智能传感技术正成为提升牲畜健康水平的核心驱动力。据联合国粮农组织统计,牲畜疾病每年导致全球畜牧业损失超300亿美元,而传统人工监测方式存在响应滞后、检测盲区等痛点。近期,艾迈斯欧司朗与奥地利smaXtec公司联合推出的生物胶囊监测方案,通过突破性的体内温度传感技术,为行业提供了革命性解决方案。

英特尔俄勒冈州裁员潮未止 芯片业转型阵痛冲击区域经济

俄勒冈州希尔斯伯勒消息,2025年7月 —— 全球半导体巨头英特尔在其美国重要的研发与制造基地俄勒冈州的裁员行动仍在持续。据最新内部及行业消息披露,自去年下半年以来,该州员工规模已缩减至近十年最低点。消息人士向媒体透露,这并非终点,英特尔计划在俄勒冈州启动新一轮人事精简方案。

面板厂商减产难抵需求疲软 6月电视面板价格拐点显现

2024年6月,全球电视液晶面板市场出现显著转折。行业数据显示,主流尺寸面板大宗交易价格结束连续9个月的涨势,迎来周期性下跌。其中55英寸Open Cell面板均价环比下降2%至127美元(约合人民币915元),32英寸产品跌幅达3%至36美元(约合人民币260元)。此次价格回调标志着面板行业供需关系进入重新平衡阶段。

台积电2025年Q2财报:AI需求驱动业绩超预期,3nm制程占比提升

全球半导体代工巨头台积电(TSMC)于7月17日公布了其2025年第二季度财务报告。财报显示,公司在人工智能(AI)需求的强劲推动下,营收与盈利双双超越市场预期,延续了显著的成长势头。

全球EDA巨头整合收官:新思科技成功并购Ansys,瞄准310亿美元融合市场

北京时间2025年7月17日晚间,全球电子设计自动化(EDA)及半导体IP巨头新思科技(Synopsys, Nasdaq: SNPS)正式宣布,成功完成对工业仿真软件领导者安似科技(Ansys, Nasdaq: ANSS)的收购。这笔交易最早于2024年1月16日公布,初始价值估值约为350亿美元,最终在中国国家市场监督管理总局附加限制性条件后获得批准,成为全球科技并购领域2025年的标志性事件。