2014-03-04 79 views
0

我有一个字符串,具体来说,一个手机号码与从串行端口(PC)输入的11个数字,并计划将其发送到arduino。我在输入字符串并将其输出到串行缓冲区时没有问题,我感到困惑的是,arduino是否真正正确地读取了我刚才输入的手机号码?另外,假设arduino已经读取了字符串,我该如何正确地在我的arduino代码中插入字符串并处理所有内容以便它现在可以发送SMS?我能够单独使用GSMSMS代码发送短信。我可以通过手动输入特定的手机号码来完成。但下面的第一个arduino代码,我有错误。我错过了什么吗?我非常需要一些建议和提示。提前致谢! :))) 这是我的Arduino代码:从pc发送字符串到arduino

char text[11]; 
    int bufferIndex = 0; 
    char Rx_data[50]; 
    unsigned char Rx_index = 0; 
    int i = 0; 
    char msg[160]; 
    int sig; 


    void setup(){ 
    Serial.begin(38400); 
     initGSM(); 
     loop_Serial(); 
     send_msg(text, "Your sample has been tested. You may now get your result. Thank you."); 
    } 

    void loop_Serial() 
    { 
     if(Serial.available()) 
    { 
char ch = (char)Serial.read(); 
if(ch == '\n') // is this the terminating carriage return 
{ 
    text[ bufferIndex ] = 0; // terminate the string with a 0  
    bufferIndex = 0; // reset the index ready for another string 
    // do something with the string 
    Serial.println(text); 
} 
else 
    text[ bufferIndex++ ] = ch; // add the character into the buffer 
    } 
    } 

    void loop() { 
    //none 
    } 

    void send_msg(char *number, char *msg) 
    { 
    char at_cmgs_cmd[30] = {'\0'}; 
    char msg1[160] = {'\0'}; 
    char ctl_z = 0x1A; 

    sprintf(msg1, "%s%c", msg, ctl_z); 
    sprintf(at_cmgs_cmd, "AT+CMGS=\"%s\"\r\n",number); 

    sendGSM(at_cmgs_cmd); 
    delay(100); 
    delay(100); 
    delay(100); 
    sendGSM(msg1); 
    delay(100); 
    } 

    void sendGSM(char *string){ 
    Serial.write(string); 
    delay(90); 
    } 

    void clearString(char *strArray) { 
    int j; 
    for (j = 100; j > 0; j--) 
     strArray[j] = 0x00; 
    } 

    void send_cmd(char *at_cmd, char clr){ 
    char *stat = '\0'; 
    while(!stat){ 
     sendGSM(at_cmd); 
     delay(90); 
     readSerialString(Rx_data); 

     stat = strstr(Rx_data, "OK"); 
    } 
    if (clr){ 
     clearString(Rx_data); 
     delay(200); 
     stat = '\0'; 
    } 
    } 

    void initGSM(){ 

    send_cmd("AT\r\n",1);      
    // send_cmd("ATE0\r\n",1); // Turn off automatic echo of the GSM Module 

    send_cmd("AT+CMGF=1\r\n",1);   // Set message format to text mode 
    //Sucess 

    Serial.println("Success"); 

    delay(1000); 
    delay(1000); 
    delay(1000); 
    } 

    void readSerialString (char *strArray) { 

    if(!Serial.available()) { 
     return; 
    } 

    while(Serial.available()) { 
     strArray[i] = Serial.read(); 
     i++; 
    } 
    } 

AT

AT + CMGF = 1

成功

AT + CMGS = “S”

你的样品已经过测试。你现在可以得到你的结果。谢谢。

“S”从哪里来?我输入的字符串在哪里?

回答

0

代码有点乱。

首先,你应该循环串行,直到所有11个字符都得到了;其实你只要看看是否有性格,但你不whait他们之前loop_serial

()做阻止你的编程'直到11字符准备进行readed一会儿:

while(Serial.available() < 11); //because of ; do nothing until there are 11 char 

那么你可以在一个for中读取这个char,如果有残留字符,那么取决于你的错误处理代码。

阅读,在loop_serial代码是好的,但

Serial.print(inData); 
inData=""; 
inData.toCharArray(charBuf, 11); 

所以当你会读到INDATA(其实你不等待焦炭所以也许你从来没有enetered这个循环),你打印出来,然后你清除它,你将清除的字符串复制到一个char数组中;此外,这是一个缓冲区溢出,因为你是copyng char,不会退出到charBuf中,并且如果你没有清除inData,你应该检查size是否为11,或者如果更少,你仍然导致溢出,女巫可能会破坏很多东西以奇怪的方式。

我的提示是编写一个代码,只需要在序列号上进行编号,并对其进行压力测试。当你有它的工作,它将是很容易与GSM草图“连接”,如果该部分似乎是正确的:)

+0

你好,我更新了我的代码。请检查上面..现在我得到“S”,我不知道它来自哪里。 :( – Van

+0

你还没有等待所有11个字符,而且你的++必须移出[] – Lesto

+0

我相信那个loop_Serial部分会循环并循环,直到达到11个字符并执行程序的其余部分, (((((((((()((((((( – Van

相关问题