将长串从SoftwareSerial传递到Serial

时间:2015-03-21 11:04:49

标签: serial-port arduino gsm

我目前在Arduino Uno上玩GPRS shield,我必须在SoftwareSerial上编写原始AT命令。目前,我只是希望能够通过我的电脑与GPRS通信,所以我写了一个非常基本的程序来向两个方向发送序列:

#include <SoftwareSerial.h>

SoftwareSerial GPRS(7, 8);

void setup()
{
  GPRS.begin(19200);
  Serial.begin(19200);
}

void loop()
{
  if (GPRS.available())
  {
    Serial.write(GPRS.read());
  }

  if (Serial.available())
  {
    GPRS.write(Serial.read());
  }
}

所以沟通看起来像这样:

         HW               SW           
+----+ Serial +-------+ Serial +------+
|    |        |       |        |      |
|    +-------->       +-------->      |
| PC |        |Arduino|        | GPRS |
|    <--------+       <--------+      |
|    |        |       |        |      |
+----+        +-------+        +------+

这似乎适用于较短的命令:

AT+CPIN?

+CPIN: READY

OK

但我真的很想做NETSCAN来查看可用的网络。当我尝试它时,我明白了:

AT+CNETSCAN

------MOST SUITABLE CELL------
Operator:"YES OPTUS",MCC:505,75

就是这样。我拿出一个逻辑分析仪监视串行引脚本身,看起来完整的消息从GPRS模块发送回Arduino完全没问题 - 但由于某种原因,它在到达我的PC之前被切断了。

这是逻辑分析仪在SW(前两个轨道)和HW(底部轨道)串行线上看到的内容:

enter image description here

因此看起来Arduino正在读取整个GPRS响应,然后才开始向PC发送任何内容,我认为某种缓冲区已经溢出,我只能得到消息的开头。 / p>

那么 - 我该如何在这样的串口之间传递长串?我假设使用if (X.available())代替while可以减轻长字符串的任何问题(因为这样两个串口应该一次轮流使用一个字节),但这个假设不正确?

1 个答案:

答案 0 :(得分:1)

除了AT + CNETSCAN行,输出正好是64字节,这是软件串行缓冲区的大小。所以我认为你是正确的,它是一个缓冲区溢出。我认为你最初尝试while (X.available())。你确定你重新上传了吗?它似乎应该与if一起使用。我希望它不是那么简单,所以也许你可以在发送之前尝试存储从Serial读取的数据。这样可以缓解两个串行连接之间的潜在冲突。