大一小白之USART1_中断方式(加头尾校验)、轮询方式接发数据

一、中断方式接发数据
在这里插入图片描述
上代码:
#define Max_BUFF_Len 50
unsigned char Usart1_Buffer[Max_BUFF_Len];
unsigned int Usart1_Rx=0;
unsigned int TxCounter=0;

void NVIC_Configuration(void);
void USART1_IRQHandler()
{ //进入中断
if(USART_GetITStatus(USART1,USART_IT_RXNE) != RESET) //检测中断请求(判断寄存器是否为非空,因为串口先将数据发送给寄存器,寄存器再将数据发送给缓冲区buffer,若寄存器为空,则无法发送给Usart_Buffer)
{

	Usart1_Buffer[Usart1_Rx] = USART_ReceiveData(USART1);    //接收串口1数据到buff缓冲区
	Usart1_Rx++;                                              
	 
	 if(Usart1_Buffer[Usart1_Rx-1] == '+' || Usart1_Rx == Max_BUFF_Len)    //先判断当前字符是不是尾标识,如果
                                                         //    接到尾标识是+号(或者等于最大接收数,则接收完毕)
	 {
			
		if(Usart1_Buffer[0] == '-')                      //再判断头标识,若正确,则接受的数据为我们想要的数据,接下来对它发送
		{
         
			for(TxCounter=0;TxCounter<Max_BUFF_Len;TxCounter++) 
			{
			    USART_SendData(USART1 ,Usart1_Buffer[TxCounter]);
				while(USART_GetFlagStatus(USART1,USART_FLAG_TXE )==RESET);//等待发送完成 (加分号!!!)
				    if(Usart1_Buffer[TxCounter]=='+') 
           {
						    Usart1_Rx=0;
						    break;
						 }  	//检测到结束符就提前跳出

二、轮询方式
while(1)
{
//判断接收寄存器是否非空
if(USART_GetFlagStatus(USART1,USART_IT_RXNE) != RESET)
{
// 接收数据
i = USART_ReceiveData(USART1);
//发送数据
USART_SendData(USART1,i)
//等待发送完成
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE )==RESET);
}

}

**注意:**1、上面程序可看出,无论是使用中断方式接收还是查询方式,首先要判断接收数据寄存器是否为空,非空才可以进行接收。 (因为串口先将数据发送给寄存器,寄存器再将数据发送给缓冲区buffer,若寄存器为空,则无数据发送给Usart_Buffer)
2、发送数据时一般要判断发送状态,等待发送完成后执行后面的程序
//发送数据
USART_SendData(USART1,i)
//等待发送完成
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE )==RESET);
一定要加分号!!!

轮询方式是让CPU一直查询接收数据状态(好比老板一直等货车进仓库),而中断则是CPU让帮手去等待(货车一到,中断通知CPU)

(以上分析若有理解错误之处还请前辈指点一二,晚辈万分感谢!)

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值