2014-03-04 116 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

相關問題