毛驴 发表于 2014-6-12 22:27:56

arduino mega 2560用串口4接sim900a,发指令读短信返回到电脑上,只能显示63字节...

问题如标题所述,先用serial3.print发AT+CMGR=1到sim卡,返回短信用输入到一个字符串,然后将这个在字符串输出到serial上,电脑屏幕上能显示前面的63字节,后面的显示不了。附代码:char datasim;             //first erroy,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 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;
   





}

Super169 发表于 2014-6-12 23:39:13

是接收還是輸出的問題, 還未可以肯定吧.

send 出 AT 指令後, 不要加入 delay(1000); ,serial buffer size 只有 64byte, 9600bps, delay 1 秒就有機會收到 1200 byte, 足夠出現 buffer full 了.如果要等資料, 可用 while (!Serial3.availabl()); .

再加一個 Serial.println(n); 看看收到多少個資料.

毛驴 发表于 2014-6-13 11:10:50

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");


   





}

Super169 发表于 2014-6-13 12:11:14

毛驴 发表于 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 的好.

毛驴 发表于 2014-6-14 16:01:51

Super169 发表于 2014-6-13 12:11 static/image/common/back.gif
首先你要確定收到的 78 個 byte, 是否最前的 78 個.

Serial 接收的資料遺失, 有很多可能, 知道遺漏了的 ...

谢谢你的回复,我先试试看,现在想想确实有可能是available断开了,不是一起发的,我接受到的是短信前面的附加内容,短信的正文没有。

毛驴 发表于 2014-6-16 10:42:10

读一条短信能完整的读下来,就是你所说的问题,再次感谢你的帮助。

楼小主 发表于 2014-8-2 16:09:23

你好,我是新手,想问下为什么用Serial3去通信

毛驴 发表于 2014-8-2 17:47:41

serial3接收sim900a的串口数据,然后可以通过serial显示在串口监视器上,serial1,serial2都可以。

楼小主 发表于 2014-8-6 09:17:13

毛驴 发表于 2014-8-2 17:47 static/image/common/back.gif
serial3接收sim900a的串口数据,然后可以通过serial显示在串口监视器上,serial1,serial2都可以。

那我用的uno只有一个serial怎么办呢
每次我print sim900a发回的回复,同时又发送回给sim900a了。

毛驴 发表于 2014-8-6 10:33:29

楼小主 发表于 2014-8-6 09:17 static/image/common/back.gif
那我用的uno只有一个serial怎么办呢
每次我print sim900a发回的回复,同时又发送回给sim900a了。

可以用软串口,有相关的库文件可以用。就是将其他的引脚模拟成串口。

楼小主 发表于 2014-8-6 10:37:00

毛驴 发表于 2014-8-6 10:33 static/image/common/back.gif
可以用软串口,有相关的库文件可以用。就是将其他的引脚模拟成串口。

好的,我看到你说的SoftwareSerial类库。
但是print出来的都是不可读的乱码。

毛驴 发表于 2014-8-6 10:59:42

你问的问题太宽泛了,我也不知道你的问题出在哪,print只会输出ASC码,你不会想要输出汉字吧,给你看一个网址http://wiki.geek-workshop.com/doku.php?id=arduino:arduino_language_reference:serial_print,你自己看看

楼小主 发表于 2014-8-6 15:25:15

毛驴 发表于 2014-8-6 10:59 static/image/common/back.gif
你问的问题太宽泛了,我也不知道你的问题出在哪,print只会输出ASC码,你不会想要输出汉字吧,给你看一个网 ...

问题是这样的,我只是想把900a的回复 输出到softwareserial.
但是同样的内容,输出到serial是正常的,输出到softwareserial里就乱码了

毛驴 发表于 2014-8-6 16:30:33

这个就不太清楚了,我也没用过,只是看书上说软串口有一些限制,arduino开发实战上有介绍。你问问别人吧

qaz只为爱情 发表于 2016-2-11 13:49:08

我想知道sim900a如何与电脑调试让电脑可以读取到sim900a发出来的数据
页: [1] 2
查看完整版本: arduino mega 2560用串口4接sim900a,发指令读短信返回到电脑上,只能显示63字节...