【问题标题】:Reading a long text from GPRS Shield with Arduino使用 Arduino 从 GPRS Shield 读取长文本
【发布时间】:2013-12-10 20:39:40
【问题描述】:

我对此感到很痛苦,我知道这可能真的很简单。我正在尝试从我的 Seeed GPRS shield 读取短信。我将屏蔽设置为软件串行,并将从 GPRS 接收到的信息显示到串行监视器。我目前正在处理我的代码时通过串行发送所有 AT 命令。为了将软件串口的数据显示到串口监视器,我使用了以下代码。

while(GPRS.available()!=0) { 
Serial.write(GPRS.read()); 
}

GPRS 显然是我的软件序列号。问题是,文本很长,我只能从中得到几个字符。像这样的。

+CMGR: "REC READ","1511","","13/12/09,14:34:54-24" 欢迎来到 TM eos8

此文本是更长的“欢迎使用 T-Mobile”文本。显示的最后几个字符是加扰的。我做了一些研究,发现我可以将串行缓冲区大小修改为 256 而不是默认的 64。我想避免这种情况,因为我确信有更简单的方法。有什么想法吗?

【问题讨论】:

    标签: arduino gprs arduino-ide


    【解决方案1】:

    您是否尝试过一次读取一个字节的字符数组?看看这是否有帮助:

    if (GPRS.available()) { // GPRS talking ..
        while(GPRS.available()) { // As long as it is talking ..
        buffer[count++]=GPRS.read();     
        // read char into array
        if(count == 64) break; // Enough said!
    }
    Serial.write(buffer,count); // Display in Terminal
    clearBufferArray();
    count = 0;
    }
    

    您需要适当地声明变量'buffer'和'count'并定义函数'clearBufferArray()'

    如果这有帮助,请告诉我。

    【讨论】:

      【解决方案2】:

      看起来这只是所有 Arduino 串行连接中缺乏流量控制的结果。如果您无法将 GPRS() 输入字节序列调整到保证输入 FIFO 不会溢出的速率,那么当输出 FIFO 填满时,您的 Serial.write() 将阻塞。此时,您将在地板上丢弃新的 GPRS 输入字节,直到串行输出释放更多空间。

      由于捕获的输出显然已清理到大约 64 个字节,这表明
      a) 一个 64 字节的缓冲区,
      b) GPRS 数据速率远高于串行数据速率,并且
      c) 垃圾数据实际上是序列后面偶尔出现的有效字节。

      您可以通过测试 Serial.write 的返回码来确认这一点。如果您返回零,则该字节将丢失。

      如果您将 9600 用于串行,57600 用于 GPRS,我预计在输出被破坏之前会超过 64 个字节,但如果 GPRS 速率超过串行速率的 64 倍,则整个输出 FIFO 可以在单个输出字节传输时间内填满。

      捕获到中间缓冲区应该可以解决您的问题,只要它足够大以容纳整个消息。同样,将源(连同测试 Serial.write)或目标(无需任何额外代码)FIFO 的大小扩展到最大数据报大小应该可以工作。

      【讨论】:

        【解决方案3】:

        我在尝试阅读消息并获取 64 个字符时遇到了同样的问题。我通过在调用从 GPRS 读取的函数的循环中添加“延迟(10)”来克服它。似乎足以克服比赛场景。 - 使用 Arduino Mega。

            void loop() {
              ReadmyGPRS();
              delay(10);  //A race condition exists to get the data.  
            }
        
            void ReadmyGPRS(){
              if (Serial1.available()){ // if data is comming from GPRS serial port
                count = 0;  // reset counter
                while(Serial1.available())          // reading data into char array 
              {
              buffer[count++]=Serial1.read();     // writing data into array
              if(count == 160)break;
             }
             Serial.write(buffer,count);
            }
        

        }

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多