您好我在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函数中的错误?如果您想了解任何其他详细信息,请与我们联系。
答案 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);