I receive strings over the serial port like so:
VLT=53.0, AMP=-30.2, AHR=-10, SOC=98, TMP=136, STS=192
I want to reduce the use of string functions with the idea of dropping all non-digits, keeping numbers dot and comma, to get this:
53.0,-30.2,-10,98,136,192
in an array and simple read [0], [1], etc.
Regular expressions would be idea, but do not exist like in PERL. Any hint would be much appreciated.
Relevant code used:
char inByte = SerialPortOne.read(); // read byte
strRecordIn.concat(inByte); // add byte to receive buffer
for (int i = 0; i <= 3; i++) { // VLT, AMP, AHR, SOC
strWord = getValue(strRecordIn, ',', i); // get data item from RecordIn array
strWord.remove(0, 4); // remove field identifier (1st 3 char plus =)
strRecordOut += ','; // add delimiter
strRecordOut += strWord; // add value
strWord = ""; // reset strWord
}
Ideally:
char inByte = SerialPortOne.read(); // read byte
if (inByte = [%d.,]+) {
strRecordIn.concat(inByte); // add byte to receive buffer
}
1 Answer 1
If you just want to remove the letters:
#include <ctype.h>
char inByte = SerialPortOne.read(); // read byte
if (!isalpha(inByte)) { // not letter
strRecordIn.concat(inByte); // add byte to receive buffer
}
Or you may test it for isdigit()
and explicitly compare to ','
and
'.'
:
if (isdigit(inByte) || inByte == '.' || inByte == ',') {
strRecordIn.concat(inByte); // add byte to receive buffer
}
C.f. the documentation of <ctype.h>.
-
Brilliant! I got lots to learn in this Arduino environment. Thank you!MaxG– MaxG04/14/2016 12:30:48Commented Apr 14, 2016 at 12:30
-
@MaxG: Well, in this case it's standard C, not specific to Arduino.Edgar Bonet– Edgar Bonet04/14/2016 12:36:29Commented Apr 14, 2016 at 12:36