次のコードのビットと、どこが間違っているのかを理解するのに助けが必要です。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;
}