bi7mpf 发表于 2014-4-21 00:41:39

GPS/GPRS/GSM 3.0模块与UNO间串口通信的问题

为什么DF家的GSM3.0模块和DF家的UNO板子之间的串口通信用Serial.read()只能读取10位左右?一个超过10个英文字符的短信根本无法完整读取啊~问题在板子还是模块啊还是哪里啊,困扰了我好几天了~望各位大侠指点迷津!
读取串口信息的方法,我试过char挨个赋值,和String累加,都一样,都是只能读10位左右~
短信息收到后的存储方式设置为AT+GNMI=2,2,0,0,0

Super169 发表于 2014-4-21 00:46:49

為何你會認為 "串口通信用Serial.read()只能读取10位左右?"
在電腦中測試, 經常都會超過 10字符, 從未試過有問題.

你可以分別跟電腦連線, 看看是發出的有問題, 還是接收的有問題.也可能是程式的問題呢.

bi7mpf 发表于 2014-4-21 10:03:41

Super169 发表于 2014-4-21 00:46 static/image/common/back.gif
為何你會認為 "串口通信用Serial.read()只能读取10位左右?"
在電腦中測試, 經常都會超過 10字符, 從未試過 ...

Super兄,我用LED做测试代码如下:

String inchar;

if(Serial.available()>0)
{
   inchar="";
   for (int i=0;i<15;i++)
       {
          delay(10);
          inchar +=char(Serial.read());
       }
   if(inchar =="123456789012345")
       {
          digitalWrite(led,HIGH);
          delay(1000);
          digitalWrite(led,LOW);
          delay(1000);
}

问题:发送11位以下短信可以读出来,led亮;发送11位以上短信读不出,led不亮~

Super169 发表于 2014-4-21 11:58:49

本帖最后由 Super169 于 2014-4-21 12:22 编辑

if(inchar =="123456789012345") Arduino 的 c 可以這樣 compare string?

... 是我見識少, 原來真的可以.....我一直都是用 strcmp 的.

Super169 发表于 2014-4-21 12:34:56

用你的程式跟電腦連線測試沒有問題 (當中有些字符有問題, 下次直接 copy 你的源碼到 code 中吧).

你有試過用 usb 線跟電腦連線作測試嗎?

bi7mpf 发表于 2014-4-21 13:04:36

Super169 发表于 2014-4-21 12:34 static/image/common/back.gif
用你的程式跟電腦連線測試沒有問題 (當中有些字符有問題, 下次直接 copy 你的源碼到 code 中吧).

你有試 ...

usb跟电脑连接没有问题,多少位都可以读出,唯独换回与GSM板串口通讯后,有这个问题~

Super169 发表于 2014-4-21 13:51:32

如果接收的程式沒問題, 那有檢查過發出的訊號嗎?
試試用 software serial 接 GPS, 把收到的資料直接 以 byte 的形式 HEX 印到電腦中, 看看是否有問題.

假設 ss 是 softwareserial:


if (ss.available())
{
    while (ss.available())
    {
      Serial.print((byte) ss.read(), HEX);
      Serial.print(" ");
      delay(1);
    }
    Serial.println();
}

bi7mpf 发表于 2014-4-22 23:37:07

本帖最后由 bi7mpf 于 2014-4-23 00:37 编辑


非常感谢Super兄的悉心指点~

Super169 发表于 2014-4-23 00:53:15

最近在測試串口 6050 時才發覺, 如果只是接收資料, 可以單接 Tx 到 UNO 的 pin 0 (Rx), 然後 USB 接電腦.
就可以用 UNO 在串口接收資料, 再由串口發到電腦上去.但下載程式時, 一定要先拔掉 pin 0 的接線.

當然, 如果用軟串口就更簡單, 只需要有 SoftwareSerial 的庫.在 1.0.5 的 IDE 已預先安裝了, 我想 Mac 的版本也是一樣吧.用法就跟硬串口沒分別, 只是要先定義一個變數.
例如我之前的例子, 只需加上 :#include <SoftwareSerial.h>

SoftwareSerial ss(10, 11); // RX, TX之後就可以用 ss 代替 Serial 了.詳情可以在官網查詢:
http://arduino.cc/en/Reference/SoftwareSerial

注意, SoftwareSerial 好像不支援 SerialEvent.雖然官網說可支援 115200 的速度, 但 我用 Nano 測試, 在 57600 時已開始有錯誤資料的問題.只要降低速度就完全正常.軟串口還是有點不足.

可以的話, 還是用硬串口比較有保障.

bi7mpf 发表于 2014-4-23 01:49:11

Super169 发表于 2014-4-23 00:53 static/image/common/back.gif
最近在測試串口 6050 時才發覺, 如果只是接收資料, 可以單接 Tx 到 UNO 的 pin 0 (Rx), 然後 USB 接電腦.
...

不同的GSM板子好像软串口的PIN位置不同,SIM900好像是7、8,这个DFROBOT的板子官方网站貌似没有说明~,用10,11,9600,有错误~

davidce 发表于 2014-4-23 06:39:14

串口是有缓冲区的,当缓冲区满了串口的数据就会被分成几部分,所以在数据中设置结束字符就是为了通过判断结束字符的出现来确定一句完整的内容是否完成。

Super169 发表于 2014-4-23 09:35:16

bi7mpf 发表于 2014-4-23 01:49 static/image/common/back.gif
不同的GSM板子好像软串口的PIN位置不同,SIM900好像是7、8,这个DFROBOT的板子官方网站貌似没有说明~,用 ...

不會的, GPS 模塊只是輸出資料, 軟串口是在 android 的程式中定義, 只要是可用的 pin 的可以了.
除非你的是 shield 模式的, 接線在 shield 上已決定了.

bi7mpf 发表于 2014-5-30 13:44:11

davidce 发表于 2014-4-23 06:39 static/image/common/back.gif
串口是有缓冲区的,当缓冲区满了串口的数据就会被分成几部分,所以在数据中设置结束字符就是为了通过判断结 ...

终于理解了你说的这句话,谢谢~

mondaywoo 发表于 2015-8-12 09:15:26

初学者学习
页: [1]
查看完整版本: GPS/GPRS/GSM 3.0模块与UNO间串口通信的问题