我正在尝试使用C来处理正在进行的项目,我的想法是循环一个RX缓冲区(接收数据,在这种情况下指向字符串的指针)并解析出所有命令代码。
命令的结构:
|COMMAND/CHECKSUM#
所以| character表示数据块的开头,后跟命令,而不是将命令与校验和分开的/字符,然后是#字符,表示数据块的结束。
一切似乎都运转正常,这里是完整的代码:
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
void append(char *s, char c)
{
int len = strlen(s);
s[len] = c;
s[len+1] = '\0';
}
int getPayload(char *RXbuf, char *rxPayload, char *rxChecksum)
{
int started = 0;
int separated = 0;
int parsedLength = 0;
int len = strlen(RXbuf);
if (RXbuf[0] == '#')
{
parsedLength++;
}
for (int i = 0; (i < len && RXbuf[i] != '#'); i++)
{
parsedLength++;
if (started == 0 && RXbuf[i] == '|')
{
started = 1;
continue;
}
if (RXbuf[i] == '/')
{
separated = 1;
continue;
}
if (started == 1)
{
if (separated == 0)
{
append(rxPayload, RXbuf[i]);
}
else
{
append(rxChecksum, RXbuf[i]);
}
}
}
return parsedLength;
}
int main()
{
char *RXbuf = "|SR-5632-LED-0002/412215590#dfsfdsf|SR-5632-LED-0002/412215590#dsf|SR-5632-LED-0002/412215590#";
printf("RX Data: %s\n", RXbuf);
printf("##############################################################################################################################\n");
while(1)
{
char rxPayload[50];
char rxChecksum[20];
int started = 0;
int stopped = 0;
int separated = 0;
int parsedLength = getPayload(RXbuf, rxPayload, rxChecksum);
if (strlen(rxPayload) > 10)
{
printf("-----------------------------------------------------------------------------------------------------------------\n");
printf("RX Data: %s\n", RXbuf);
printf("%s/%s\n", rxPayload, rxChecksum);
printf("\n");
printf("-----------------------------------------------------------------------------------------------------------------\n");
}
RXbuf = RXbuf + parsedLength;
rxPayload[0] = 0;
rxChecksum[0] = 0;
if (parsedLength == 0)
{
break;
}
}
printf("\n");
printf("##############################################################################################################################\n");
}
它编译好,它运行没有错误,但输出不是我期望的。它循环并解析命令,但与第一个命令一起输出一些奇怪的字符,如上面程序的输出中所示:
$ ./rxdestruct
RX Data: |SR-5632-LED-0002/412215590#dfsfdsf|SR-5632-LED-0002/412215590#dsf|SR-5632-LED-0002/412215590#
##############################################################################################################################
-----------------------------------------------------------------------------------------------------------------
RX Data: |SR-5632-LED-0002/412215590#dfsfdsf|SR-5632-LED-0002/412215590#dsf|SR-5632-LED-0002/412215590#
���\�SR-5632-LED-0002/412215590
-----------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------
RX Data: dfsfdsf|SR-5632-LED-0002/412215590#dsf|SR-5632-LED-0002/412215590#
SR-5632-LED-0002/412215590
-----------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------
RX Data: dsf|SR-5632-LED-0002/412215590#
SR-5632-LED-0002/412215590
-----------------------------------------------------------------------------------------------------------------
##############################################################################################################################
我认为这与char数组rxPayload&amp;的指针有关。 rxChecksum但我不知道在这种情况下如何解决它。现在将它们设置为[50]和[20]的char数组,但理想情况下这些将具有动态大小,因此我可以使用包含多个参数的长命令代码,对此的一些帮助也非常受欢迎!但奇怪的角色是主要问题。
我做错了什么,我该怎么做才能改善它?
答案 0 :(得分:2)
您需要初始化字符串变量,然后才能安全地附加到它们。
char rxPayload[50] = "";
char rxChecksum[20] = "";
或者你可以移动这两行:
rxPayload[0] = 0;
rxChecksum[0] = 0;
在致电getPayload()
之前。