A Serial Interface for SIMCOM modules.

Dependents:   SIMInterface

Committer:
BorjaTarazona
Date:
Thu Aug 10 10:35:22 2017 +0000
Revision:
1:6f42bbd5eb48
Parent:
0:9c2d61688e70
Change in the comment sections

Who changed what in which revision?

UserRevisionLine numberNew contents of line
BorjaTarazona 0:9c2d61688e70 1 #include "ATCommand.h"
BorjaTarazona 0:9c2d61688e70 2 #include <cstring>
BorjaTarazona 0:9c2d61688e70 3 #include "iostream"
BorjaTarazona 0:9c2d61688e70 4 #include <string>
BorjaTarazona 0:9c2d61688e70 5
BorjaTarazona 0:9c2d61688e70 6 char *mybuffer;
BorjaTarazona 0:9c2d61688e70 7 Timer timeCnt;
BorjaTarazona 0:9c2d61688e70 8 int buffLen=0;
BorjaTarazona 0:9c2d61688e70 9
BorjaTarazona 0:9c2d61688e70 10 using std::memset;
BorjaTarazona 0:9c2d61688e70 11 using std::memcpy;
BorjaTarazona 0:9c2d61688e70 12 using namespace std;
BorjaTarazona 0:9c2d61688e70 13
BorjaTarazona 0:9c2d61688e70 14 /** Create a Serial Interface for AT Commands
BorjaTarazona 0:9c2d61688e70 15 *
BorjaTarazona 0:9c2d61688e70 16 * @param tx Tx pin for the UART, rx RX pin for the UART, baudrate Baudrate for the UART
BorjaTarazona 0:9c2d61688e70 17 *
BorjaTarazona 0:9c2d61688e70 18 **/
BorjaTarazona 0:9c2d61688e70 19
BorjaTarazona 0:9c2d61688e70 20 ATSerial::ATSerial(PinName tx, PinName rx, int baudrate)
BorjaTarazona 0:9c2d61688e70 21 : _serial(tx,rx)
BorjaTarazona 0:9c2d61688e70 22 {
BorjaTarazona 0:9c2d61688e70 23 _serial.baud(baudrate);
BorjaTarazona 0:9c2d61688e70 24 }
BorjaTarazona 0:9c2d61688e70 25
BorjaTarazona 0:9c2d61688e70 26 void ATSerial::sendCmd(char *cmd)
BorjaTarazona 0:9c2d61688e70 27 {
BorjaTarazona 0:9c2d61688e70 28 _serial.puts(cmd); //Sends the command contained by >cmd< to the sim900
BorjaTarazona 0:9c2d61688e70 29 _serial.puts("\r\n"); //Ads string "\r\n" --see ATProtocol
BorjaTarazona 0:9c2d61688e70 30 }
BorjaTarazona 0:9c2d61688e70 31
BorjaTarazona 0:9c2d61688e70 32 int ATSerial::waitForAString(char* cmd, char* str,int len, int timeout)
BorjaTarazona 0:9c2d61688e70 33 {
BorjaTarazona 0:9c2d61688e70 34 sendCmd(cmd);
BorjaTarazona 0:9c2d61688e70 35 timeCnt.reset(); //Reset the timer
BorjaTarazona 0:9c2d61688e70 36 timeCnt.start(); //Start the timer
BorjaTarazona 0:9c2d61688e70 37 int sum=0;
BorjaTarazona 0:9c2d61688e70 38 char buf[100];
BorjaTarazona 0:9c2d61688e70 39 char c;
BorjaTarazona 0:9c2d61688e70 40
BorjaTarazona 0:9c2d61688e70 41 while(timeCnt.read_ms() <= timeout)
BorjaTarazona 0:9c2d61688e70 42 {
BorjaTarazona 0:9c2d61688e70 43 if(_serial.readable())
BorjaTarazona 0:9c2d61688e70 44 {
BorjaTarazona 0:9c2d61688e70 45 c= _serial.getc();
BorjaTarazona 0:9c2d61688e70 46 sum = (c==str[sum]) ? sum+1 : 0; //Compare with the message >str< (input variable)
BorjaTarazona 0:9c2d61688e70 47 if(sum == len)break;
BorjaTarazona 0:9c2d61688e70 48 }
BorjaTarazona 0:9c2d61688e70 49 }
BorjaTarazona 0:9c2d61688e70 50
BorjaTarazona 0:9c2d61688e70 51 timeCnt.stop();
BorjaTarazona 0:9c2d61688e70 52 timeCnt.reset();
BorjaTarazona 0:9c2d61688e70 53 if(sum == len) //If the message matches, return ok
BorjaTarazona 0:9c2d61688e70 54 {
BorjaTarazona 0:9c2d61688e70 55 return 0;
BorjaTarazona 0:9c2d61688e70 56 }
BorjaTarazona 0:9c2d61688e70 57 return -1;
BorjaTarazona 0:9c2d61688e70 58
BorjaTarazona 0:9c2d61688e70 59 }
BorjaTarazona 0:9c2d61688e70 60
BorjaTarazona 0:9c2d61688e70 61
BorjaTarazona 0:9c2d61688e70 62 int ATSerial::waitForWord(char* words, int timeout, char* buffer)
BorjaTarazona 0:9c2d61688e70 63 {
BorjaTarazona 0:9c2d61688e70 64
BorjaTarazona 0:9c2d61688e70 65 int len = 9;
BorjaTarazona 0:9c2d61688e70 66 int sum=0;
BorjaTarazona 0:9c2d61688e70 67 timeCnt.start(); //Start the timer
BorjaTarazona 0:9c2d61688e70 68 int dd = 0;
BorjaTarazona 0:9c2d61688e70 69 while(1) { //First loop will look for the WORD
BorjaTarazona 0:9c2d61688e70 70 if(_serial.readable()) {
BorjaTarazona 0:9c2d61688e70 71 char c = _serial.getc();
BorjaTarazona 0:9c2d61688e70 72 sum = (c==words[sum]) ? sum+1 : 0;
BorjaTarazona 0:9c2d61688e70 73 if(sum == len)break;
BorjaTarazona 0:9c2d61688e70 74 dd++;
BorjaTarazona 0:9c2d61688e70 75 }
BorjaTarazona 0:9c2d61688e70 76
BorjaTarazona 0:9c2d61688e70 77 if(timeCnt.read_ms() > timeout) { // If timeout return ERROR
BorjaTarazona 0:9c2d61688e70 78 timeCnt.stop();
BorjaTarazona 0:9c2d61688e70 79 timeCnt.reset();
BorjaTarazona 0:9c2d61688e70 80 buffLen=0;
BorjaTarazona 0:9c2d61688e70 81 return -1;
BorjaTarazona 0:9c2d61688e70 82 }
BorjaTarazona 0:9c2d61688e70 83 }
BorjaTarazona 0:9c2d61688e70 84
BorjaTarazona 0:9c2d61688e70 85 dd = 0;
BorjaTarazona 0:9c2d61688e70 86 while(1) { //Second bucle is to store the data in the buffer >mybuffer< until timeout
BorjaTarazona 0:9c2d61688e70 87 if(_serial.readable()) {
BorjaTarazona 0:9c2d61688e70 88 char c = _serial.getc();
BorjaTarazona 0:9c2d61688e70 89 mybuffer[dd++] = c;
BorjaTarazona 0:9c2d61688e70 90 }
BorjaTarazona 0:9c2d61688e70 91 if(timeCnt.read_ms() > timeout) { // time out
BorjaTarazona 0:9c2d61688e70 92 buffLen=dd;
BorjaTarazona 0:9c2d61688e70 93 break;
BorjaTarazona 0:9c2d61688e70 94 }
BorjaTarazona 0:9c2d61688e70 95 }
BorjaTarazona 0:9c2d61688e70 96 timeCnt.stop(); // stop timer
BorjaTarazona 0:9c2d61688e70 97 timeCnt.reset(); // clear timer
BorjaTarazona 0:9c2d61688e70 98 return 0;
BorjaTarazona 0:9c2d61688e70 99 }
BorjaTarazona 0:9c2d61688e70 100
BorjaTarazona 0:9c2d61688e70 101
BorjaTarazona 0:9c2d61688e70 102
BorjaTarazona 0:9c2d61688e70 103 char* ATSerial::waitForResp(int timeout)
BorjaTarazona 0:9c2d61688e70 104 {
BorjaTarazona 0:9c2d61688e70 105 timeCnt.start(); // Start timer
BorjaTarazona 0:9c2d61688e70 106 int co = 0;
BorjaTarazona 0:9c2d61688e70 107 char resp [300];// = " ";
BorjaTarazona 0:9c2d61688e70 108 while(timeCnt.read_ms() < timeout) { // Read until timeout
BorjaTarazona 0:9c2d61688e70 109 if(_serial.readable()) { // If there is data available
BorjaTarazona 0:9c2d61688e70 110 char dd = _serial.getc(); // Read serial port and save the data in a local buffer
BorjaTarazona 0:9c2d61688e70 111 resp[co++] = dd;
BorjaTarazona 0:9c2d61688e70 112 }
BorjaTarazona 0:9c2d61688e70 113 }
BorjaTarazona 0:9c2d61688e70 114 resp[co++] = '\0'; // Set end of string
BorjaTarazona 0:9c2d61688e70 115 timeCnt.stop(); // Stop timer
BorjaTarazona 0:9c2d61688e70 116 timeCnt.reset(); // Clear timer
BorjaTarazona 0:9c2d61688e70 117 return resp;
BorjaTarazona 0:9c2d61688e70 118 }
BorjaTarazona 0:9c2d61688e70 119
BorjaTarazona 0:9c2d61688e70 120 char* ATSerial::sendCmdAndWaitForResp(char *cmd, int timeout)
BorjaTarazona 0:9c2d61688e70 121 {
BorjaTarazona 0:9c2d61688e70 122 // Send command
BorjaTarazona 0:9c2d61688e70 123 sendCmd(cmd); //Sends the command in >cmd< to the sim900
BorjaTarazona 0:9c2d61688e70 124 return waitForResp(timeout); //Waits a >timeout< and reads from the serial,
BorjaTarazona 0:9c2d61688e70 125 }
BorjaTarazona 0:9c2d61688e70 126
BorjaTarazona 0:9c2d61688e70 127 void ATSerial::clearBuffer()
BorjaTarazona 0:9c2d61688e70 128 {
BorjaTarazona 0:9c2d61688e70 129 timeCnt.start(); // Start timer ";
BorjaTarazona 0:9c2d61688e70 130 while(timeCnt.read_ms() < 2000) { // Read until timeout
BorjaTarazona 0:9c2d61688e70 131 if(_serial.readable()) { // If there is data available
BorjaTarazona 0:9c2d61688e70 132
BorjaTarazona 0:9c2d61688e70 133 }
BorjaTarazona 0:9c2d61688e70 134 }
BorjaTarazona 0:9c2d61688e70 135 timeCnt.stop(); // Stop timer
BorjaTarazona 0:9c2d61688e70 136 timeCnt.reset(); // Clear timer
BorjaTarazona 0:9c2d61688e70 137
BorjaTarazona 0:9c2d61688e70 138 }
BorjaTarazona 0:9c2d61688e70 139
BorjaTarazona 0:9c2d61688e70 140 int ATSerial::getResponseLength(int timeout)
BorjaTarazona 0:9c2d61688e70 141 {
BorjaTarazona 0:9c2d61688e70 142 int dd=0;
BorjaTarazona 0:9c2d61688e70 143 timeCnt.start(); // Start timer ";
BorjaTarazona 0:9c2d61688e70 144 while(timeCnt.read_ms() < timeout) { // Read until timeout
BorjaTarazona 0:9c2d61688e70 145 if(_serial.readable()) { // If there is data available
BorjaTarazona 0:9c2d61688e70 146 dd++;
BorjaTarazona 0:9c2d61688e70 147 }
BorjaTarazona 0:9c2d61688e70 148 }
BorjaTarazona 0:9c2d61688e70 149 timeCnt.stop(); // Stop timer
BorjaTarazona 0:9c2d61688e70 150 timeCnt.reset(); // Clear timer
BorjaTarazona 0:9c2d61688e70 151 return dd;
BorjaTarazona 0:9c2d61688e70 152 }