1

次のコードのビットと、どこが間違っているのかを理解するのに助けが必要です。MPLAB の使用

これは機能の始まりです。この部分を取得します

char validateNemaSentence(char *pSentence)
{
    char chkSumToken[3];
    unsigned char calculatedChecksum = 0;
    char errorCode = NOERROR;

    if(*pSentence != '$')
      return ERROR;
      pSentence++;

この次の部分は私が問題を抱えているところです

while (*pSentence != '\0' && *pSentence != '*')
    {
    calculatedChecksum ^= *pSentence;
    pSentence++;
}

関数のこの部分は、関数によって配列として取り込まれる pSentence のアドレスをインクリメントします。この配列は、実際には「解析」され、checkSum で評価されるはずのユーザー入力の文字列で構成されています。この while ループは、NULL または ASTERIX が検出されず、値が Xor されない限り、配列内の各要素を通過します。したがって、pSentence の要素 [1] と要素 [2] が "A" と "B" であると言う場合 (つまり、while ループが 2 回ループし、checkSum が Xor 値 "A" である)、次のようにします。チェックサムの値を取得するためにそれらの ascii 値を XOR しますか? それが機能のその部分の仕組みですか?

したがって、A ascii は 0x41、B ascii は 0x42 です。

calculatedChecksum ^= *pSentence (which is A) 

= 0100 0001

その後

calculatedChecksum ^= *Sentence (which is B)

0100 0001 (calcChecksum の現在の値)

0100 0010 (Bのアスキー)

= 0000 0011

あれは正しいですか?

この最後の関数は、私の問題のほとんどがどこにあるかです。私のコードは常に ERROR を返します。関数にチェックサムを適切に割り当てる方法がわかりません。なぜなら、以下の strcmp を「== 0」に変更すると、実際に pSentence を送信して評価できるからです。正常に動作しなくなります

if(*pSentence == '*')
    {
    sprintf(chkSumToken, "%2x", calculatedChecksum);
    pSentence++;    
    if(strcmp(pSentence,chkSumToken) !=0) errorCode = ERROR;
    }
4

1 に答える 1

0

あなたの問題は、からの出力についてのあなたの期待sprintf()が間違っていることだと思います。strcmp()何が問題なのかを確認するには、呼び出しの条件の前に次の行を追加します。

fprintf(stderr, "chkSumToken: \"%s\"\npSentence: \"%s\"\n", chkSumToken, pSentence);

たとえば、期待される出力は「03」だと思いますが、sprintf()デフォルトではフィールドにスペースが埋め込まれ、代わりに「3」が配信されます。先行ゼロを取得するには"%02x"、フォーマット文字列として使用します。

于 2013-11-02T09:29:24.063 に答える