1

arduino を gps と gprs シールドで動作させようとしています。ここまでは順調ですね。コメント行にコメントを付けるとコードが機能し、コメントを外すと機能が停止します。

以前のイベントでさえ失敗します。たとえば、出力を取得する必要があります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 にジャンプします。

RST は ATmega328 をシャットダウンし、その他は TX/RX を Cell デバイスとベース FTDI チップとの間で PC の USB シリアル ポートにジャンプします。

Arduino の IDE シリアル モニタを使用する場合は、LineFeed を正しく設定するように注意してください。


3 つのデバイスを使用しようとしています:

  1. SoftwareSerial cell(2,3);
  2. SoftwareSerial uart_gps(0,1);
  3. シリアル.プリント

3 ペアではなく、実際には 2 ペアの Tx および Rx ピンのみを使用している場合。シリアル クラスは、ピン 0 と 1 でハードウェア UART を使用するために、Arduino コアによって既に定義されていることに注意してください。したがって、同じピンを使用する 2 つのこと - 問題。

uart_gps.begin が Serial.begin によって使用されるハードウェア uart を無効にすると、SMS は最初に動作します。したがって、あなたの cell.prints は機能します。しかし、その後、Serial.prints が uart_gps と競合し、状況が悪化します。

正確な症状はわかりませんが、最初にリソースの問題を解決する必要があります。GPS と GPRS のシールドを見ると、0,1 から 2,3 の間で選択できることが分かります。ここで、0,1 は Arduino CPU を RESET に妨害するという私の最初の提案を行います。トライステートはピン 0 と 1 を使用し、0,1 を選択するとシールドが無線の uart を直接 FTDI にルーティングできるようにします。パソコン制御。これはArduinoのCPUに使用できますが、FTDIはトライステートにする必要があります。

解決策は、未使用のピンに 0,1 以外のピンを使用し、対応する SoftwareSerial をそれらのピンに移動する、シールド上のいくつかのジャンパーです。0、1ピンがシールド間で接続されていないことを確認しながら、積み重ねると曲がってしまう可能性があります。

于 2013-01-31T19:29:06.607 に答える