printf重定向,是指之前指定给USART1输出的,移植过后,需要重定向给USART2代码
问题:仿照原子的探索者STM32F407板子USART1代码写的USART2代码,但是不能正常通信,可以正常接收数据,但是无法发送数据;
USART2中断可以进入,接收数据正常,但是无法使用printf发送数据,可以使用USART_SendData发送数据。
if(USART_RX_STA2&0x8000)
{
len=USART_RX_STA2&0x3fff;//µÃµ½´Ë´Î½ÓÊÕµ½µÄÊý¾Ý³¤¶È
printf("\r\nÄú·¢Ë͵ÄÏûϢΪ:\r\n"); //无法显示
for(t=0;t<len2;t++)
{
USART_SendData(USART2, USART_RX_BUF2[t]); //Ïò´®¿Ú1·¢ËÍÊý¾Ý //可以发送数据
while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET);//µÈ´ý·¢ËͽáÊø
}
printf("\r\n\r\n");//²åÈë»»ÐÐ //无法显示
USART_RX_STA2=0;
}
之所以无法使用printf格式化输出,是由于printf重定向,是指之前指定给USART1输出的,移植过后,需要重定向给USART2代码。printf调用fputc发送数据,但是fputc只是针对USART1了,需要自己修改这个函数,如下:
//USART1
int fputc(int ch, FILE *f)
{
while((USART1->SR&0X40)==0);//Ñ»··¢ËÍ,Ö±µ½·¢ËÍÍê±Ï
USART1->DR = (u8) ch;
return ch;
}
//USART2
//int fputc(int ch, FILE *f)
//{
// while((USART2->SR&0X40)==0);//Ñ»··¢ËÍ,Ö±µ½·¢ËÍÍê±Ï
// USART2->DR = (u8) ch;
// return ch;
//}
修改fputc函数后,printf输出格式化数据成功。
实际上,完全可以用USART_SendData函数实现各种格式控制,使用USART_SendData输出回车换行符如下:
USART_SendData(USART2, '\r'); //
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//
USART_SendData(USART2, '\n'); //
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//