a library to use GPRS like ethernet or wifi, which makes it possible to connect to the internet with your GPRS module

Dependencies:   BufferedSerial

Dependents:   ThinkSpeak_Test roam_v1 roam_v2 finalv3

Fork of GPRSInterface by wei zou

Committer:
yihui
Date:
Mon Mar 09 07:25:05 2015 +0000
Revision:
9:38800611a613
Parent:
0:8ccbd963e74d
Child:
13:379ce1d51b88
bug fix

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lawliet 0:8ccbd963e74d 1 /*
lawliet 0:8ccbd963e74d 2 modem.cpp
lawliet 0:8ccbd963e74d 3 2014 Copyright (c) Seeed Technology Inc. All right reserved.
lawliet 0:8ccbd963e74d 4
lawliet 0:8ccbd963e74d 5 Author:lawliet zou(lawliet.zou@gmail.com)
lawliet 0:8ccbd963e74d 6 2014-2-24
lawliet 0:8ccbd963e74d 7
lawliet 0:8ccbd963e74d 8 This library is free software; you can redistribute it and/or
lawliet 0:8ccbd963e74d 9 modify it under the terms of the GNU Lesser General Public
lawliet 0:8ccbd963e74d 10 License as published by the Free Software Foundation; either
lawliet 0:8ccbd963e74d 11 version 2.1 of the License, or (at your option) any later version.
lawliet 0:8ccbd963e74d 12
lawliet 0:8ccbd963e74d 13 This library is distributed in the hope that it will be useful,
lawliet 0:8ccbd963e74d 14 but WITHOUT ANY WARRANTY; without even the implied warranty of
lawliet 0:8ccbd963e74d 15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
lawliet 0:8ccbd963e74d 16 Lesser General Public License for more details.
lawliet 0:8ccbd963e74d 17
lawliet 0:8ccbd963e74d 18 You should have received a copy of the GNU Lesser General Public
lawliet 0:8ccbd963e74d 19 License along with this library; if not, write to the Free Software
lawliet 0:8ccbd963e74d 20 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
lawliet 0:8ccbd963e74d 21 */
lawliet 0:8ccbd963e74d 22
lawliet 0:8ccbd963e74d 23 #include "modem.h"
lawliet 0:8ccbd963e74d 24
lawliet 0:8ccbd963e74d 25 char Modem::readByte(void)
lawliet 0:8ccbd963e74d 26 {
lawliet 0:8ccbd963e74d 27 return serialModem.getc();
lawliet 0:8ccbd963e74d 28 }
lawliet 0:8ccbd963e74d 29
lawliet 0:8ccbd963e74d 30 bool Modem::readable()
lawliet 0:8ccbd963e74d 31 {
lawliet 0:8ccbd963e74d 32 return serialModem.readable();
lawliet 0:8ccbd963e74d 33 }
lawliet 0:8ccbd963e74d 34
lawliet 0:8ccbd963e74d 35 int Modem::readBuffer(char *buffer,int count, unsigned int timeOut)
lawliet 0:8ccbd963e74d 36 {
lawliet 0:8ccbd963e74d 37 int i = 0;
lawliet 0:8ccbd963e74d 38 timeCnt.start();
lawliet 0:8ccbd963e74d 39 while(1) {
lawliet 0:8ccbd963e74d 40 while (serialModem.readable()) {
lawliet 0:8ccbd963e74d 41 char c = serialModem.getc();
lawliet 0:8ccbd963e74d 42 buffer[i++] = c;
lawliet 0:8ccbd963e74d 43 if(i >= count)break;
lawliet 0:8ccbd963e74d 44 }
lawliet 0:8ccbd963e74d 45 if(i >= count)break;
lawliet 0:8ccbd963e74d 46 if(timeCnt.read() > timeOut) {
lawliet 0:8ccbd963e74d 47 timeCnt.stop();
lawliet 0:8ccbd963e74d 48 timeCnt.reset();
lawliet 0:8ccbd963e74d 49 break;
lawliet 0:8ccbd963e74d 50 }
lawliet 0:8ccbd963e74d 51 }
lawliet 0:8ccbd963e74d 52 return 0;
lawliet 0:8ccbd963e74d 53 }
lawliet 0:8ccbd963e74d 54
lawliet 0:8ccbd963e74d 55 void Modem::cleanBuffer(char *buffer, int count)
lawliet 0:8ccbd963e74d 56 {
lawliet 0:8ccbd963e74d 57 for(int i=0; i < count; i++) {
lawliet 0:8ccbd963e74d 58 buffer[i] = '\0';
lawliet 0:8ccbd963e74d 59 }
lawliet 0:8ccbd963e74d 60 }
lawliet 0:8ccbd963e74d 61
lawliet 0:8ccbd963e74d 62 void Modem::sendCmd(const char* cmd)
lawliet 0:8ccbd963e74d 63 {
lawliet 0:8ccbd963e74d 64 serialModem.puts(cmd);
lawliet 0:8ccbd963e74d 65 }
lawliet 0:8ccbd963e74d 66
yihui 9:38800611a613 67 void Modem::sendData(const char* data, int len)
yihui 9:38800611a613 68 {
yihui 9:38800611a613 69 for (int i = 0; i < len; i++) {
yihui 9:38800611a613 70 serialModem.putc(data[i]);
yihui 9:38800611a613 71 }
yihui 9:38800611a613 72 }
yihui 9:38800611a613 73
lawliet 0:8ccbd963e74d 74 void Modem::sendATTest(void)
lawliet 0:8ccbd963e74d 75 {
lawliet 0:8ccbd963e74d 76 sendCmdAndWaitForResp("AT\r\n","OK",DEFAULT_TIMEOUT,CMD);
lawliet 0:8ccbd963e74d 77 }
lawliet 0:8ccbd963e74d 78
lawliet 0:8ccbd963e74d 79 bool Modem::respCmp(const char *resp, unsigned int len, unsigned int timeout)
lawliet 0:8ccbd963e74d 80 {
lawliet 0:8ccbd963e74d 81 int sum=0;
lawliet 0:8ccbd963e74d 82 timeCnt.start();
lawliet 0:8ccbd963e74d 83
lawliet 0:8ccbd963e74d 84 while(1) {
lawliet 0:8ccbd963e74d 85 if(serialModem.readable()) {
lawliet 0:8ccbd963e74d 86 char c = serialModem.getc();
lawliet 0:8ccbd963e74d 87 sum = (c==resp[sum]) ? sum+1 : 0;
lawliet 0:8ccbd963e74d 88 if(sum == len)break;
lawliet 0:8ccbd963e74d 89 }
lawliet 0:8ccbd963e74d 90 if(timeCnt.read() > timeout) {
lawliet 0:8ccbd963e74d 91 timeCnt.stop();
lawliet 0:8ccbd963e74d 92 timeCnt.reset();
lawliet 0:8ccbd963e74d 93 return false;
lawliet 0:8ccbd963e74d 94 }
lawliet 0:8ccbd963e74d 95 }
lawliet 0:8ccbd963e74d 96 timeCnt.stop();
lawliet 0:8ccbd963e74d 97 timeCnt.reset();
lawliet 0:8ccbd963e74d 98
lawliet 0:8ccbd963e74d 99 return true;
lawliet 0:8ccbd963e74d 100 }
lawliet 0:8ccbd963e74d 101
lawliet 0:8ccbd963e74d 102 int Modem::waitForResp(const char *resp, unsigned int timeout,DataType type)
lawliet 0:8ccbd963e74d 103 {
lawliet 0:8ccbd963e74d 104 int len = strlen(resp);
lawliet 0:8ccbd963e74d 105 int sum=0;
lawliet 0:8ccbd963e74d 106 timeCnt.start();
lawliet 0:8ccbd963e74d 107
lawliet 0:8ccbd963e74d 108 while(1) {
lawliet 0:8ccbd963e74d 109 if(serialModem.readable()) {
lawliet 0:8ccbd963e74d 110 char c = serialModem.getc();
lawliet 0:8ccbd963e74d 111 sum = (c==resp[sum]) ? sum+1 : 0;
lawliet 0:8ccbd963e74d 112 if(sum == len)break;
lawliet 0:8ccbd963e74d 113 }
lawliet 0:8ccbd963e74d 114 if(timeCnt.read() > timeout) {
lawliet 0:8ccbd963e74d 115 timeCnt.stop();
lawliet 0:8ccbd963e74d 116 timeCnt.reset();
lawliet 0:8ccbd963e74d 117 return -1;
lawliet 0:8ccbd963e74d 118 }
lawliet 0:8ccbd963e74d 119 }
lawliet 0:8ccbd963e74d 120 timeCnt.stop();
lawliet 0:8ccbd963e74d 121 timeCnt.reset();
lawliet 0:8ccbd963e74d 122
lawliet 0:8ccbd963e74d 123 if(type == CMD) {
lawliet 0:8ccbd963e74d 124 while(serialModem.readable()) {
lawliet 0:8ccbd963e74d 125 char c = serialModem.getc();
lawliet 0:8ccbd963e74d 126 }
lawliet 0:8ccbd963e74d 127 }
lawliet 0:8ccbd963e74d 128
lawliet 0:8ccbd963e74d 129 return 0;
lawliet 0:8ccbd963e74d 130 }
lawliet 0:8ccbd963e74d 131
lawliet 0:8ccbd963e74d 132 int Modem::sendCmdAndWaitForResp(const char* data, const char *resp, unsigned timeout,DataType type)
lawliet 0:8ccbd963e74d 133 {
lawliet 0:8ccbd963e74d 134 sendCmd(data);
lawliet 0:8ccbd963e74d 135 return waitForResp(resp,timeout,type);
lawliet 0:8ccbd963e74d 136 }