A Serial Interface for SIMCOM modules.
ATCommand.cpp@1:6f42bbd5eb48, 2017-08-10 (annotated)
- 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?
User | Revision | Line number | New 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 | } |