シリアル通信経由で USB ドングルと通信しようとしています。通信は機能していますが、デバイスで通信を正しく解析できません。私のデバイスはメッセージを読み取り、ハードコードされた c-string と比較します。正しい文字列であることを解析して認識しますが、 : 文字の後の値を解析しようとすると、0x00000000 が返され、その理由がわかりません。char キャストを使用して、atoi を使用してみました。単純な ascii 変換を使用してみました。さらに、ここに示すようにビット単位の加算操作を実行しました: vector<uint8_t> のサブセットを int に変換します。
例:
「Heart Rate:55」を送信すると、「Heart Rate:」が解析および認識されますが、55 を見つけて元に戻すように指示すると、0x00000000 が返されます
。スニペットを次に示します。
const uint8_t hrmSet[] = "Heart Rate:";
/** Find the : character in the string and break it apart to find if it matches,
and determine the value of the value of the desired heart rate. **/
int parse(uint8_t *input, uint8_t size)
{
for (uint8_t i = 0; i < size; i++)
{
if (input[i] == ':')
{
if (compare_string(input, hrmSet, i) == 0)
{
int val = 0;
for (int j = i+1; j < size; j++)
{
if (!isdigit(input[j]))
{
for (int k = i; k < j; k++)
{
val <<= 8;
val |= input[k];
}
}
}
return val;
}
return -1;
}
}
return -1;
}
文字列比較関数
/** Compare the input with the const values byte by byte to determine if they are equal.**/
int compare_string(uint8_t *first, const uint8_t *second, int total)
{
for (int i = 0; i < total; i++)
{
if (*first != *second)
{
break;
}
if (*first == '\0' || *second == '\0')
{
break;
}
first++;
second++;
}
if (*first == ':' && *second == ':')
{
return 0;
}
else
{
return -1;
}
}