2015-11-11 141 views
0

我有3种不同的功能,使用我的Arduino和SIM900发送短信。Arduino附近具有完全不同输出的相同功能

第一功能有两个参数,并发送给它的目标电话号码

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)

回答

2

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

使用传递给malloc也为memset大小你与for循环复制数据后(或只写一个字符串结束'\0'

而且还检查malloc成功,也就是说,它的返回值是不是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] = '\0'; // Or just 0, it is equivalent 
相关问题