将字符串从pc发送到arduino

时间:2014-03-04 13:54:32

标签: string serialization serial-port arduino

我有一个字符串,特别是一个从串口(pc)输入11位数的手机号码,我打算将它发送给arduino。我输入字符串并将其打印到串行缓冲区没有问题,我很困惑的是,arduino是否真正正确读取了我刚刚输入的手机号码?另外,让我们假设arduino已经读取了字符串,我如何在我的arduino代码中正确插入字符串并处理所有内容以便它现在可以发送短信?我只能使用GSMSMS代码发送短信。我能够通过手动输入特定的手机号码来实现。但是下面的第一个arduino代码,我有错误。我错过了什么吗?我非常需要一些建议和提示。提前致谢! :))) 这是我的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”来自哪里?我的输入字符串在哪里?

1 个答案:

答案 0 :(得分:0)

代码有点乱。

首先,你应该循环连续,直到所有11个字符被加入;实际上你只是看看是否有角色,但你没有为他们做什么

在loop_serial()之前做一段时间阻止你的程序,直到11个字符准备好被加入:

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

然后你可以在for中读取这个字符,如果有剩余字符则由你写错误处理代码。

要读取,loop_serial中的代码很好,但是

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

所以,当你读取inData(实际上你不等待char,所以可能你从未参加过这个循环),你打印它,然后你清除它,你将清除的字符串复制到一个char数组;这也是一个缓冲区溢出,因为你是没有退出到charBuf的copyng char,如果你没有清除inData,你应该检查大小是否为11,或者如果你仍然导致溢出,你可能会破坏很多东西以奇怪的方式。

我的建议是编写一个只能在序列号上重新编号的代码,并对其进行压力测试。当你有它的工作时,很容易将它“连接”到GSM草图,如果该部分看似正确:)