Получение двух наборов строковых данных из Обработки в Arduino в две переменные - PullRequest
1 голос
/ 23 апреля 2020

Я отчаянно пытаюсь заставить arduino разделить строку из обработки на два набора переменных. В приведенном ниже коде я решил просто напечатать важные части, но x и y, конечно, содержат правильные значения. Любое решение будет оценено. Пока это две мои попытки:

Попытка 1 не работает вообще. 1. Обработка:

myPort.write(x + "," + y + "\n");

1.Arduino:

String tempX = Serial.readStringUntil(44);
String tempY = Serial.readStringUntil(10);
String x = tempX.substring(0,tempX.length() -1);
String y = tempY.substring(0,tempY.length() -1);

Попытка 2, где x работает правильно, но не y. 2. Обработка:

String [] dataToSend = new String [2];
dataToSend [0] = x;
dataToSend [1] = y;
String joinedData = join(dataToSend, ":");
myPort.write(joinedData);

2. Arduino:

String x  = Serial.readStringUntil(":");
Serial.read(); //next character is comma, so skip it using this
String y = Serial.readStringUntil('\0');

1 Ответ

1 голос
/ 23 апреля 2020

Во-первых, не беспокойтесь об их объединении на стороне обработки. Отправка двух строк одна за другой аналогична отправке одной длинной строки. Все это разбито на байты в последовательной строке, и никто не может сказать, где заканчивается одна строка печати и начинается следующая.

myport.write(x);
myport.write(',');
myport.write(y);
myport.write('\n')

будет работать так же хорошо.

Тогда на стороне Arduino вы, скорее всего, захотите уклониться от класса String. Читайте данные символ за символом в массив символов.

char myArray[howLongTheStringIs];
char x[howLongXIs];
char y[howLongYIs];
int index = 0;

Это вызывается снова и снова в l oop и собирает последовательные данные по мере их поступления:

while (Serial.available()){
  char c = Serial.read();
  myArray[index] = c;  // add c to the string
  myArray[++index] = 0;  // null terminate our string
  if(c == '\n'){  // if we are at the end of the string
    handleString();
  }
}

Затем у вас есть функция для анализа вашей строки. Есть много способов сделать это:

Если вы ничего не знаете о строках, кроме разделителя, используйте strtok:

void handleString(){
  char* ptr = strtok(myArray, ":");  // get up to the ":" from the string
  strcpy(x, ptr);  // copy into x
  ptr = strtok(NULL, "\n");  // get from the separator last time up to the next "\n"
  strcpy(y, ptr);  // copy into y
  index = 0         // reset our index and
  myArray[0] = 0;  // and clear the string
}

Все это не проверено, не скомпилировано и записано в поле для ответа. Так что, если я немного опечатался, пожалуйста, прости и исправь. Но что-то вроде этого должно работать. Если вы уже знаете точную длину строк (или можете отправить их из кода обработки), тогда метод handleString может быть проще. Если у вас есть что-то короткое, связанное с x и y, и после этого они вам не нужны, то, возможно, вы можете просто сохранить указатели на их расположение в myArray. Все зависит от того, какова цель вашего кода. Но как-то так должно получиться.

...