Обработка не обновляет массив последовательными данными - PullRequest
1 голос
/ 10 января 2020

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

Устройство имеет два HCSR04, размещенных вплотную и сервопривод, который вращается от 0 до 179 и обратно в 0, Arduino отправляет данные «Угол, Расстояние_1, Расстояние_2» по последовательному порту, и Обработка получает их без проблем. Вы можете увидеть данные, полученные и проанализированные в последовательной консоли, используя строки "

print(serialdata[0]);
 print("   ");
 print(serialdata[1]);
 print("   ");
 print(serialdata[2]);

"

, где serialdata [0] принимает угол, serialdata [1] первое расстояние и serialdata [2] второе расстояние, поэтому данные принимаются правильно, затем я хочу сохранить их в массиве из 360 элементов (по одному на каждый градус), первое расстояние сохраняется правильно (от 0 до 179), но второе расстояние не updatet, он хранится в 0, так как я инициализирую массив в функции setup (), поэтому я думаю, что проблема в строке "data [i + 180] = int (serialdat) a [2]); ", я пытался сделать" data [int (i + 180)] = int (serialdata [2]); "," data [i + int (180)] = int (serialdata [2] );» но я не решил, что я делаю не так?

Большое вам спасибо

import processing.serial.*; // invocar la librería Serial

Serial port; // se declara una variable para la com. serial
String serialin;
int data[] = new int[360];
PFont f;

void setup() {
  port = new Serial(this, "COM3", 9600); 
  size(1280, 720);
  f = createFont("Arial", 16, true); // Arial, 16 point, anti-aliasing on
  textFont(f, 36);
  frameRate(60);
  for (int i = 0; i < 360; i++) {
    data[i] = 0;
  }
}

void draw() {
  background(26, 26, 36, 200);
  textSize(32);
  stroke(255, 255, 255, 150);
  fill(26, 26, 36, 200);
  strokeWeight(3);
  text("ghJ", 1150, 690);
  circle(640, 360, 600);
  circle(640, 360, 500);
  circle(640, 360, 400);
  circle(640, 360, 300);
  circle(640, 360, 200);
  circle(640, 360, 100);

  for (int i = 0; i < 360; i++) {
    point(640 +  (100+data[i])*cos(radians(i)), 360 + (100+data[i])*sin(radians(i)));
  }

  while (port.available() > 0) {
    serialin = port.readStringUntil(10);
    try {
      String serialdata[] = splitTokens(serialin, ",");
      if (serialdata[0] != null) {
        print(serialdata[0]);
        print("   ");
        print(serialdata[1]);
        print("   ");
        print(serialdata[2]);
        print("   ");
        int i = int(serialdata[0]);
        data[i] = int(serialdata[1]);
        data[i+180] = int(serialdata[2]);

        print(data[int(serialdata[0])]);
        print("   ");
        println(data[int(serialdata[0])+180]);
      }
    } 
    catch (java.lang.RuntimeException e) {
    }
  }
}

1 Ответ

0 голосов
/ 10 января 2020

Я думаю, это должно работать. Попробуйте напечатать значения в целочисленной форме, чтобы убедиться, что преобразования правильные. int (string) возвращает 0 при обработке, если строка не конвертируема. Например, когда строка содержит лишние пробелы или \ n, или даже необратимые формы, такие как int ("ab c"), возвращает 0.

while (port.available() > 0) {
    serialin = port.readStringUntil(10);
    try {
      String serialdata[] = splitTokens(serialin, ",");
      if (serialdata[0] != null) {
        // Try adding these lines.
        serialdata[0] = trim(serialdata[0]);
        serialdata[1] = trim(serialdata[1]);
        serialdata[2] = trim(serialdata[2]);

        print(serialdata[0]);
        print("   ");
        print(serialdata[1]);
        print("   ");
        print(serialdata[2]); // Notice you are printing serialdata[2] in string form so this statement shows the correct value
        print("   ");

        // Try printing these values to confirm wether the conversions are correct
        int i = int(serialdata[0]);
        data[i] = int(serialdata[1]);
        data[i+180] = int(serialdata[2]);

        print(data[int(serialdata[0])]);
        print("   ");
        println(data[int(serialdata[0])+180]);
      }
    }
...