利用中断接收数据较为简单,但利用中断去发送数据弄了半天才搞定。。。
注:在设置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)=='