こんにちは、サイプレス開発キットをプログラムするために PSoC ツールを使用して C でプログラムを書いています。循環バッファー (バッファー) に収集された文字列をローカル変数 "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 に、2 番目の数字を \000 に変換し、キャリッジ リターン "\r" を含む他の数字は変更されないことです。その結果、input_R は NOT = 21500 になります。これは、入力した数字の文字列に対して発生します。そのため、「if ((input_R >= 19000) && (input_R <= 26000))」という条件が満たされることはありません。したがって、FSM は常に状態 4 に戻り、円を描くようになります。
mi_utoa 関数のどこにバグがあるか教えてください。他の詳細を知りたい場合はお知らせください。