取消注释代码时的奇怪行为

时间:2013-01-31 16:55:59

标签: gps arduino gprs

我正在尝试使用gps和gprs盾牌进行arduino工作。到现在为止还挺好。 当我对注释行进行注释时,我的代码会起作用,如果我取消注释它们就会停止工作。

甚至更早的事件也会失败。例如,我必须输出GPRS RegisteredGPRS AT Ready,但不会发生。

我的arduino有可能被损坏吗?

这是代码。

请注意,我测试了使用实际屏蔽发送到gprs shield的命令,它可以正常工作。

#include <SoftwareSerial.h>
#include <TinyGPS.h>

#define BUFFSIZ 90

int GPRS_Registered;
int GPRS_AT_Ready;

char incoming_char = 0;
char buffidx;
char at_buffer[BUFFSIZ];

int firstLoop = 1;

TinyGPS gps;
SoftwareSerial cell(2,3);
SoftwareSerial uart_gps(0,1);

void sendSMS(char *msg){
  cell.println("AT+CMGF=1");
  cell.print("AT+CMGS=");
  cell.write(34);
  cell.print("A number here");
  cell.write(34);
  cell.println("");
  delay(500);
  cell.println(msg);
  cell.write(26);
  delay(15000);
}

void readATString(){
  char c;
  buffidx = 0;

  while(true){
    if(cell.available() > 0){
      c = cell.read();
      if(c == -1){
        at_buffer[buffidx] = '\0';
        return;
      }

      if(c == '\n'){
        continue;
      }

      if((buffidx == BUFFSIZ - 1) || (c == '\r')){
        at_buffer[buffidx] = '\0';
        return;
      }

      at_buffer[buffidx++] = c;
    }
  }
}

void processATString(){
  if(strstr(at_buffer, "+SIND: 8") != 0){
    GPRS_Registered = 0;
    Serial.println("GPRS Network Not Available");
  }

  if(strstr(at_buffer, "+SIND: 11") != 0){
    GPRS_Registered = 1;
    Serial.println("GPRS Registered");
  }

  if(strstr(at_buffer, "+SIND: 4") != 0){
    GPRS_AT_Ready = 1;
    Serial.println("GPRS AT Ready");
  }


}

void setup(){
  Serial.begin(115200);

  cell.begin(9600);
  uart_gps.begin(4800);

  cell.listen();
  Serial.println("Starting SM5100 Communication...");

  delay(5000);
}


void loop(){
  bool dataReady = false;
  unsigned long chars, prev_chars = 0;
  unsigned short sentences, failed;

  if(firstLoop){
    firstLoop = 0;
    while(GPRS_Registered == 0 || GPRS_AT_Ready == 0){
      readATString();
      processATString();
    }
    Serial.println("Everything is working");
  }

  uart_gps.listen();
  for (unsigned long start = millis(); millis() - start < 1000;){
    while (uart_gps.available()){
      char c = uart_gps.read();
      if (gps.encode(c))
        dataReady = true;
    }
  }

  if (dataReady)
  {
    float flat, flon;
    unsigned long age;
    gps.f_get_position(&flat, &flon, &age);
    Serial.print("flat: ");
    Serial.print(flat, 6);
    Serial.print("flon: ");
    Serial.println(flon, 6);

    cell.listen();

      // HERE IS THE PROBLEM
//    cell.println("AT+CGDCONT=1,\"IP\",\"internet\"");
//    delay(3000);
//    cell.println("AT+CGACT=1,1");
//    delay(3000);
//    cell.println("AT+SDATACONF=1,\"TCP\",\"my.server.com\",8080");
//    delay(3000);
//    cell.println("AT+SDATASTART=1,1");
//    cell.println("AT+SSTRSEND=1,\"testing arduino gprs\"");


    Serial.println("Sent data to server");

  }
}

1 个答案:

答案 0 :(得分:3)

我会直接将屏蔽TX和RX连接到PC的串口,然后手动发出命令并查看响应。由于回复将阐明您的问题和解决方案。这可以通过Arduino上的一些跳转来完成。

  1. 将RST跳至GND
  2. 跳0到2和1到3.(我可能会倒退0到3和1到2。)
  3. RST关闭ATmega328,其他人将TX / RX跳转到Cell设备和基站FTDI芯片之间,连接到PC的USB串口。

    如果您使用Arduino的IDE串行监视器,请注意正确设置LineFeed。


    您正在尝试使用三种设备:

    1. SoftwareSerial cell(2,3);
    2. SoftwareSerial uart_gps(0,1);
    3. Serial.Print
    4. 你实际上只使用2对Tx和Rx引脚,而不是3对。请注意,Arduino Core已经定义了串行类,以便在引脚0和1上使用硬件UART。但是,您在GPS上为0,1定义了SoftwareSerial(也就是UART)。因此使用相同引脚的两件事 - 问题。

      SMS工作初始为uart_gps.begin,禁用Serial.begin使用的硬件uart。所以你的cell.prints工作。但是然后你的Serial.prints与你的uart_gps发生冲突,事情就变坏了。

      不确定您的确切症状,但需要先解决资源问题。看看GPS和GPRS防护罩,我看到移动是可选择的,因为你在0,1和2,3之间陈述。其中0,1是我最初建议将Arduino CPU干扰到RESET,然后三态使用引脚0和1,允许屏蔽在被选择为0时将无线电的uart路由到FTDI直接电脑控制。虽然这可以用于Arduino的CPU,但FTDI需要在Tristate中。

      解决方案是屏蔽上的一些跳线,将0,1以外的引脚用于未使用的引脚,并将相应的SoftwareSerial移动到这些引脚。虽然确保0,1引脚没有连接在屏蔽之间,但堆叠时可能会将它们弯曲掉。