I need to clear my string I tried putting serial.read() on several locations or '""' (putting it blank ). But the first character I sent my program remembers , it never changes when I sent other characters
For Example : I sent V,123 and then A,123 It will always return me the first character I got wich in this example is "V". For the axis this is no problem there it does overwrite the old axis value.
So it must be a clear buffer problem ... How do I solve this ?
Using :
Arduino uno
#define E1 10 // Enable Pin for motor 1
#define E2 11 // Enable Pin for motor 2
#define I1 8 // Control pin 1 for motor 1 for L293D it changes the direction of the motor
#define I2 9 // Control pin 2 for motor 1 for L293D it changes the direction of the motor
#define I3 12 // Control pin 1 for motor 2 for L293D it changes the direction of the motor
#define I4 13 // Control pin 2 for motor 2 for L293D it changes the direction of the motor
String Richting; // Direction
int Axis; // Numbers (the speed I want to set on the motors)
const byte numChars = 32;
char receivedChars[numChars]; // an array to store the received data
boolean newData = false;
void setup() {
Serial.begin(2400);
pinMode(13, OUTPUT);
pinMode(E1, OUTPUT);
pinMode(E2, OUTPUT);
pinMode(I1, OUTPUT);
pinMode(I2, OUTPUT);
pinMode(I3, OUTPUT);
pinMode(I4, OUTPUT);
Serial.println("<Arduino is ready>");
}
void loop() {
if (recievedMessage())
{
parseMessage();
Calculation();
showNewMessage();
}
}
bool recievedMessage() {
static byte ndx = 0;
char endMarker = '\n';
char rc;
while (Serial.available() > 0 && newData == false) {
rc = Serial.read();
if (rc != endMarker) {
receivedChars[ndx] = rc;
ndx++;
Richting = receivedChars[1];
if (ndx >= numChars) {
ndx = numChars - 1;
}
}
else {
receivedChars[ndx] = '\0'; // terminate the string
ndx = 0;
newData = true;
return true;
}
}
return false;
}
void showNewMessage() {
if (newData == true) {
Serial.println(Richting);
newData = false;
}
}
void parseMessage()
{
strtok(receivedChars, ",");
Axis = atoi(strtok(NULL, ","));
}
void Calculation()
{
if (Richting = "A") {
analogWrite(E1, Axis * 2);
analogWrite(E2, Axis * 2);
digitalWrite(I1, HIGH);
digitalWrite(I2, LOW);
digitalWrite(I3, HIGH);
digitalWrite(I4, LOW);
}
}
I need to clear my string I tried putting serial.read() on several locations or '""' (putting it blank ). But the first character I sent my program remembers , it never changes when I sent other characters
For Example : I sent V,123 and then A,123 It will always return me the first character I got wich in this example is "V". For the axis this is no problem there it does overwrite the old axis value.
So it must be a clear buffer problem ... How do I solve this ?
This will zero-out/clear the whole array to zero-bytes:
memset(receivedChars,0,sizeof(receivedChars));
After doing so, then length of the string is 0 with a finalizing '\0' character (nullterminated string with zero length).In fact, ALL positions of the array will contain zero-bytes.
I never mind I see what you mean , you are talking about richting my bad ... Yes Because before every full string I sent char 22 wich is a sync if you look in the ascii-table. So a full string would be char 22 + direction + ","+axis+char 13 +char 10 that's why.
arduarn:
Weren't you already warned about this in a previous thread?
LOL, and these:
line 10: String Richting; // Direction
line 19: pinMode(13, OUTPUT);
line 51: Richting = receivedChars[1];
line 70: Serial.println(Richting);
line 84: if (Richting="V"){
I even provided the complete sketch:
#define E1 10 // Enable Pin for motor 1
#define E2 11 // Enable Pin for motor 2
#define I1 8 // Control pin 1 for motor 1 for L293D it changes the direction of the motor
#define I2 9 // Control pin 2 for motor 1 for L293D it changes the direction of the motor
#define I3 12 // Control pin 1 for motor 2 for L293D it changes the direction of the motor
#define I4 13 // Control pin 2 for motor 2 for L293D it changes the direction of the motor
int Axis; // Numbers (the speed I want to set on the motors)
const byte numChars = 75;
char receivedChars[numChars]; // an array to store the received data
boolean newData = false;
void setup() {
Serial.begin(2400);
// pinMode(13, OUTPUT); <-- This is the same as I4!
pinMode(E1, OUTPUT);
pinMode(E2, OUTPUT);
pinMode(I1, OUTPUT);
pinMode(I2, OUTPUT);
pinMode(I3, OUTPUT);
pinMode(I4, OUTPUT);
Serial.println("<Arduino is ready>");
}
void loop() {
if (recievedMessage())
{
parseMessage();
Calculation();
showNewMessage();
}
}
bool recievedMessage() {
static byte ndx = 0;
while (Serial.available()) {
char rc = Serial.read();
if (rc >= ' ') { // Not a CR orLF
if (ndx < numChars) { // if there's room...
receivedChars[ndx] = rc; // ... save another char
ndx++;
}
} else if (ndx > 0) { // not an empty string
receivedChars[ndx] = '\0'; // terminate the string
ndx = 0;
newData = true;
return true;
}
}
return false;
}
void showNewMessage() {
if (newData) {
Serial.print("De richting=");
Serial.println(receivedChars);
Serial.print("De snelheid=");
Serial.println(Axis);
newData = false;
}
}
void parseMessage()
{
strtok(receivedChars, ",");
Axis = atoi(strtok(NULL, ","));
}
void Calculation()
{
if ( strcmp( receivedChars, "V" ) == 0 ){
digitalWrite(I4,HIGH); // <-- use I4, not 13
analogWrite(E1,255);
}
}
But he said he didn't need it because "it just worked suddenly."