Arduino Serial Communication to Array

Hello,
I programmed a simple WPF Form program which sends data over to the arduino which should extract the data from the string with sscanf and store it in an array. My current code looks like this:

#include <AccelStepper.h>

AccelStepper stepperZHohe(1, 2, 5);
AccelStepper stepperZDrehung(1, 3, 6);
AccelStepper stepperGelenk1(1, 4, 7);
AccelStepper stepperGelenk2(1, 12, 13);

int Data[3];
int SerialData[3];

void ReceiveSerialData()
{
  while(Serial.available() > 0){}

  char string[32];
  char byteRead;

  int availableBytes = Serial.available();
  for(int i=0; i<availableBytes; i++)
  {
    string[i] = Serial.read();
  }

  int result[3];
  sscanf(string, "%f,%f,%f,%f", &result[0], &result[1], &result[2], &result[3]);
  result[3] = Data[3];
}

void setup()
{  
  stepperZHohe.setMaxSpeed(10000);
  stepperZHohe.setSpeed(10000);
  stepperZHohe.setAcceleration(10000);

  stepperZDrehung.setMaxSpeed(10000);
  stepperZDrehung.setSpeed(10000);
  stepperZDrehung.setAcceleration(10000);

  stepperGelenk1.setMaxSpeed(10000);
  stepperGelenk1.setSpeed(10000);
  stepperGelenk1.setAcceleration(10000);

  stepperGelenk2.setMaxSpeed(10000);
  stepperGelenk2.setSpeed(10000);
  stepperGelenk2.setAcceleration(10000);

  Serial.begin(115200);
  Serial.println("ONLINE");
}

void moveTo(int ZHohe, int ZDrehung, int Gelenk1, int Gelenk2)
{
  stepperZHohe.moveTo(ZHohe);
  stepperZDrehung.moveTo(ZDrehung);
  stepperGelenk1.moveTo(Gelenk1);
  stepperGelenk2.moveTo(Gelenk2);
}

void loop()
{
  ReceiveSerialData();
  moveTo(Data[0], Data[1], Data[2], Data[3]);
  stepperZHohe.run();
  stepperZDrehung.run();
  stepperGelenk1.run();
  stepperGelenk2.run();
}

The data format looks like this: val1, val2, val3, val4 and I want an array which looks like this [val1, val2, val3, val4]. How can I achieve that?

I would suggest to study Serial Input Basics to handle this

the way you read the Serial input is error prone

Hi @finn433,

Yeah, hard to understand the recv code but the array below needs to be 4 not 3??

give this a try..
rewrote the recving code and i've increased the array..

seems to work..

#include <AccelStepper.h>

AccelStepper stepperZHohe(1, 2, 5);
AccelStepper stepperZDrehung(1, 3, 6);
AccelStepper stepperGelenk1(1, 4, 7);
AccelStepper stepperGelenk2(1, 12, 13);

int Data[4];
int SerialData[4];

char buff[10];
byte commaCount = 0;
byte recvCount = 0;

bool RecvData() {
  bool result = false;
  int tmpInt = -1;
  if (Serial.available()) {
    byte abyte = Serial.read();
    switch (abyte) {
      case 10: if (commaCount == (sizeof(Data) / sizeof(Data[0])) - 1) {
          tmpInt = atoi(buff);
          if (tmpInt > -1) {
            Data[commaCount] = tmpInt;
          } else {
            //error in conversion??
            Data[commaCount] = 0;
          }
          result = true;
        }
        commaCount = 0;
        recvCount = 0;
        memset(buff, 0, sizeof(buff));
        break;//newline
      case 44: if (commaCount < (sizeof(Data) / sizeof(Data[0]))) {
          tmpInt = atoi(buff);
          if (tmpInt > -1) {
            Data[commaCount] = tmpInt;
          } else {
            //error in conversion??
            Data[commaCount] = 0;
          }
          commaCount++;
          recvCount = 0;
          memset(buff, 0, sizeof(buff));
        }
        break;//comma
      default: if (recvCount < sizeof(buff)) {
          buff[recvCount] = abyte;
          recvCount++;
        }
        break;
    }
  }
  return result;
}

void ReceiveSerialData()
{
  while (Serial.available() > 0) {}

  char string[32];
  char byteRead;

  int availableBytes = Serial.available();
  for (int i = 0; i < availableBytes; i++)
  {
    string[i] = Serial.read();
  }

  int result[3];
  sscanf(string, "%f,%f,%f,%f", &result[0], &result[1], &result[2], &result[3]);
  result[3] = Data[3];
}

void setup()
{
  stepperZHohe.setMaxSpeed(10000);
  stepperZHohe.setSpeed(10000);
  stepperZHohe.setAcceleration(10000);

  stepperZDrehung.setMaxSpeed(10000);
  stepperZDrehung.setSpeed(10000);
  stepperZDrehung.setAcceleration(10000);

  stepperGelenk1.setMaxSpeed(10000);
  stepperGelenk1.setSpeed(10000);
  stepperGelenk1.setAcceleration(10000);

  stepperGelenk2.setMaxSpeed(10000);
  stepperGelenk2.setSpeed(10000);
  stepperGelenk2.setAcceleration(10000);

  Serial.begin(115200);
  Serial.println(sizeof(Data) / sizeof(Data[0]));
  Serial.println("ONLINE");
}

void moveTo(int ZHohe, int ZDrehung, int Gelenk1, int Gelenk2)
{
  stepperZHohe.moveTo(ZHohe);
  stepperZDrehung.moveTo(ZDrehung);
  stepperGelenk1.moveTo(Gelenk1);
  stepperGelenk2.moveTo(Gelenk2);
}

void loop()
{
  //ReceiveSerialData();
  if (RecvData()) {
    moveTo(Data[0], Data[1], Data[2], Data[3]);
    stepperZHohe.run();
    stepperZDrehung.run();
    stepperGelenk1.run();
    stepperGelenk2.run();
  }

}

good luck.. ~q

1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.