|  | 
 
| 本帖最后由 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
 | 
 |