Arduino在相同函数附近具有非常不同的输出

时间:2015-11-11 00:45:47

标签: c arduino

我有3种不同的功能,使用我的Arduino和SIM900发送短信。

第一个函数有两个参数,并将给定的字符数组发送到目标电话号码

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)

的正文之间没有区别

1 个答案:

答案 0 :(得分:2)

您的null错误,特别是memset其中sizeof(newMsg)是指针。因此newMsg最有可能是2或4,具体取决于您的平台。第一个可能运气好,在未初始化的内存中已经为0。

使用sizeof(newMsg)传递给malloc的大小(或者只有在使用memset循环复制数据后才能编写字符串终结符'\0'

并检查for是否成功,即它的返回值不是malloc

编辑:要重构您的第二个功能,您可以移除对NULL的呼叫并更改

memset

for (int x=0;x<strlen(msg);x++) newMsg[x] = msg[x+startChar];