天嵌 ARM开发社区

 找回密码
 注册
查看: 3011|回复: 4

串口问题 Uart_GetIntNum函数得不到正确结果

[复制链接]
netyangarm 发表于 2009-8-13 10:10:25 | 显示全部楼层 |阅读模式
本帖最后由 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
亚瑟王 发表于 2009-8-13 11:16:37 | 显示全部楼层
result = atoi(string);
这个是系统函数,实现功能把数字字符串转化为整形数,这个地方应该是不会有问题的。
 楼主| netyangarm 发表于 2009-8-13 11:32:04 | 显示全部楼层
老大 你试一下就知道了,正是因为atoi不会出错,我才觉得怪,为什么使用atoi后结果就变为0了,你还是试一下吧,你会发现问题的。
 楼主| netyangarm 发表于 2009-8-14 14:06:26 | 显示全部楼层
发现问题了,ads自带的 atoi 函数有错,有时得不到正确的结果,比如输入 ‘3’ ,‘5’,‘7’都会返回0,自己写一个my_atoi ,替换掉Uart_GetIntNum里的atoi,然后运行,发现Uart_GetIntNum终于完全正常了,不会出现有的数据为0了,  在这里严重讨伐 亚瑟王 ,没有去实验 ,就说不会出错。
 楼主| netyangarm 发表于 2009-8-14 15:50:22 | 显示全部楼层
本帖最后由 netyangarm 于 2009-8-14 16:08 编辑

进一步的发现问题了,系统带的atoi没有错,只是由于没有初始化库,atoi有时才会出错,特别是在atoi前后再次使用其它库函数时,一定会出错。我就是在atoi前后使用Uart_Printf(使用了库函数)后,atoi不管转换什么都为0.
改正方法,在跳到main之前可以使用 import __rt_lib_init   bl __rt_lib_init  初始化系统库,当然也可在main中初始化,不过个人认为还是在main之前点,初始化之后,你就可以使用库函数了,不会出错了。

这个问题终于彻底搞定
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-6-1 14:47 , Processed in 1.046875 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表