Как правильно разделить входящие данные, используя indexOf ()? - PullRequest
0 голосов
/ 25 октября 2018

Я создал графический интерфейс пользователя с помощью обработки 3.3.7 на моем ПК.Микроконтроллер постоянно публикует данные через COM8 в виде

angle,distance.mindistance

, за которым следует новая строка.Я написал простой код на микроконтроллере, который циклически перебирает массив данных, чтобы убедиться, что графический интерфейс работает правильно.

Код, который запускается при обработке

  1. , считывает входящие данные вплоть до символа новой строки
  2. находит индекс "," и "."
  3. присвойте что-либо между позицией "0" и индексом "," переменной angle
  4. , присвойте что-либо между индексом "," и индексом "." переменной distance
  5. присвойте переменной с индексом "." и концом данных mindistance
  6. , выполните дальнейшую обработку и визуализируйте в графическом интерфейсе.

Проблема в том, что mindistance всегда присваивается 0, что указывает на проблему с шагом 5:

См. void serialEvent (Serial myPort) {}

, но angle и distanceотображаются правильно.

Соответствующие разделы моего кода следующие:

import processing.serial.*; // imports library for serial communication
import java.awt.event.KeyEvent; // imports library for reading the data from the serial port
import java.io.IOException;

Serial myPort; // defines Object Serial

String angle="";
String distance="";
String mindistance = "";
String data="";
String noObject;
float pixsDistance, pixsMinDist;
int iAngle, iDistance, iMinDistance;
int index1=0;
int index2=0;
PFont orcFont;
int linefeed = 10; // new line ASCII = 10

void setup() {

  size (1600, 900);
  smooth();
  myPort = new Serial(this, "COM8", 115200); // starts the serial communication
  myPort.bufferUntil(linefeed); //reads the data from the serial port up to the character 'n'. So actually it reads this: angle,distance.mindistance
  orcFont = loadFont("OCRAExtended-30.vlw");
}

void serialEvent (Serial myPort) { // starts reading data from the Serial Port
  // reads the data from the Serial Port up to the character 'n' and puts it into the String variable "data".
  data = myPort.readStringUntil(linefeed);
  data = data.substring(0, data.length()-1);

  index1 = data.indexOf(","); // find the character ',' and puts it into the variable "index1"
  index2 = data.indexOf(".");  // https://processing.org/reference/String_indexOf_.html
  angle= data.substring(0, index1); // read the data from position "0" to to the index of "."
  distance= data.substring(index1+1, index2); // read the data between index of "," and index of "."
  mindistance = data.substring(index2+1, data.length()); // read the data from index of "." to the end of the data

  // converts the String variables into Integer
  iAngle = int(angle);
  iDistance = int(distance);
  iMinDistance = int(mindistance);
}

void drawObject() {// limiting the range to 400 cm
    // some more code here
}

--- EDIT ---

Я обнаружил, что mindistance назначается с правильным значением (например, 40), но когда строка преобразуется в целое число iMinDistance = int(mindistance);, iMinDistance становится 0.

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

В дополнение к тому, что вы уже выяснили, вы можете рассмотреть возможность использования удобных функций, которые Processing предлагает для разбора строки.

Например, вы можете использовать функцию splitTokens() для разделения вашей исходной строки на отдельныеценности.Вы можете узнать больше в справке , но вот базовый пример:

String incomingString = "45,10.7";

String[] tokens = splitTokens(incomingString, ",.");
int angle = int(tokens[0]);
int distance = int(tokens[1]);
int minDistance = int(tokens[2]);

println("angle: " + angle);
println("distance: " + distance);
println("minDistance: " + minDistance);

(Примечание: это тот пример программы, о которой мы говорим, когда упоминаем MCVE.)

Вы можете дополнительно использовать функцию trim() для устранения любых лишних пробельных символов:

String incomingString = "  45  ,   10   .   7   ";

String[] tokens = splitTokens(incomingString, ",.");
int angle = int(trim(tokens[0]));
int distance = int(trim(tokens[1]));
int minDistance = int(trim(tokens[2]));

println("angle: " + angle);
println("distance: " + distance);
println("minDistance: " + minDistance);

Как всегда, ссылка - ваш лучший друг.

0 голосов
/ 25 октября 2018

Я обнаружил, что mindistance назначено правильное значение (например, 40), но когда строка преобразуется в целое число iMinDistance = int(mindistance);, iMinDistance становится 0.

Это происходит потому, что строка, присвоенная mindistance, на самом деле не конвертируется в int, т. Е. За ней, вероятно, следует пробел или новая строка.Таким образом, для индекса mindistance.

необходимо изменить индекс на один конец меньше, чем конец данных.

mindistance = data.substring(index2+1, data.length()-1);
...