0

I'm trying to send an array back and forth between Processing and an Arduino UNO. But I think data is being lost along the way. I simply iterate over the array in Processing and send the Values separately. A new set of data is indicated by the character <. On the Arduino the data gets added to a string and sent back for testing. When I print out the string in processing, some data changed to -1.

The array contains {1,2,3,4,5,6,7,8}

The Output looks like this:

12345678
12345678
1234年1月1日-1-1
12345678
12345-1-1-1

Is there something I'm missing in terms of implementation, or is this simply a hardware related problem (like slightly different clock speeds)? Is there any way to improve this?

Arduino Sketch:

int srr[8];
int content; // Data received from the serial port
void setup() {
 Serial.begin(9600); // Start serial communication at 9600 bps
}
 void loop() {
 String str = "val:";
 int test;
 if (Serial.available()){ // If data is available to read,
 content = Serial.read();
 }
 if (content == 60){
 for(int i=0; i<=7; i++)
 {
 str+=Serial.read();
 }
 Serial.println(str);
 }
}

Processing

Serial myPort; // Create object from Serial class
int arr[]={1,2,3,4,5,6,7,8}; //The array to send
String str;
void setup() 
{
 size(200,200); //make our canvas 200 x 200 pixels big
 String portName = Serial.list()[0];
 myPort = new Serial(this, portName, 9600);
}
void draw() {
 //write
 myPort.write("<");
 for (int i =0; i<=7;i++){
 myPort.write(arr[i]);
 }
 //read
 if ( myPort.available() > 0){ // If data is available,
 str = myPort.readStringUntil('\n'); // read it and store it in val
 println(str); //print it out in the console
 } 

}

James Waldby - jwpat7
8,9203 gold badges20 silver badges33 bronze badges
asked Jun 16, 2015 at 20:23

1 Answer 1

1

Ok, let's look at your Arduino program a bit at a time (for that is where the problem lies).

if (Serial.available()) { // If data is available to read,
 content = Serial.read();
}

If there is at least one character available in the buffer then read one character into the variable content.

if (content == 60) {

If the variable content is 60 (better to use '>' so you can see what it is), then ...

 for(int i=0; i<=7; i++) {
 str+=Serial.read();
 }

... read 8 characters from the serial buffer whether there are any characters in there or not.

That last bit is the crunch point. You have an unknown number of characters in the buffer. You had at least one, and that one you read into content. You don't then check to see if there are the required 8 more characters available (or wait in each iteration of the loop for each character to actually arrive) before trying to read that character in.

If you take a moment to read the documentation on Serial Read you will see this:

Returns

the first byte of incoming serial data available (or -1 if no data is available) - int

The simplest fix is just to make your loop blocking so it waits for a character to arrive before reading it:

for(int i=0; i<=7; i++) {
 while (!Serial.available()); // Wait for a character to arrive
 str+=Serial.read(); // Read it
}
answered Jun 16, 2015 at 23:26

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.