打印

求助44B0中Uart_GetIntNum程序!

[复制链接]
2078|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
snowtx|  楼主 | 2008-2-5 23:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
int Uart_GetIntNum(void)
{
    char str[30];
    char *string=str;
    int base=10;
    int minus=0;
    int lastIndex;
    int result=0;
    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( string[lastIndex]=='h' || string[lastIndex]=='H' )
    {
    base=16;
    string[lastIndex]=0;
    lastIndex--;
    }

    if(base==10)
    {
    result=atoi(string);
    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;
}

就是这个程序,刚学习ARM,在超级中端上执行这个程序时result值总是输出不正确,比如输入0xa和0xA应该输出一样的值,但总是不一样。是不是程序中有问题?比如那个语句result=(result<<4)+string-'A'+10;既然result是整型数,为什么还要左移四位呢?小弟愚钝,望高手们回复指教!!!

相关帖子

沙发
snowtx|  楼主 | 2008-2-6 10:13 | 只看该作者

snowtx

的确应该加(result<<4),不过为什么输入0xa和0xA但输出不一样呢?到底是哪里的问题?帮小弟解决一下吧

使用特权

评论回复
板凳
snowtx|  楼主 | 2008-2-7 14:40 | 只看该作者

snowtx

这几天做实验时发现了一些问题,if(isalpha(string))语句总是不执行,就算输入的是字符也不会执行这个语句,会跳到result=(result<<4)+string-'0';处执行,为什么呢?

使用特权

评论回复
地板
阿南| | 2008-2-8 16:39 | 只看该作者

楼主可以先测试发送,以排除硬件和波特录等问题

再测试发送。都成功后在慢慢调试该程序

使用特权

评论回复
5
snowtx|  楼主 | 2008-2-10 23:40 | 只看该作者

snowtx

谢谢,我把程序给改了,变成了:

    if(base==10)
    {
    result=atoi(string);
    result=minus ? (-1*result):result;
    }
    else
    {
             for(i=0;i<=lastIndex;i++)
    {
                     
             
             if((string>='A')&&(string<='z'))
        {
        

                  if((string>='A')&&(string<='F'))
                     result=(result<<4)+string-'A'+10;

                  else if((string>='a')&&(string<='f'))
                     result=(result<<4)+string-'a'+10;
               
             }
        else
        {
                  result=(result<<4)+string-'0';
        }
    }
    result=minus ? (-1*result):result;
    }
    return result;

结果就成功了!实在是想不通为什么 if(isalpha(string))语句不管用

使用特权

评论回复
6
samuelyu| | 2008-2-11 02:11 | 只看该作者

isalpha() 的代码?

使用特权

评论回复
7
snowtx|  楼主 | 2008-2-11 09:41 | 只看该作者

snowtx

int isalpha(int ch ) 

{

   return (unsigned int)((ch | 0x20) - 'a') < 26u;

}
这个好像是isalpha() 的代码。

使用特权

评论回复
8
dld2| | 2008-2-11 09:50 | 只看该作者

貌似上面的代码离谱得狠

-------
但居然没有错。

使用特权

评论回复
9
mohanwei| | 2008-2-11 14:57 | 只看该作者

没什么,你把字母的范围写到纸上就很容易看出来了


……所以,这些函数被封装成库,未必不是好事,呵呵

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

66

帖子

0

粉丝