初中生
最后登录1970-1-1
在线时间 小时
注册时间2016-12-7
|
野火的旧版图书中会有如下2个函数可是使用现象是一只输出一个字符0xD0.
请问这个什么情况啊。串口是测试通的,但就是使用这个void USART_printf(USART_TypeDef* USARTx,char *Data,...);函数会出问题。
主函数使用如下:USART_printf(UART5,"\r\nTHIS is USART_PRINTF_DEMO %d,%s",50,"XYZ");打印输出
static char *itoa(int value,char *string,int radix)
{
int i,d;
int flag = 0;
char *ptr = string;
if(radix != 10)
{
*ptr = 0;
return string;
}
if(!value)
{
*ptr++ = 0x30;
*ptr = 0;
return string;
}
if(value < 0)
{
*ptr++ = '-';
value *=-1;
}
for(i=10000;i>0;i/=10)
{
d = value/i;
if(d||flag)
{
*ptr++ = (char)(d+0x30);
value -= (d*i);
flag = 1;
}
}
*ptr = 0;
return string;
}
void USART_printf(USART_TypeDef *USARTx,char *Data,...)
{
const char *s;
int d;
char but[16];
va_list ap;
va_start(ap,Data);
while(*Data !=0) //ÅжÏÊÇ·ñµ½´ï×Ö·û´®½áÊø·û
{
if(*Data==0x5c) //ÅжÏÊÇ·ñÊÇ'\'
{
switch(*++Data)
{
case'r': //»Ø³µ·û
USART_SendData(USARTx,0x0d);
Data++;
break;
case'n': //»»Ðзû
USART_SendData(USARTx,0x0a);
Data++;
break;
default:
Data++;
break;
}
}
else if(*Data == '%')
{
switch(*++Data)
{
case's': //×Ö·û´®
s = va_arg(ap,const char*);
for(;*s;s++)
{
USART_SendData(USARTx,*s);
while(USART_GetFlagStatus(USARTx,USART_FLAG_TXE) == RESET);
}
Data++;
break;
case'd':
d=va_arg(ap,int);
itoa(d,but,10);
for(s = but;*s;s++)
{
USART_SendData(USARTx,*s);
while(USART_GetFlagStatus(USARTx,USART_FLAG_TXE) == RESET);
}
Data++;
break;
default:
Data++;
break;
}
}
else USART_SendData(USARTx,*Data);
while(USART_GetFlagStatus(USARTx,USART_FLAG_TXE) == RESET);
}
}
|
-
|