Seattle, WA USA
Online
Brattain Member
Karma: 314
Posts: 35512
Seattle, WA USA
|
 |
« Reply #15 on: February 06, 2013, 08:57:09 am » |
Will that work? No. A string is terminated by a NULL ('\0'), not a line feed ('\r').
|
|
|
|
|
Logged
|
|
|
|
|
Seattle, WA USA
Online
Brattain Member
Karma: 314
Posts: 35512
Seattle, WA USA
|
 |
« Reply #16 on: February 06, 2013, 09:07:03 am » |
EUREKA!!! Keep in mind that you need to provide a large enough array to hold what the user typed, and that that may be more than 8 bytes.
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 32
|
 |
« Reply #17 on: February 06, 2013, 09:31:11 am » |
EUREKA!!! Keep in mind that you need to provide a large enough array to hold what the user typed, and that that may be more than 8 bytes. jajaja I found out about this already the hard way, with this code if I enter 123456789 I receive back two lines, 1st: 12345678 and 2nd: 92345678 so it overwrites the array. char Name[9]; // My Data array
void setup() { Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for Leonardo only } Serial.println("Please Enter your Name: "); } void loop() { while (!Serial.available()); // Wait for characters Serial.readBytes(Name, 8); Serial.println(Name); }
Is there a way to avoid overwriting? ... not sure if I should go back to the other suggestions.
|
|
|
|
|
Logged
|
|
|
|
|
Seattle, WA USA
Online
Brattain Member
Karma: 314
Posts: 35512
Seattle, WA USA
|
 |
« Reply #18 on: February 06, 2013, 10:05:35 am » |
Is there a way to avoid overwriting? Yes, and no. The signature for the readBytes() method is: size_t readBytes( char *buffer, size_t length); // read chars from stream into buffer // terminates if length characters have been read or timeout (see setTimeout) // returns the number of characters placed in the buffer (0 means no valid data found)
So, you know how many bytes were received. You can NULL terminate the array after that number of characters. That would make the output you saw "12345678" and "9". I think a better approach is to use readBytesUntil() and send an EXPLICIT end of packet marker (the Serial Monitor can do that automatically). Then, simply check the number of bytes received.
|
|
|
|
|
Logged
|
|
|
|
|
UK
Offline
Tesla Member
Karma: 89
Posts: 6388
-
|
 |
« Reply #19 on: February 06, 2013, 10:06:39 am » |
Is there a way to avoid overwriting? ... not sure if I should go back to the other suggestions.
Some code posted earlier showed how to read characters one by one and append them to the array, incrementing an index variable that held the length of the string received so far. All you need to do is add a check that the array is not already full, before you append another character to the string. if (Serial.available()>0) { inChar = Serial.read(); if(index < 7) { Name[index++] = inChar; // Store it Name[index] = 0; // append null-terminator // ... etc } else { // buffer is already full - discard the character } }
|
|
|
|
|
Logged
|
|
|
|
|
Denmark
Offline
God Member
Karma: 19
Posts: 683
|
 |
« Reply #20 on: February 06, 2013, 10:41:54 am » |
Name[index] = 0; // append null-terminator Should it not be: ? Name[index]='\0';
|
|
|
|
|
Logged
|
|
|
|
|
North Queensland, Australia
Offline
Edison Member
Karma: 31
Posts: 1187
|
 |
« Reply #21 on: February 06, 2013, 10:52:56 am » |
They are equivalent. ASCII for null is 0
|
|
|
|
|
Logged
|
|
|
|
|
East Anglia (UK)
Online
Edison Member
Karma: 48
Posts: 1411
May all of your blinks be without delay
|
 |
« Reply #22 on: February 06, 2013, 11:03:21 am » |
To prove it, try this char myChars[] = "1234567890";
void setup() { Serial.begin(9600); output();
myChars[7] = '\0'; output();
myChars[5] = 0; output(); }
void loop() { }
void output() { Serial.println(myChars); for (int i = 0;i <= 10;i++) { Serial.println(myChars[i],HEX); } Serial.println(); }
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 32
|
 |
« Reply #23 on: February 06, 2013, 11:27:47 am » |
Back to the original problem... I almost got it. I still have a couple of questions (below!); Here's the code: char Name[9] = ""; // My Data array char inChar; // Where to store the character read byte index = 0; // Index into array; where to store the character
void setup(){
Serial.begin(9600);
}
void loop(){ if (Serial.available()>0){ inChar = Serial.read(); Name[index] = inChar; // Store it if (index>8){ Serial.println("Invalid Input, please enter 3 to 8 characters"); index=-1; memset(Name, 0, sizeof(Name)); } else if (int(Name[index])==13){ //If Carriage return has been reached Serial.println(Name); index=-1; Name[9] = '\0'; memset(Name, 0, sizeof(Name)); } index++; // Increment where to write next } }
If I insert any string from 1 to 8 chars it works perfectly, else: - 9 chars - println the error message - GREAT!
- >9 chars - sometimes prints error message twice (more than 20 chars) or error message + modulos 10 (that is the 11th, 12th, 13th... chars) - I don't get why? or how to avoid?
Thanks for your help so far!!
|
|
|
|
|
Logged
|
|
|
|
|
Seattle, WA USA
Online
Brattain Member
Karma: 314
Posts: 35512
Seattle, WA USA
|
 |
« Reply #24 on: February 06, 2013, 11:42:23 am » |
Name[9] = '\0'; For an array of 9 elements, what are the valid index values? Hint: 9 is not one of them.
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 32
|
 |
« Reply #25 on: February 06, 2013, 11:54:16 am » |
Name[9] = '\0'; For an array of 9 elements, what are the valid index values? Hint: 9 is not one of them. array of 9 elements = 8 valid values. right? I don't really get what you're suggesting?
|
|
|
|
|
Logged
|
|
|
|
|
UK
Offline
Tesla Member
Karma: 89
Posts: 6388
-
|
 |
« Reply #26 on: February 06, 2013, 11:58:06 am » |
array of 9 elements = 8 valid values. right?
No. The first element is array[0]. Count up to nine elements and see which index values you used.
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 32
|
 |
« Reply #27 on: February 06, 2013, 12:09:12 pm » |
array of 9 elements = 8 valid values. right?
No. The first element is array[0]. Count up to nine elements and see which index values you used. According to your explanation, there would be 10. But according to http://arduino.cc/en/Reference/Array int mySensVals[6] = {2, 4, -8, 3, 2}; char message[6] = "hello";
so there are 5 values in the first and 5 letters in the second. I still don't get your point?... with my code loaded... press a key and hold until 20 or more chars have appeared in the dialog and then press enter... the error message appears several times and sometimes other chars bellow...
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Sr. Member
Karma: 7
Posts: 389
|
 |
« Reply #28 on: February 06, 2013, 12:14:35 pm » |
lets look at index vs character position:
Index Char position 0 1 (first character) 1 2 2 3 3 4 4 5 6 7 7 8 (last character) 8 9 (nul goes here at arry[8]
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 32
|
 |
« Reply #29 on: February 06, 2013, 12:58:50 pm » |
- INPUT: "1" ; OUTPUT: "1"
- INPUT: "12345" ; OUTPUT: "12345"
- INPUT: "12345678" ; OUTPUT: "12345678"
- INPUT: "123456789" ; OUTPUT: "Invalid Input, please enter 3 to 8 characters"
- INPUT: "12345678901" ; OUTPUT: Blank line, "Invalid Input, please enter 3 to 8 characters" & line with "1"
- INPUT: "123456789012" ; OUTPUT: Blank line, "Invalid Input, please enter 3 to 8 characters" & line with "12"
- INPUT: "012345678901234567890123" ; OUTPUT: "Invalid Input, please enter 3 to 8 characters" twice& line with "0123"
I would love to have just the ERROR ONCE. Any ideas, please!!!!
|
|
|
|
|
Logged
|
|
|
|
|
|