0

您好,我正在用 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 不是 = 21500。它发生在我输入的任何数字字符串中。所以条件“if ((input_R >= 19000) && (input_R <= 26000))”永远不会满足。因此,FSM 一直返回到状态 4,我在转圈。

您能否建议 mi_utoa 函数中的错误在哪里?如果您想知道任何其他细节,请告诉我。

4

1 回答 1

0

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

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);
于 2013-11-12T23:12:50.023 回答