Go Down

Topic: Saving Serial.read() as a string, and splitting the string (Read 799 times) previous topic - next topic

Technicolor

Hi.
So I'm having a problem:
How do I save whatever I send to the serial as a string (as in String response = Serial.read() where the final result would be response == "Hi")?

And how do I split a string? For example, in Javascript, there is such thing as a var splitstring = response.split(" "); , but I can't find anything similar in Arduino. If there is a way, how do I do it?

PaulS

Quote
How do I save whatever I send to the serial as a string (as in String response = Serial.read()

Start with re-writing the HardwareSerial class so that Serial.read() returns a String.

The existing version does not. There are other methods in that class that do read more than one byte, IF there is something in the serial data stream that tells them when to stop reading.

None of them return a String though. And, there's a very good reason for that.

Quote
but I can't find anything similar in Arduino.

That's because Arduino is hardware. The software is C or C++. There are plenty of string handling functions in C, like strtok(). Of course, you need a string, not a String, to use them.

Graynomad

In a nutshell...

Do a loop that reads characters from the serial port and writes them into an array.

NULL terminate the "string" as you go.

When you have all the characters do something with them.

If you want a proper split() equivalent you'll have to write it yourself, however if you just want to chop the string into two or three pieces that's easy.

______
Rob
Rob Gray aka the GRAYnomad www.robgray.com

zoomkat

A simple example of capturing a string sent from the serial monitor and seperating the string into two parts.

Code: [Select]
// zoomkat 12-13-11 serial servo (2) test
// for writeMicroseconds, use a value like 1500
// for IDE 1.0
// Powering a servo from the arduino usually DOES NOT WORK.
// two servo setup with two servo commands
// send eight character string like 15001500 or 14501550
// use serial monitor to test

#include <Servo.h>
String readString, servo1, servo2;
Servo myservo1;  // create servo object to control a servo
Servo myservo2;

void setup() {
  Serial.begin(9600);
  myservo1.attach(6);  //the pin for the servo control
  myservo2.attach(7);
  Serial.println("two-servo-test-1.0"); // so I can keep track of what is loaded
}

void loop() {

  while (Serial.available()) {
    delay(3);  //delay to allow buffer to fill
    if (Serial.available() >0) {
      char c = Serial.read();  //gets one byte from serial buffer
      readString += c; //makes the string readString
    }
  }

  if (readString.length() >0) {
      Serial.println(readString); //see what was received
     
      // expect a string like 07002100 containing the two servo positions     
      servo1 = readString.substring(0, 4); //get the first four characters
      servo2 = readString.substring(4, 8); //get the next four characters
     
      Serial.println(servo1);  //print to serial monitor to see parsed results
      Serial.println(servo2);

      int n1 = servo1.toInt();
      int n2 = servo2.toInt();

      Serial.println("the numbers are :");
      Serial.println(n1);  //print to serial monitor to see number results
      Serial.println(n2);
           
      myservo1.writeMicroseconds(n1); //set servo position
      myservo2.writeMicroseconds(n2);
    readString="";
  }
}

Consider the daffodil. And while you're doing that, I'll be over here, looking through your stuff.   8)

Technicolor


A simple example of capturing a string sent from the serial monitor and seperating the string into two parts.

Code: [Select]
// zoomkat 12-13-11 serial servo (2) test
// for writeMicroseconds, use a value like 1500
// for IDE 1.0
// Powering a servo from the arduino usually DOES NOT WORK.
// two servo setup with two servo commands
// send eight character string like 15001500 or 14501550
// use serial monitor to test

#include <Servo.h>
String readString, servo1, servo2;
Servo myservo1;  // create servo object to control a servo
Servo myservo2;

void setup() {
  Serial.begin(9600);
  myservo1.attach(6);  //the pin for the servo control
  myservo2.attach(7);
  Serial.println("two-servo-test-1.0"); // so I can keep track of what is loaded
}

void loop() {

  while (Serial.available()) {
    delay(3);  //delay to allow buffer to fill
    if (Serial.available() >0) {
      char c = Serial.read();  //gets one byte from serial buffer
      readString += c; //makes the string readString
    }
  }

  if (readString.length() >0) {
      Serial.println(readString); //see what was received
     
      // expect a string like 07002100 containing the two servo positions     
      servo1 = readString.substring(0, 4); //get the first four characters
      servo2 = readString.substring(4, 8); //get the next four characters
     
      Serial.println(servo1);  //print to serial monitor to see parsed results
      Serial.println(servo2);

      int n1 = servo1.toInt();
      int n2 = servo2.toInt();

      Serial.println("the numbers are :");
      Serial.println(n1);  //print to serial monitor to see number results
      Serial.println(n2);
           
      myservo1.writeMicroseconds(n1); //set servo position
      myservo2.writeMicroseconds(n2);
    readString="";
  }
}



Okay, two issues with that.
For one, when I do that, the first character of the 'string' starts out with a strange number/symbol/thing. I will try your example, and will post pic if it does it again with that example.
Second, I want it to split conditionally, and wherever I want it to split (for example, I want to send "Hi. My name's | Billy Bob" and "My friend is | Jilly Joe", and the code will separate both strings into four arrays: "Hi. My name's " and " Billy Bob", and as for the other string "My friend is " and " Jilly Joe". Do you know what I mean? I don't know EXACTLY where to split the string, so I want the code to do that for me.

Go Up