极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 19355|回复: 13

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

[复制链接]
发表于 2014-4-21 00:41:39 | 显示全部楼层 |阅读模式
为什么DF家的GSM3.0模块和DF家的UNO板子之间的串口通信用Serial.read()只能读取10位左右?一个超过10个英文字符的短信根本无法完整读取啊~问题在板子还是模块啊还是哪里啊,困扰了我好几天了~望各位大侠指点迷津!
读取串口信息的方法,我试过char挨个赋值,和String累加,都一样,都是只能读10位左右~
短信息收到后的存储方式设置为AT+GNMI=2,2,0,0,0
回复

使用道具 举报

发表于 2014-4-21 00:46:49 | 显示全部楼层
為何你會認為 "串口通信用Serial.read()只能读取10位左右?"
在電腦中測試, 經常都會超過 10字符, 從未試過有問題.

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

使用道具 举报

 楼主| 发表于 2014-4-21 10:03:41 | 显示全部楼层
Super169 发表于 2014-4-21 00:46
為何你會認為 "串口通信用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不亮~
回复 支持 反对

使用道具 举报

发表于 2014-4-21 11:58:49 | 显示全部楼层
本帖最后由 Super169 于 2014-4-21 12:22 编辑
  1. if(inchar =="123456789012345")
复制代码
Arduino 的 c 可以這樣 compare string?

... 是我見識少, 原來真的可以.....我一直都是用 strcmp 的.
回复 支持 反对

使用道具 举报

发表于 2014-4-21 12:34:56 | 显示全部楼层
用你的程式跟電腦連線測試沒有問題 (當中有些字符有問題, 下次直接 copy 你的源碼到 code 中吧).

你有試過用 usb 線跟電腦連線作測試嗎?  
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-21 13:04:36 | 显示全部楼层
Super169 发表于 2014-4-21 12:34
用你的程式跟電腦連線測試沒有問題 (當中有些字符有問題, 下次直接 copy 你的源碼到 code 中吧).

你有試 ...

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

使用道具 举报

发表于 2014-4-21 13:51:32 | 显示全部楼层
如果接收的程式沒問題, 那有檢查過發出的訊號嗎?
試試用 software serial 接 GPS, 把收到的資料直接 以 byte 的形式 HEX 印到電腦中, 看看是否有問題.

假設 ss 是 softwareserial:


  1.   if (ss.available())
  2.   {
  3.     while (ss.available())
  4.     {
  5.       Serial.print((byte) ss.read(), HEX);
  6.       Serial.print(" ");
  7.       delay(1);
  8.     }
  9.     Serial.println();
  10.   }
复制代码


回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-22 23:37:07 | 显示全部楼层
本帖最后由 bi7mpf 于 2014-4-23 00:37 编辑


非常感谢Super兄的悉心指点~
回复 支持 反对

使用道具 举报

发表于 2014-4-23 00:53:15 | 显示全部楼层
最近在測試串口 6050 時才發覺, 如果只是接收資料, 可以單接 Tx 到 UNO 的 pin 0 (Rx), 然後 USB 接電腦.
就可以用 UNO 在串口接收資料, 再由串口發到電腦上去.  但下載程式時, 一定要先拔掉 pin 0 的接線.

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

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

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

可以的話, 還是用硬串口比較有保障.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-23 01:49:11 | 显示全部楼层
Super169 发表于 2014-4-23 00:53
最近在測試串口 6050 時才發覺, 如果只是接收資料, 可以單接 Tx 到 UNO 的 pin 0 (Rx), 然後 USB 接電腦.
...

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

使用道具 举报

发表于 2014-4-23 06:39:14 | 显示全部楼层
串口是有缓冲区的,当缓冲区满了串口的数据就会被分成几部分,所以在数据中设置结束字符就是为了通过判断结束字符的出现来确定一句完整的内容是否完成。
回复 支持 反对

使用道具 举报

发表于 2014-4-23 09:35:16 | 显示全部楼层
bi7mpf 发表于 2014-4-23 01:49
不同的GSM板子好像软串口的PIN位置不同,SIM900好像是7、8,这个DFROBOT的板子官方网站貌似没有说明~,用 ...

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

使用道具 举报

 楼主| 发表于 2014-5-30 13:44:11 | 显示全部楼层
davidce 发表于 2014-4-23 06:39
串口是有缓冲区的,当缓冲区满了串口的数据就会被分成几部分,所以在数据中设置结束字符就是为了通过判断结 ...

终于理解了你说的这句话,谢谢~
回复 支持 反对

使用道具 举报

发表于 2015-8-12 09:15:26 | 显示全部楼层
初学者学习
回复 支持 反对

使用道具 举报

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

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

Archiver|联系我们|极客工坊

GMT+8, 2024-4-27 08:19 , Processed in 0.044187 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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