I have asked a question here,现在下面的代码完成了我期望的工作(我之前提到的工作)。现在,我还有另一个问题:如果我写tmp[20]
并且输入的大小是20个字符,则代码可以工作。但是,输入的大小未知。因此,可以有一个maxsize,但是实际大小取决于输入。如何使此代码适用于所有长度? (是的,当我在tmp
中写入200时代码可以工作,但'message'的大小取决于整个数组。结束前应为3个字符,开始后应为6个字符)。因此,当我在[[ C0],并且输入的字符数少于200个字符,则消息返回错误。我认为我应该使用动态内存分配,但无法在代码中实现它。
这是我的完整代码:
tmp[]
在将字符添加到数组中的任何地方:
char tmp[20] = { 0 };
int len = sizeof(tmp) / sizeof(tmp[0]);
String pack;
String command;
String Size;
String messum;
String message;
String checksum;
int Index = 0;
bool Seen = false;
void setup() {
Serial.begin(9600);
}
void loop() {
while (Serial.available() > 0) {
char received = Serial.read();
if (received == '!') {
Seen = true;
} else
if (received == '#') {
return strdup(tmp);
} else
if (Seen == true) {
if (Index < 2) {
//Serial.print("P");
pack = tmp[Index++] = received;
Serial.print(pack);
} else
if (Index < 4) {
//Serial.print("C");
command = tmp[Index++] = received;
Serial.print(command);
} else
if (Index < 6) {
//Serial.print("S");
Size = tmp[Index++] = received;
Serial.print(Size);
} else
if (Index < (len - 3)) {
//Serial.print("M");
message = tmp[Index++] = received;
Serial.print(message);
} else
if (Index < len) {
//Serial.print("C");
checksum = tmp[Index++] = received;
Serial.print(checksum);
}
}
}
return NULL;
//input: asdeyh134!123456789abcdefghtry#8647dfn
}
您还应该像这样以空值终止字符串:
if (Seen == true) {
if (Index < 2) {
//Serial.print("P");
pack = tmp[Index++] = received;
Serial.print(pack);
这样,您可以使用strlen获取数组中字符串的长度。它将计算直到该空字符的字符数。
if (Seen == true) {
if (Index < 2) {
//Serial.print("P");
pack = tmp[Index++] = received;
tmp[Index] = 0;
Serial.print(pack);
在循环的下一遍,当您写入另一个字符时,将在该null上写入它,然后在该新字符之后立即写入一个新的null。