我对此非常感冒,我知道这可能非常简单。我试图从我的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.我想避免这种情况,因为我确信有一种更简单的方法。有什么想法吗?
答案 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);
}
}