|
本帖最后由 netyangarm 于 2009-8-13 10:11 编辑
有时用这个Uart_GetIntNum 函数时得不到正确结果,很奇怪。
以下做测试: 用下面的循环覆盖掉在main函数中的while循环,为了方便用tq2440测试程序(注释掉 Lcd_TFT_Init() ; 下载速度快)
while(1)
{
int num=0;
Uart_Printf("\nplese imput a number: ");
num=Uart_GetIntNum( );
Uart_Printf("the number is: %d\n",num);
}
结果是输入十进制都是0,输入十六进制显示错误的负数
//*****************************************************************************
下面是Uart_GetIntNum函数源码(2440lib.c),红色部分为我添加的跟踪错误的代码:
int Uart_GetIntNum(void)
{
char str[30];
char *string = str;
int base = 10;
int minus = 0;
int result = 0;
int lastIndex;
int i;
Uart_GetString(string);
if(string[0]=='-')
{
minus = 1;
string++;
}
if(string[0]=='0' && (string[1]=='x' || string[1]=='X'))
{
base = 16;
string += 2;
}
lastIndex = strlen(string) - 1;
if(lastIndex<0)
return -1;
if(string[lastIndex]=='h' || string[lastIndex]=='H' )
{
base = 16;
string[lastIndex] = 0;
lastIndex--;
}
if(base==10)
{
Uart_Printf("string%s\n: ",string);//这句正常比如输入123,那么这里也打印123
result = atoi(string);
Uart_Printf("result%s\n: ",result);//这句不对:始终打印 0
result = minus ? (-1*result):result;
}
else
{
for(i=0;i<=lastIndex;i++)
{
if(isalpha(string))
{
if(isupper(string))
result = (result<<4) + string - 'A' + 10;
else
result = (result<<4) + string - 'a' + 10;
}
else
result = (result<<4) + string - '0';
}
result = minus ? (-1*result):result;
}
return result;
}
//*******************************************************************
调试时在串口中的结果
plese imput a number: 1
string: 1
result: 0
the number is : 0
plese imput a number: 23
string: 23
result: 0
the number is : 0 |
|