使用Arduino从GPRS Shield中读取长文本

时间:2013-12-10 20:39:40

标签: arduino gprs arduino-ide

我对此非常感冒,我知道这可能非常简单。我试图从我的Seeed GPRS盾牌中读取短信。我将屏蔽设置为软件序列,我将从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.我想避免这种情况,因为我确信有一种更简单的方法。有什么想法吗?

3 个答案:

答案 0 :(得分:0)

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

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()'

如果有帮助,请告诉我。

答案 1 :(得分:0)

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

由于捕获的输出显然是干净的,大约64字节,这表明 a)64字节缓冲区,
b)GPRS数据速率远高于Serial one,和
c)垃圾数据实际上是序列中较晚的偶然有效字节。

您可以通过测试Serial.write的返回码来确认这一点。如果你回零,那个字节就会丢失。

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

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

答案 2 :(得分:0)

我在尝试阅读消息并获取64个字符时遇到了同样的问题。我通过在循环中添加“ delay(10)”来克服它,该循环调用执行从GPRS读取的功能。似乎足以克服比赛情况。 -使用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);
    }

}