0

I'm trying to read a string like this one:

2;12;42;43;34

over a serial connection and split this string afterwards by a ";". So the output would be this array:

(2,12,42,34)

All the stuff runs on an arduino uno. So I made some code:

String read_input;
char read_input_char[20];
char *read_values;
void setup() {
 Serial.begin(9600);
 Serial.setTimeout(10);
}
void loop() {
 if(Serial.available()){
 read_input = Serial.readString();
 read_input.toCharArray(read_input_char, 20);
 read_values = strtok(read_input_char, ";");
 Serial.println(read_values[2]);
 }
}

However now instead of outputting the 3rd array element it outputs only an '1'. What's wrong?

asked May 10, 2016 at 17:22
1
  • strtok() doesn't do that. And the characters available to Serial.readstring() may not have the full string in the buffer when loop() first calls it. Commented May 10, 2016 at 17:51

2 Answers 2

2

This is a C question, not an arduino question, but anyway:

From the man page:

DESCRIPTION
 The strtok() function breaks a string into a sequence of zero or more nonempty tokens. On the first call to strtok() the
 string to be parsed should be specified in str. In each subsequent call that should parse the same string, str must be
 NULL.

You are only calling strtok() once, so it only parses the first value. You need to keep calling it until there is nothing left to parse.

answered May 10, 2016 at 17:50
1

Your code as is checks for a non-empty Serial buffer (the Serial.available() bit), and then reads it all into a String. Be careful doing this, as if this happens to execute part-way through the data arriving, you will get a partial data String. This may be cut off part way through one of your integers.

Also, the String object is very memory-intensive. Maybe not an issue for you, but try to use char arrays, or read directly from the Serial buffer.

In your case, there is a great function that you could use; parseInt().

Details are at; https://www.arduino.cc/en/Serial/ParseInt

More or less, this reads successive chars from the serial buffer, and once digits are encountered, forms an int. This continues until a non-digit char, or a (configurable) timeout. Something like this might do the job for you;

int data[10]; // Or however long you need it to be!
int arrayPointer = 0;
void setup() {
 Serial.begin(9600);
 Serial.setTimeout(10);
}
void loop() {
 if (Serial.available()) {
 int incomingInt = Serial.parseInt();
 Serial.println(incomingInt);
 data[arrayPointer] = incomingInt;
 arrayPointer++;
 }
}

Hope this helps!

answered May 11, 2016 at 17:25

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.