我目前在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(底部轨道)串行线上看到的内容:
因此看起来Arduino正在读取整个GPRS响应,然后才开始向PC发送任何内容,我认为某种缓冲区已经溢出,我只能得到消息的开头。 / p>
那么 - 我该如何在这样的串口之间传递长串?我假设使用if (X.available())
代替while
可以减轻长字符串的任何问题(因为这样两个串口应该一次轮流使用一个字节),但这个假设不正确?
答案 0 :(得分:1)
除了AT + CNETSCAN行,输出正好是64字节,这是软件串行缓冲区的大小。所以我认为你是正确的,它是一个缓冲区溢出。我认为你最初尝试while (X.available())
。你确定你重新上传了吗?它似乎应该与if一起使用。我希望它不是那么简单,所以也许你可以在发送之前尝试存储从Serial读取的数据。这样可以缓解两个串行连接之间的潜在冲突。