您好,我正在用 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 函数中的错误在哪里?如果您想知道任何其他细节,请告诉我。