利用中断接收数据较为简单,但利用中断去发送数据弄了半天才搞定。。。

注:在设置USART的控制寄存器的TE位时,会发送一个空闲帧,于是便会进入中断。

错误的做法

本来的思路是中断里的代码尽可能地少,发送字符放在主函数中,类似这样

while(1)
{
	USART_SendData(DEBUG_USARTx,Buf[j]);
	//Delay(0xfffff);
	if(j>=5)
		break;
}

然而。。。要是不加Delay延时j就无法在中断服务函数中自加,通过调试,发现调用USART_SendData(),发送完成标志位TC并不是马上置位,该函数只是将数据送入数据寄存器DR,并不代表发送完毕,所以就会乱套。。。而且加了Delay后还会在最后发送一个H,惊了。。。

改进方法
参考了别人的方法,在中断里进行发送
1.利用USART_SendData()触发TC中断,然后在中断中一直发送,直到最后一个字节

//发送函数
void uart_senddata(u8* ptr)
{
	ptrdata=ptr;
	
	USART_ClearFlag(USART1, USART_FLAG_TC);	//如果不加的话可能会丢失第一个字节
	
	USART_SendData(USART1, *(ptrdata++));	//触发TC中断
}

//中断服务函数中的部分代码
	if(USART_GetITStatus(DEBUG_USARTx,USART_IT_TC)!=RESET)
	{
		if((*ptrdata)=='\0')
			USART_ClearFlag(USART1, USART_FLAG_TC);
		else
		{
			USART_SendData(DEBUG_USARTx,*ptrdata++);
		}
	}

参考的那些博客不太看得懂,调试的结果也比较神奇。。。暂且先这样吧,能用就行。。。

Reference:https://blog.csdn.net/kevinhg/article/details/40085971