1

我正在尝试让我的 arduino 与 gps 和 gprs shield 一起工作。到现在为止还挺好。我的代码在我注释了注释行时有效,如果我取消注释它们就停止工作。

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

我的arduino有可能损坏吗?

这是代码。

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

#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");

  }
}
4

1 回答 1

3

我会将屏蔽 TX 和 RX 直接连接到 PC 的串行端口,然后手动发出命令并查看响应。因为答复将阐明您的问题和解决方案。这可以简单地通过在 Arduino 上跳几下来完成

  1. 将RST跳到GND
  2. 跳到 0 到 2 和 1 到 3。(我可能会向后跳到 0 到 3 和 1 到 2。)

RST 关闭 ATmega328,其他的将 TX/RX 跳转到 Cell 设备和基础 FTDI 芯片到 PC 的 USB 串行端口之间。

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


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

  1. 软件串行单元(2,3);
  2. SoftwareSerial uart_gps(0,1);
  3. 串行打印

您实际上只使用了 2 对 Tx 和 Rx 引脚,而不是 3 对。请注意,串行类已经由 Arduino 核心定义为在引脚 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,然后将三种状态使用引脚0和1,允许屏蔽选择到0,1以将无线电的UART路由到FTDI以进行直接电脑控制。而这可以用于 Arduino 的 CPU,但 FTDI 需要处于三态。

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

于 2013-01-31T19:29:06.607 回答