Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of ATParser by
Revision 16:8f98e042b9b4, committed 2017-05-22
- Comitter:
- Raffaello
- Date:
- Mon May 22 18:05:51 2017 +0000
- Parent:
- 15:c08984860329
- Child:
- 17:f395d107f15e
- Commit message:
- Fixed read string from buffer. Now "%s" works.; Added different initialization start delimiter
Changed in this revision
| ATParser.cpp | Show annotated file Show diff for this revision Revisions of this file |
| ATParser.h | Show annotated file Show diff for this revision Revisions of this file |
--- a/ATParser.cpp Fri Apr 22 13:40:54 2016 +0100
+++ b/ATParser.cpp Mon May 22 18:05:51 2017 +0000
@@ -178,8 +178,8 @@
}
// Finish with newline
- for (int i = 0; _delimiter[i]; i++) {
- if (putc(_delimiter[i]) < 0) {
+ for (int i = 0; _delimiter_send[i]; i++) {
+ if (putc(_delimiter_send[i]) < 0) {
return false;
}
}
@@ -200,7 +200,7 @@
int offset = 0;
while (response[i]) {
- if (memcmp(&response[i+1-_delim_size], _delimiter, _delim_size) == 0) {
+ if (memcmp(&response[i+1-_delim_size_close], _delimiter_close, _delim_size_close) == 0) {
i++;
break;
} else if (response[i] == '%' && response[i+1] != '%' && response[i+1] != '*') {
@@ -227,6 +227,7 @@
// We keep trying the match until we succeed or some other error
// derails us.
int j = 0;
+ _delim_check = 0;
while (true) {
// Recieve next character
@@ -242,24 +243,38 @@
sscanf(_buffer+offset, _buffer, &count);
// We only succeed if all characters in the response are matched
- if (count == j) {
- debug_if(dbg_on, "AT= %s\r\n", _buffer+offset);
- // Reuse the front end of the buffer
- memcpy(_buffer, response, i);
- _buffer[i] = 0;
+ if (count != -1)
+ {
+ if (j > count) {
+
+ if(c == _delimiter_close[_delim_check]) {
+
+ _delim_check++;
+
+ if(_delim_check == _delim_size_close) {
+
+ debug_if(dbg_on, "AT= %s\r\n", _buffer+offset);
+ // Reuse the front end of the buffer
+ memcpy(_buffer, response, i);
+ _buffer[i] = 0;
- // Store the found results
- vsscanf(_buffer+offset, _buffer, args);
+ // Store the found results
+ vsscanf(_buffer+offset, _buffer, args);
- // Jump to next line and continue parsing
- response += i;
- break;
+ // Jump to next line and continue parsing
+ response += i;
+ break;
+ }
+ } else {
+ _delim_check = 0;
+ }
+ }
}
// Clear the buffer when we hit a newline or ran out of space
// running out of space usually means we ran into binary data
if (j+1 >= _buffer_size - offset ||
- strcmp(&_buffer[offset + j-_delim_size], _delimiter) == 0) {
+ strcmp(&_buffer[offset + j-_delim_size_close], _delimiter_close) == 0) {
debug_if(dbg_on, "AT< %s", _buffer+offset);
j = 0;
--- a/ATParser.h Fri Apr 22 13:40:54 2016 +0100
+++ b/ATParser.h Mon May 22 18:05:51 2017 +0000
@@ -50,8 +50,11 @@
int _timeout;
// Parsing information
- const char *_delimiter;
- int _delim_size;
+ const char *_delimiter_send;
+ const char *_delimiter_close;
+ int _delim_size_send;
+ int _delim_size_close;
+ int _delim_check;
bool dbg_on;
public:
@@ -69,6 +72,7 @@
_buffer = new char[buffer_size];
setTimeout(timeout);
setDelimiter(delimiter);
+ setDelimiterSend(delimiter);
debugOn(debug);
}
@@ -94,11 +98,21 @@
* @param delimiter string of characters to use as line delimiters
*/
void setDelimiter(const char *delimiter) {
- _delimiter = delimiter;
- _delim_size = strlen(delimiter);
+ _delimiter_close = delimiter;
+ _delim_size_close = strlen(delimiter);
}
/**
+ * Sets string of characters to use as line delimiters
+ *
+ * @param delimiter string of characters to use as line delimiters
+ */
+ void setDelimiterSend(const char *delimiter) {
+ _delimiter_send = delimiter;
+ _delim_size_send = strlen(delimiter);
+ }
+
+ /**
* Allows echo to be on or off
*
* @param echo 1 for echo and 0 turns it off
