2

我对此感到很痛苦,我知道这可能真的很简单。我正在尝试从我的 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。我想避免这种情况,因为我确信有更简单的方法。有任何想法吗?

4

3 回答 3

0

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

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

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

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

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

于 2014-05-12T12:28:11.490 回答
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()'

让我知道这是否有帮助。

于 2014-01-18T19:42:49.407 回答
0

我在尝试阅读消息并获得 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);
    }

}

于 2019-10-03T01:53:09.993 回答