您的位置 首页 芯闻

STM32串口中止接纳方法具体比较

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

本例程经过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函数里履行,担任发送该段数据。
长处:合适打包传输,稳定性和可靠性很有确保,可随意发送,主动选择有用数据。
缺陷:缓存区数据长度要根据“包裹”长度设定, 要是屡次接纳后无头无尾,到有头有尾的那一段数据刚好跨过缓存区最前和最终方位时,或许导致本次数据丢掉,不过这种状况简直没有或许。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/news/xinwen/258602.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部