极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 35098|回复: 15

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

[复制链接]
发表于 2014-6-12 22:27:56 | 显示全部楼层 |阅读模式
问题如标题所述,先用serial3.print发AT+CMGR=1到sim卡,返回短信用输入到一个字符串,然后将这个在字符串输出到serial上,电脑屏幕上能显示前面的63字节,后面的显示不了。附代码:[pre lang="arduino" line="5"]char datasim[255];             //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[n] = 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[m] = ' ';
     delay(2);
   }
    delay(1000);
    mark = 0;
    n = 0;
   
  
  
  
  

}[/code]
回复

使用道具 举报

发表于 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
是接收還是輸出的問題, 還未可以肯定吧.

send 出 AT 指令後, 不要加入 delay(1000); ,  serial buffer s ...

我试了一下,有作用但是只是还是只能得到78字节。能不能再看一下到底是哪儿出问题了
  1. String datasim = "";             //first error,second correct
  2. int i = 0,mark = 0,n = 0,m = 0;      //in most sucation,first is right,expect,

  3. void setup() {                  // it test when it is just on power
  4.   Serial.begin(9600);           //when it count ,it error,count again
  5.   Serial3.begin(9600);

  6. }

  7. void loop() {

  8.   Serial3.print("AT+CMGL=");
  9.   Serial3.print('"');
  10.   Serial3.print("ALL");
  11.   Serial3.print('"');
  12.   Serial3.print("\r\n");
  13.   while (!Serial3.available())                    //wait until data appear
  14.   {
  15.   }
  16. /*  while ((Serial3.available() > 0)&&(n<60))
  17.   {
  18.    
  19.     datapc += char(Serial3.read());
  20.     delay(2);
  21.    n++;
  22.   }
  23.   n = 0;*/
  24.    while (Serial3.available() > 0)
  25.   {
  26.    
  27.     datasim += char(Serial3.read());
  28.       //延时一会,让串口缓存准备好下一个数字,不延时会导致数据丢失,
  29.     delay(2);
  30.     //标记串口读过数据,如果没有数据的话,直接不执行这个while了。
  31.     mark = 1;
  32.    
  33.   }
  34.   
  35.    if(mark == 1)
  36.    {
  37.     Serial.println(datasim.length());
  38.     for(i = 0;i< datasim.length();i++)
  39.        {
  40.         Serial.print(datasim[i]);
  41.         delay(100);
  42.        }
  43.        datasim = "";
  44.    
  45.     mark = 0;
  46.    }
  47.   Serial.print("\r\n");
  48.   
  49.   
  50.    
  51.   
  52.   
  53.   
  54.   

  55. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2014-6-13 12:11:14 | 显示全部楼层
毛驴 发表于 2014-6-13 11:10
我试了一下,有作用但是只是还是只能得到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
首先你要確定收到的 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
serial3接收sim900a的串口数据,然后可以通过serial显示在串口监视器上,serial1,serial2都可以。

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

使用道具 举报

 楼主| 发表于 2014-8-6 10:33:29 | 显示全部楼层
楼小主 发表于 2014-8-6 09:17
那我用的uno只有一个serial怎么办呢
每次我print sim900a发回的回复,同时又发送回给sim900a了。

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

使用道具 举报

发表于 2014-8-6 10:37:00 | 显示全部楼层
毛驴 发表于 2014-8-6 10:33
可以用软串口,有相关的库文件可以用。就是将其他的引脚模拟成串口。

好的,我看到你说的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
你问的问题太宽泛了,我也不知道你的问题出在哪,print只会输出ASC码,你不会想要输出汉字吧,给你看一个网 ...

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

使用道具 举报

 楼主| 发表于 2014-8-6 16:30:33 | 显示全部楼层
这个就不太清楚了,我也没用过,只是看书上说软串口有一些限制,arduino开发实战上有介绍。你问问别人吧
回复 支持 反对

使用道具 举报

发表于 2016-2-11 13:49:08 | 显示全部楼层
我想知道  sim900a如何与电脑调试  让电脑可以读取到sim900a发出来的数据
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-5-4 20:43 , Processed in 0.046944 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表