0

シリアル通信経由で 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;
    }
}
4

2 に答える 2

1
int val = 0;
for(int j = i+1; j < size; j++){
    if(isdigit(input[j] )){
        val = val * 10 + input[j]-'0';// val = (val << 8) | input[j];
    }   
}
return val;
于 2014-10-22T23:45:48.770 に答える