如何在Arduino上获取实时GPS Sim800模块RTC时间

问题描述

你好,我想在Arduino上使用GPS Sim800 Module实时RTC时间而无需使用库,我可以使用库来实现,但是没有库,正确的数据仅在一分钟之内就出现了,而其他则带来了垃圾

请告诉我可以帮助我实现这一目标的代码

使用代码,我做了以下事情

#include <SoftwareSerial.h>
SoftwareSerial gsm(10,11);
String Buffer;
String inData;

int i;
int *year,*month,*day,*hour,*minute,*second;

void setup() {
  Serial.begin(9600);
  gsm.begin(9600);
  delay(5000);
}

void loop() {
Ansh:
  delay(500);
  gsm.println("AT+cclK?\r\n");
  while (gsm.available()) {
    char recieved = gsm.read();
    inData += recieved;
    delay(100);

    // Process message when new line character is recieved
    if (recieved == '\n')
    {
      Serial.print("Arduino Received: ");
      Serial.println(inData);

      if (inData.substring(1,5) == "+cclK") {
        Serial.println("Hello");
      }

      // You can put some if and else here to process the message juste like that:

      if (inData == "+++\n") { // DON'T forget to add "\n" at the end of the string.
        Serial.println("OK. Press h for help.");
      }


      inData = ""; // Clear recieved buffer
      goto Ansh;
    }

    /* Buffer = Buffer.substring(Buffer.indexOf("\"") + 1,Buffer.lastIndexOf("\"") - 1);
      year = Buffer.substring(0,2).toInt();
      month = Buffer.substring(3,5).toInt();
      day = Buffer.substring(6,8).toInt();
      hour = Buffer.substring(9,11).toInt();
      minute = Buffer.substring(15,17).toInt();
      second = Buffer.substring(18,20).toInt();
    */
  }/*
  Serial.println(*hour);
  delay(100);
  Serial.println(*minute);
  delay(100);
  Serial.println(*second);
  delay(100);
*/
}

但是我没有得到实时输出,但是在1次正确输出之后,它返回如下垃圾信息

12:22:38.960->接收到的Arduino:+ cclK:“ 20/10 / 04,12:22:31 + 22” 12:22:38.960-> 12:22:39.672->接收到的Arduino:12:22:39.672-> 12:22:40.596->收到Arduino:OK 12:22:40.596-> 12:22:42.339-> Arduino收到:AT + cclK?

12:22:42.339-> 12:22:44.362->收到Arduino:+ CCAT + cclK?

12:22:44.362-> 12:22:46.0​​67->接收到Arduino:AT + cclK?

12:22:46.0​​67-> 12:22:50.344->接收到的Arduino:+ cclK: “ 20/10 / 04,12ATAT + CAT + cclK?

12:22:50.344-> 12:22:52.043->收到Arduino:AT + cclK吗?

12:22:52.043-> 12:22:54.082->接收到的Arduino:+ CCAT + cclK?

12:22:54.082-> 12:22:55.822->收到Arduino:AT + cclK吗?

12:22:55.822-> 12:23:00.064->接收到的Arduino:+ cclK: “ 20/10 / 04,12:22:49AT + cclK?

12:23:00.098-> 12:23:01.791->收到Arduino:AT + cclK?

12:23:01.791-> 12:23:03.810->接收到的Arduino:+ CCAT + cclK?

12:23:03.845-> 12:23:05.552->收到Arduino:AT + cclK吗?

12:23:05.552-> 12:23:09.803->接收到的Arduino:+ cclK: “ 20/10 / 04,12:22:58AT + cclK?

12:23:09.838-> 12:23:11.544->收到Arduino:AT + cclK吗?

12:23:11.544-> 12:23:13.563->接收到的Arduino:+ CCAT + cclK?

12:23:13.563-> 12:23:15.290->接收到的Arduino:AT + cclK?

12:23:15.290-> 12:23:19.557->接收到的Arduino:+ cclK: “ 20/10 / 04,12:23:08AT + cclK?

12:23:19.557-> 12:23:21.278->接收到的Arduino:AT + cclK?

如果我从代码中消除了延迟,那么我将收到以下输出

12:34:56.406->收到Arduino:(:SCC⸮⸮CL?⸮

1-⸮

AT + cclK?

AT + ccl〜Q⸮ -j 12:34:56.473-> 12:34:56.541->接收到的Arduino:⸮5⸮⸮AT+ cclK?

⸮⸮⸮〜⸮⸮1⸮j⸮b-⸮

AT + cclK?

AT +C⸮〜⸮⸮1-j⸮5⸮⸮(⸮i1-⸮

AV⸮1-j12:34:56.607-> 12:34:56.913->接收到的Arduino:⸮5⸮⸮J⸮jj⸮j AT + cclK?

AT + cclK?

AT + cclK?

AT +CK5Q⸮1⸮j⸮5⸮⸮AT+ cclK?

AT + cclK?

AT + cclK?

AT + cclK?

AT + cclK?

AT +cclK⸮Q⸮Zj⸮5⸮⸮(⸮⸮1-⸮

1⸮j⸮5j⸮ը(⸮CCP⸮i1-⸮5Q⸮⸮j⸮jj⸮ը(j⸮jQb⸮⸮E⸮jj⸮(⸮⸮1-⸮5Q⸮ Zj⸮5⸮⸮(⸮⸮(j⸮jQ⸮Zj⸮5j⸮ը(⸮j⸮⸮1⸮j⸮⸮5j⸮(⸮⸮(⸮j⸮V1-j 12:34:57.184-> 12:34:57.252->接收到的Arduino:⸮5⸮⸮D⸮j1-⸮

AT + cclK?

AT + cclK?

AT + cclK?

AT + cclK?

AT + cclK?

一个1-⸮

AT + cclK?

AT + cclK?

AT + cclK?

AT + ccl〜Q⸮ -j 12:34:57.354-> 12:34:57.561->接收到的Arduino:⸮5⸮⸮AT+ cclK?

AT + cclK?

AT + cclK?

AT + cclK?

AT + cclK?

AT + cclK? j AT + cclK?

AT + cclK?

AT + cclK?

AT + cclK?

AT +C⸮⸮5Q⸮⸮⸮Ԋi⸮j⸮(Q⸮⸮j⸮jj⸮ը(⸮CCP⸮i⸮j⸮ը(⸮CC⸮⸮⸮K?⸮+ cclK?

AT +C⸮Q⸮Zj⸮5⸮⸮(Q⸮ -j 12:34:57.763-> 12:34:57.763->接收到的Arduino:⸮5⸮⸮E⸮jj⸮jAT + cclK?

AT + cclK?

AT + cclK?

AT + cclK?

AT + cclK?

AT⸮⸮z⸮⸮z⸮⸮b⸮⸮Қ⸮Ҫ⸮Z⸮⸮j12:34:57.866-> 12:34:57.866-> Arduino 接收:12:34:57.905-> 12:34:57.905-> Arduino接收:确定 12:34:57.968-> 12:34:57.968->收到Arduino:AT + cclK吗?

12:34:57.968-> 12:34:57.968->收到的Arduino:+ cclK: “ 20/10 / 04,12:34:54 + 22” 12:34:58.037-> 12:34:58.037-> Arduino 接收:12:34:58.070-> 12:34:58.070-> Arduino接收:确定 12:34:58.070-> 12:34:58.070->接收到的Arduino:AT + CCK ⸮'I⸮)j⸮H(⸮5⸮ꨨH⸮)⸮Қ⸮Ҫ⸮Z⸮⸮j12:34:58.138-> 12:34:58.138-> Arduino 接收:12:34:58.172-> 12:34:58.172-> Arduino接收:确定 A +⸮1-⸮jRb҂⸮jjZ⸮⸮Ҫ⸮Z⸮⸮j12:34:58.207-> 12:34:58.207-> Arduino 收到:

解决方法

尝试一下:

#include <SoftwareSerial.h>

SoftwareSerial gsm(10,11);
String inData;

void setup() {
    Serial.begin(9600);
    gsm.begin(9600);
    delay(5000);
}

void loop() {

    inData = "";

    gsm.println("AT+CCLK?");
    delay(500);

    while (gsm.available()) {
        inData += char(gsm.read());
    }

    Serial.print("Arduino Received: ");
    Serial.println(inData);

    delay(500);
}
,

@Danny_ds

while (gsm.available()) { inData += char(gsm.read()); }

如果GSM在您之前提供的500ms暂停期间没有机会填充缓冲区,则清空缓冲区的速度将比填充缓冲区快。

缓冲区也只有64个字节深,在9600波特下,您可以在这500ms内接收480个字符。这意味着,如果答案超过64个字节,您将失去所有其他内容。

因此,总而言之,您不能保证看到完整的答案。

执行此操作的正确方法是等待文档中所述的完整答案(通常在答案结尾会得到“ OK \ r \ n ”),或者超时首先。