This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430FR2355:strcat 无法正常工作?

Guru**** 2538930 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/962034/msp430fr2355-strcat-not-working

器件型号:MSP430FR2355

有人能不能告诉我我在这个小块中发生了什么错误:

mssg =发送;
strcpy (发送、"HelloWorld");
m = strlen (mssg);
CRC_RESULT = CRC (mssg、m);
CRC_CHAR[0]=(CRC_RESULT >> 8)& 0xFF;
CRC_CHAR[1]=(CRC_RESULT & 0xFF);
mssg =(strcat (mssg、(const char*) crc_char));

char * mssg、垃圾、crc_char[2];
UINT CRC_RESULT、m;
字符发送[buffer_size]={[0... Buffer_size-1]= 0xFF};

Buffer_size = 30。

CRC_RESULT 已验证且正常。  它是一个无符号 int。 但是、当我执行该设置时、我会将 CRC 添加到消息中、然后在该设置之后、我会将字节交换 CRC 添加到消息中。  我已经尝试过各种变体、似乎找不到我所做的错误?  如果我为我的 mssg 输入一个字符串常量、如"TODAY (今天)"、则效果很好。  CRC_CHAR 在 CRC_RESULT 之后看起来像预期的那样。

谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    strcat()末尾需要一个带有 nul char 的字符串:

    CRC_CHAR[2]='\0';

    您已占用内存。

    一般而言,*all* str*函数要求末尾带有'\0'的字符串

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    因此增加 CRC_CHAR[3]应该会达到这样的目的吗?

    无需使用'\0'进行 memset?

    我的最终目标是在我的消息中添加 CRC 和“\n”。

    以下内容似乎起作用(至少对于我尝试的一条或两条消息)。

    mssg = strcat (strcat (mssg、crc_char)、"\n");
    

    您是否看到了这方面的任何问题?

    谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    strncat()将在此处执行作业,因为“发件人”字符串不需要终止为空。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的、将其设置为3个字符就足够了。

    无需 memset、只需将最终字符设置为'\0'

    你可以像这样的菊花链、因为它返回一个指向第一个参数的指针、但它有点奇怪、大多数人会对它进行拼图、因为你通常会放弃返回值。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    但是、如果 这两个字节中的第一个字节为零、则不会复制第二个字节。 如果您将该字符串发送到需要以 null 结尾的字符串、则如果第二个字节为零、也会失败。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    strncat()会有相同的问题。

    strXXX 函数无法很好地处理二进制数据。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    NMEA GPS 句子通过使用十六进制格式将校验和格式化为 ASCII 字符来解决此问题、因此没有"\0"。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    也许没有人说过、但如果你看我的第一篇帖子  

    crc_char [2]是类型 char。   

    我采用了 TI 的 CRC 并对其进行了修改、以将指向 char 类型的指针作为输入、但它仍然输出一个整数、然后我将其馈送到我的字符数组中。  '\0'是使用 str 函数的副产品(或者我认为是这样)。

    正如您先前所建议的那样、我继续前进、转向了 strncat、这似乎可以正常工作

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    char 类型只是一个8位整数。 通常、您希望将自己限制为"可打印" ASCII 字符、以避免出现意外。