Arduino 功能几乎相同但输出却大相径庭
Arduino near Identical Functions with very different outputs
我有 3 个不同的功能可以使用我的 Arduino 和 SIM900 发送短信。
第一个函数有两个参数,将给它的字符数组发送给目标phone数字
void sendText(char msg[], char num[]) {
Serial.print("[Text] Sending text to ");
Serial.println(num);
simController.print("AT+CMGF=1\r");
delay(100);
simController.print("AT + CMGS = \"");
simController.print(num);
simController.println("\"");
delay(100);
Serial.print("[Text] ");
Serial.println(msg);
simController.println(msg);
delay(100);
simController.println((char)26);
delay(100);
simController.println();
delay(5000);
}
最后两个函数几乎相同,只是它们的参数数量不同且结果完全不同
void sendText(char msg[], char num[], int startChar) {
char *newMsg = (char *)malloc(strlen(msg)+1);
memset(&newMsg[0], 0, sizeof(newMsg));
Serial.print("[Text] Sending text to ");
Serial.println(num);
simController.print("AT+CMGF=1\r");
delay(100);
simController.print("AT + CMGS = \"");
simController.print(num);
simController.println("\"");
delay(100);
for (int x=0;x<strlen(msg);x++) newMsg[x] = msg[x+startChar];
Serial.print("[Text] ");
Serial.println(newMsg);
simController.println(newMsg);
delay(100);
simController.println((char)26);
delay(100);
simController.println();
delay(5000);
}
void sendText(char msg[], char num[], int startChar, int endChar) {
char *newMsg = (char *)malloc(strlen(msg)+1);
memset(&newMsg[0], 0, sizeof(newMsg));
Serial.print("[Text] Sending text to ");
Serial.println(num);
simController.print("AT+CMGF=1\r");
delay(100);
simController.print("AT + CMGS = \"");
simController.print(num);
simController.println("\"");
delay(100);
for (int x=0;x<strlen(msg);x++) newMsg[x] = msg[x+startChar];
Serial.print("[Text] ");
Serial.println(newMsg);
simController.println(newMsg);
delay(100);
simController.println((char)26);
delay(100);
simController.println();
delay(5000);
}
调用这些函数时我使用的代码如下所示
sendText("Hello","+447597865XXX");
sendText("Hello","+447597865XXX", 1);
sendText("Hello","+447597865XXX", 1, 3);
输出看起来像这样
[Text] Sending text to +447597865XXX
[Text] Hello
[Text] Sending text to +447597865XXX
[Text] ello
[Text] Sending text to +447597865XXX
[Text] ell��U�����=ڨl��fr}Ѧ�o�e�6�������f��+��V���_{���
为什么会这样?请记住 void sendText(char msg[], char num[], int startChar, int endChar)
和 void sendText(char msg[], char num[], int startChar)
的正文没有区别
你的 memset
是错误的,特别是 sizeof(newMsg)
其中 newMsg
是一个指针。因此 sizeof(newMsg)
很可能是 2 或 4,具体取决于您的平台。第一个可能靠运气工作,在未初始化的内存中已经为 0。
将传递给 malloc
的大小也用于 memset
(或者在使用 for
循环复制数据后仅写入字符串终止符 '[=18=]'
。
还要检查 malloc
是否成功,即它的 return 值不是 NULL
。
编辑:要重构您的第二个函数,您可以删除对 memset
的调用并更改
for (int x=0;x<strlen(msg);x++) newMsg[x] = msg[x+startChar];
至
int x;
for (x=0;x<strlen(msg);x++) newMsg[x] = msg[x+startChar];
newMsg[x] = '[=11=]'; // Or just 0, it is equivalent
我有 3 个不同的功能可以使用我的 Arduino 和 SIM900 发送短信。
第一个函数有两个参数,将给它的字符数组发送给目标phone数字
void sendText(char msg[], char num[]) {
Serial.print("[Text] Sending text to ");
Serial.println(num);
simController.print("AT+CMGF=1\r");
delay(100);
simController.print("AT + CMGS = \"");
simController.print(num);
simController.println("\"");
delay(100);
Serial.print("[Text] ");
Serial.println(msg);
simController.println(msg);
delay(100);
simController.println((char)26);
delay(100);
simController.println();
delay(5000);
}
最后两个函数几乎相同,只是它们的参数数量不同且结果完全不同
void sendText(char msg[], char num[], int startChar) {
char *newMsg = (char *)malloc(strlen(msg)+1);
memset(&newMsg[0], 0, sizeof(newMsg));
Serial.print("[Text] Sending text to ");
Serial.println(num);
simController.print("AT+CMGF=1\r");
delay(100);
simController.print("AT + CMGS = \"");
simController.print(num);
simController.println("\"");
delay(100);
for (int x=0;x<strlen(msg);x++) newMsg[x] = msg[x+startChar];
Serial.print("[Text] ");
Serial.println(newMsg);
simController.println(newMsg);
delay(100);
simController.println((char)26);
delay(100);
simController.println();
delay(5000);
}
void sendText(char msg[], char num[], int startChar, int endChar) {
char *newMsg = (char *)malloc(strlen(msg)+1);
memset(&newMsg[0], 0, sizeof(newMsg));
Serial.print("[Text] Sending text to ");
Serial.println(num);
simController.print("AT+CMGF=1\r");
delay(100);
simController.print("AT + CMGS = \"");
simController.print(num);
simController.println("\"");
delay(100);
for (int x=0;x<strlen(msg);x++) newMsg[x] = msg[x+startChar];
Serial.print("[Text] ");
Serial.println(newMsg);
simController.println(newMsg);
delay(100);
simController.println((char)26);
delay(100);
simController.println();
delay(5000);
}
调用这些函数时我使用的代码如下所示
sendText("Hello","+447597865XXX");
sendText("Hello","+447597865XXX", 1);
sendText("Hello","+447597865XXX", 1, 3);
输出看起来像这样
[Text] Sending text to +447597865XXX
[Text] Hello
[Text] Sending text to +447597865XXX
[Text] ello
[Text] Sending text to +447597865XXX
[Text] ell��U�����=ڨl��fr}Ѧ�o�e�6�������f��+��V���_{���
为什么会这样?请记住 void sendText(char msg[], char num[], int startChar, int endChar)
和 void sendText(char msg[], char num[], int startChar)
你的 memset
是错误的,特别是 sizeof(newMsg)
其中 newMsg
是一个指针。因此 sizeof(newMsg)
很可能是 2 或 4,具体取决于您的平台。第一个可能靠运气工作,在未初始化的内存中已经为 0。
将传递给 malloc
的大小也用于 memset
(或者在使用 for
循环复制数据后仅写入字符串终止符 '[=18=]'
。
还要检查 malloc
是否成功,即它的 return 值不是 NULL
。
编辑:要重构您的第二个函数,您可以删除对 memset
的调用并更改
for (int x=0;x<strlen(msg);x++) newMsg[x] = msg[x+startChar];
至
int x;
for (x=0;x<strlen(msg);x++) newMsg[x] = msg[x+startChar];
newMsg[x] = '[=11=]'; // Or just 0, it is equivalent