I am using an array declared at the start of the function to store chars from Serial.read() until I reach the specified control char.
char collector[4];
I process that input and then attempt to reinitialize the array to clear out old values:
collector[4];
Doesn't work - -previous values remain. I resorted to walking through the array (below) but that doesn't seem right- though it works. Is there another way to do it?
--tx Roy
If you're declaring it at the top of a function, the storage class is automatic, you're not initialising it at all, and it is dangerous to assume any contents.
collector[4];
Does absolutely nothing useful apart from evaluating the non-existent fifth element of the array "collector", and then discarding the result of the evaluation.
Can you post the rest of your code to see how best to help you?
thanks for the comments. I guess it makes sense that my line: collector[4] doesn't do anything since there isn't any assignment but it didn't throw an error either. I did try redeclaring the array with null values
collector = {'/0','/0','/0','/0'}
but that didn't work. Hadn't occurred to me to step a null char through the array. Anyway, I was confused @ there not being a way to just blast out the existing values and reset the array to all null values.
fwiw - I'm using that array and atoi (getColor() function) to read in numbers in the range of 0..1024. Tried using bitshifting an bit OR but couldn't get it to work.
//// Serial Test: receiving large numbers
int RGB[3];
char state = 'i';
void setup() {
Serial.begin(9600);
Serial.println("ok");
}
void loop(){
switch (state){
case 'i':
getColor();
break;
case 'c':
state = 'i';
/// use new color
Serial.print(RGB[0]);
Serial.print(" ");
Serial.print(RGB[1]);
Serial.print(" ");
Serial.print(RGB[2]);
Serial.println(" ");
break;
}
}
int getColor(){
if (Serial.available()){
int position = 0;
char collector[4];
char c;
int counter = 0;
while(true){
if (Serial.available()){
c = Serial.read();
if (c == ',' || c =='*'){
int n = atoi(collector); //convert to number
Serial.println(n);
RGB[position] = n; //store
position++; //increment array index
if (c == '*') {
state = 'c';
break;
}
for(int i = 0; i < 4; i++){
collector[i] = ' ';
}
counter = 0; //reset char array index
}
else{
collector[counter] = c;
counter++;
}
}
}
}
}
I resorted to walking through the array (below) but that doesn't seem right
This is essentially the only way to do it, though of course it will look prettier if you write a function to do it, or use one of the standard ones.
See memset(), bzero(), etc (probably in avrlib rather than the arduino documentation. memset() is part of the C standard...
Note that even if the arduino language accepted a syntax like "collector- = ' ';" (just to pick something random), it would be executing the same sort of loop anyway, and it wouldn't be any faster...