arduino mega 2560用串口4接sim900a,发指令读短信返回到电脑上,只能显示63字节...
问题如标题所述,先用serial3.print发AT+CMGR=1到sim卡,返回短信用输入到一个字符串,然后将这个在字符串输出到serial上,电脑屏幕上能显示前面的63字节,后面的显示不了。附代码:char datasim; //first erroy,second correctint i = 0,mark = 0,n = 0,m = 0; //in most sucation,first is right,expect,
void setup() { // it test when it is just on power
Serial.begin(9600); //when it count ,it erroy,count again
Serial3.begin(9600);
}
void loop() {
Serial3.print("AT+CMGR=1\r\n");
delay(1000);
/*while ((Serial3.available() > 0)&&(n<60))
{
datapc += char(Serial3.read());
delay(2);
n++;
}
n = 0;*/
while (Serial3.available() > 0)
{
datasim = char(Serial3.read());
//延时一会,让串口缓存准备好下一个数字,不延时会导致数据丢失,
delay(2);
//标记串口读过数据,如果没有数据的话,直接不执行这个while了。
mark = 1;
n++;
}
if(mark == 1)
{
for(i = 0;i<n;i++)
{
Serial.print(datasim);
delay(200);
}
}
for(m = 0;m<256;m++)
{
datasim = ' ';
delay(2);
}
delay(1000);
mark = 0;
n = 0;
} 是接收還是輸出的問題, 還未可以肯定吧.
send 出 AT 指令後, 不要加入 delay(1000); ,serial buffer size 只有 64byte, 9600bps, delay 1 秒就有機會收到 1200 byte, 足夠出現 buffer full 了.如果要等資料, 可用 while (!Serial3.availabl()); .
再加一個 Serial.println(n); 看看收到多少個資料.
Super169 发表于 2014-6-12 23:39 static/image/common/back.gif
是接收還是輸出的問題, 還未可以肯定吧.
send 出 AT 指令後, 不要加入 delay(1000); ,serial buffer s ...
我试了一下,有作用但是只是还是只能得到78字节。能不能再看一下到底是哪儿出问题了String datasim = ""; //first error,second correct
int i = 0,mark = 0,n = 0,m = 0; //in most sucation,first is right,expect,
void setup() { // it test when it is just on power
Serial.begin(9600); //when it count ,it error,count again
Serial3.begin(9600);
}
void loop() {
Serial3.print("AT+CMGL=");
Serial3.print('"');
Serial3.print("ALL");
Serial3.print('"');
Serial3.print("\r\n");
while (!Serial3.available()) //wait until data appear
{
}
/*while ((Serial3.available() > 0)&&(n<60))
{
datapc += char(Serial3.read());
delay(2);
n++;
}
n = 0;*/
while (Serial3.available() > 0)
{
datasim += char(Serial3.read());
//延时一会,让串口缓存准备好下一个数字,不延时会导致数据丢失,
delay(2);
//标记串口读过数据,如果没有数据的话,直接不执行这个while了。
mark = 1;
}
if(mark == 1)
{
Serial.println(datasim.length());
for(i = 0;i< datasim.length();i++)
{
Serial.print(datasim);
delay(100);
}
datasim = "";
mark = 0;
}
Serial.print("\r\n");
} 毛驴 发表于 2014-6-13 11:10 static/image/common/back.gif
我试了一下,有作用但是只是还是只能得到78字节。能不能再看一下到底是哪儿出问题了String datasim = ""; ...
首先你要確定收到的 78 個 byte, 是否最前的 78 個.
Serial 接收的資料遺失, 有很多可能, 知道遺漏了的是那一部份, 會較容易猜想問題所在.
也可以試試在 最後再測試一下 Serial3.available(), 因為有可能是發送一方, 把資料分開發出, 當中如果有一定的空隙時, while (Serial3.available()) 就會斷開, 不能在一個loop 之內接收所有資料.
另外, 你原本用 char array 的方法, 比用 String 的好, 在 serial communization 上, 盡可能不要用 String class 吧.String class 會因為一些特別的字符而失掉資料, 使用時要小心.
除非資料的規格很清楚, 否則個人比較喜歡先用 byte array 比資料接收然後再處理.要檢查接收到的資料, 用 hex (或 dec) 的數值, 比用 char 的好.
Super169 发表于 2014-6-13 12:11 static/image/common/back.gif
首先你要確定收到的 78 個 byte, 是否最前的 78 個.
Serial 接收的資料遺失, 有很多可能, 知道遺漏了的 ...
谢谢你的回复,我先试试看,现在想想确实有可能是available断开了,不是一起发的,我接受到的是短信前面的附加内容,短信的正文没有。 读一条短信能完整的读下来,就是你所说的问题,再次感谢你的帮助。 你好,我是新手,想问下为什么用Serial3去通信 serial3接收sim900a的串口数据,然后可以通过serial显示在串口监视器上,serial1,serial2都可以。 毛驴 发表于 2014-8-2 17:47 static/image/common/back.gif
serial3接收sim900a的串口数据,然后可以通过serial显示在串口监视器上,serial1,serial2都可以。
那我用的uno只有一个serial怎么办呢
每次我print sim900a发回的回复,同时又发送回给sim900a了。 楼小主 发表于 2014-8-6 09:17 static/image/common/back.gif
那我用的uno只有一个serial怎么办呢
每次我print sim900a发回的回复,同时又发送回给sim900a了。
可以用软串口,有相关的库文件可以用。就是将其他的引脚模拟成串口。 毛驴 发表于 2014-8-6 10:33 static/image/common/back.gif
可以用软串口,有相关的库文件可以用。就是将其他的引脚模拟成串口。
好的,我看到你说的SoftwareSerial类库。
但是print出来的都是不可读的乱码。 你问的问题太宽泛了,我也不知道你的问题出在哪,print只会输出ASC码,你不会想要输出汉字吧,给你看一个网址http://wiki.geek-workshop.com/doku.php?id=arduino:arduino_language_reference:serial_print,你自己看看 毛驴 发表于 2014-8-6 10:59 static/image/common/back.gif
你问的问题太宽泛了,我也不知道你的问题出在哪,print只会输出ASC码,你不会想要输出汉字吧,给你看一个网 ...
问题是这样的,我只是想把900a的回复 输出到softwareserial.
但是同样的内容,输出到serial是正常的,输出到softwareserial里就乱码了 这个就不太清楚了,我也没用过,只是看书上说软串口有一些限制,arduino开发实战上有介绍。你问问别人吧 我想知道sim900a如何与电脑调试让电脑可以读取到sim900a发出来的数据
页:
[1]
2