类型转换 - 字符串为整数

时间:2013-11-12 22:34:07

标签: type-conversion fifo fsm atoi

您好我在C中编写程序,使用PSoC工具编写赛普拉斯开发套件。我面临一个问题,即将我在循环缓冲区(缓冲区)中收集的字符串转换为局部变量“input_R”,最终转换为全局变量st_input_R。我的FSM中调用此动作函数的事件如下:


void st_state_5_event_0(void)   //S6 OR S4
{   
    char buffer[ST_NODE_LIMIT] = {0};
    st_copy_buffer(buffer);
    uint32 input_R = {0};
    mi_utoa(input_R, buffer);

    if ((input_R >= 19000) && (input_R <= 26000))
    {   
        st_input_R = input_R;
        _st_data.state = ST_STATE_6; 
    }
    else
    {
        _st_data.status = ST_STATE_4;
    }
    UART_1_Stop();

    st_stop();

    st_empty_buffer();
}  

ST_NODE_LIMIT = 64 st_copy_buffer使用超级终端将我输入的数字复制到名为“buffer”的循环缓冲区。 input_R是我希望将缓冲区内容转换为的32位整数。 mi_utoa是我用来将缓冲区中的内容转换为input_R的函数,详情如下:


uint8 mi_utoa(uint32 number, char *string)
{
    uint8 result = MI_BAD_ARGUMENT;

    if (string != NULL)
    {
        uint8 c = 0;
        uint8 i = 0;
        uint8 j = 0;

        do
        {
            string[i++] = number % 10 + '0';
        } while ((number /=10) > 0);

        string[i] = '\0';

        for (i = 0, j = strlen(string) - 1 ; i < j ; i++, j--)
        {
            c = string[i];
            string[i] = string[j];
            string[j] = c;
        }

        result = MI_SUCCESS;
    }

    return result;
}

问题是,假设我输入21500(+ \ r),mi_utoa函数将第一个数字转换为0,将第二个数字转换为\ 000,而包括回车符“\ r”的其他数字保持不变。因此,input_R是NOT = 21500.它发生在我输入的任何数字串。因此,永远不满足条件“if((input_R&gt; = 19000)&amp;&amp;(input_R&lt; = 26000))”。因此,FSM一直返回状态4,我正在圈内。

您能否告知mi_utoa函数中的错误?如果您想了解任何其他详细信息,请与我们联系。

1 个答案:

答案 0 :(得分:0)

您的函数st_state_5_event_0()将值input_R设置为零。然后你调用mi_utoa(),它将值input_R转换为ascii字符串,&#34; 0&#34;。

void st_state_5_event_0(void)   //S6 OR S4
{   
    char buffer[ST_NODE_LIMIT] = {0};
    //what is the value of buffer after this statement?
    st_copy_buffer(buffer);
    //the value of input_R after the next statement is =0
    uint32 input_R = {0};
    //conversion of input_R to string will give ="0"
    mi_utoa(input_R, buffer);

    if ((input_R >= 19000) && (input_R <= 26000))
    {   
        st_input_R = input_R;
        _st_data.state = ST_STATE_6; 
    }
    //...
}

您可能需要一个将ascii缓冲区转换为数字的函数。

uint8
mi_atou(uint32* number, char *string)
{
    uint8 result = MI_BAD_ARGUMENT;

    if (!string) return result;
    if (!number) return result;
    uint8 ndx = 0;
    uint32 accum=0;
    for( ndx=0; string[ndx]; ++ndx )
    {
        if( (string[ndx] >= '0') && (string[ndx] <= '9') )
        {
            accum = accum*10 + (string[ndx]-'0');
            //printf("[%d] %s -> %d\n",ndx,string,accum);
        }
        else break;
    }
    //printf("[%d] %s -> %d\n",ndx,string,accum);
    *number = accum;
    result = MI_SUCCESS;
    return result;
}

您可以通过提供存储结果的号码地址来调用

    mi_atou(&input_R, buffer);