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 的地址,该地址是由函数作为数组引入的。这个数组实际上是由一串用户输入组成的,这些用户输入应该被“解析”并使用校验和进行评估。这个 while 循环遍历数组中的每个元素,只要它没有看到 NULL 或 ASTERIX,并对值进行异或运算。因此,如果我说 pSentence 的元素 [1] 和元素 [2] 分别是“A”和“B”(所以 while 循环,循环两次,并且 checkSum 是 X 或值“A”),然后执行我将它们的 ascii 值异或在一起以获得校验和的值?那部分功能是这样工作的吗?

所以 A ascii 是 0x41 B ascii 是 0x42

calculatedChecksum ^= *pSentence (which is A) 

= 0100 0001

进而

calculatedChecksum ^= *Sentence (which is B)

0100 0001 (calcChecksum 的当前值)

0100 0010(B 的 ASCII)

= 0000 0011

那是对的吗?

现在这最后一个功能是我的大部分问题所在。我的代码总是返回错误,我不确定如何为函数正确分配校验和,因为如果我将下面的 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 回答