Сохранение серийных данных в обработке - PullRequest
0 голосов
/ 12 сентября 2018

Привет всем во второй раз,

Первоначально я искал широкий ответ, но эта тема была заблокирована за то, что она была "слишком широкой" ... поэтому у меня не было выбора, кроме как перейти к деталям. Приношу свои извинения, если задавать вопрос снова против правил форума, я новичок в stackoverflow, поэтому, пожалуйста, будьте добры.

Я получил данные, поступающие в последовательный порт на частоте 250 Гц, и я хотел бы сохранить их в файле .csv. Конечно, draw () не сможет справиться с такой скоростью передачи данных ...

В данный момент я использую serialEvent (порт) для сбора и анализа данных. После анализа я вызываю функцию draw, чтобы добавить данные в новую строку таблицы, а затем сохраняю эту таблицу каждые 5 секунд ...

Да, я вижу очевидный недостаток: если я сохраняю текущие данные в режиме рисования, то, конечно, он не сможет сохранить все поступающие данные, а скорее только те данные, которые будут присутствовать при вызывается функция сохранения данных ... но я не уверен, что это лучший способ решить эту проблему. Буферная схема? Или я могу иметь отдельный поток, который просто добавляет ВСЕ данные, поступающие в таблицу?

что привело к моему первоначальному (широкому) вопросу ... Есть ли способ сохранить все входящие данные в файл без опроса?

Спасибо всем заранее .. код ниже: Твен

import processing.serial.*;
import static javax.swing.JOptionPane.*;

Table table;
String Path = "PathProvidedHere.csv";
String message;

//Some time keeping variables
int hours, minutes, seconds, milliseconds;
float SaveTime;

//Serial port selection
Serial myPort;
String COMx, COMlist = "";
final boolean debug = true;
String portName;

// Data variables
float yaw = 0.0; float pitch = 0.0; float roll = 0.0;
float A1, A2, A3, A4;
float E1, E2, E3, E4;

void setup()
{
    //Set up GIU box
    size(1024, 768, P3D);
    frameRate(250);  
    smooth();

    //Some other setups  like fonts, graphs, etc.

    //Set up the logging table
    table = new Table();  
    table.addColumn("A1"); table.addColumn("A2"); table.addColumn("A3"); table.addColumn("A4");
    table.addColumn(""); table.addColumn("E1"); table.addColumn("E3"); table.addColumn("E4");  
    table.addColumn(" "); table.addColumn("min"); table.addColumn("sec"); table.addColumn("milli");

    portName = chooseCOM();

    delay(1000); 
}


void draw()
{  
    SavetoCSV();

    //serialEvent(myPort);  // read and parse incoming serial message

    ACouple();
    Unrelated();
    FunctionsHere();

    if(millis() - SaveTime > 5000)
    {
        saveTable(table, Path);
        SaveTime=millis();
    }
}


String chooseCOM()
{
    setupP2 = true;

    try 
    {
        if (debug) printArray(Serial.list());

        int i = Serial.list().length;

        if (i != 0) 
        {
            if (i >= 2) 
            {
                // need to check which port the inst uses -
                // for now we'll just let the user decide
                for (int j = 0; j < i; ) 
                {
                    COMlist += char(j+'a') + " = " + Serial.list()[j];
                    if (++j < i) COMlist += ",  ";
                }

                COMx = showInputDialog("Which COM port is correct? (a,b,..):\n"+COMlist);

                if (COMx == null) exit();

                if (COMx.isEmpty()) exit();

                i = int(COMx.toLowerCase().charAt(0) - 'a') + 1;
            }

            String portName = Serial.list()[i-1];

            if (debug) //println(portName + " Selected");

            myPort = new Serial(this, portName, 115200); // change baud rate to your liking
            myPort.bufferUntil(13); // buffer until CR/LF appears, but not required..

            return portName;
        } 
        else 
        {
            showMessageDialog(frame, "Device is not connected to the PC");
            exit();
        }
    }
    catch (Exception e)
    { //Print the type of error
        showMessageDialog(frame, "COM port is not available (may\nbe in use by another program)");
        //println("Error:", e);
        exit();
    }

    return "noPort";
}


void serialEvent(Serial myPort)
{
    int newLine = 13; // new line character in ASCII

    do
    {
        message = myPort.readStringUntil(newLine); // read from port until new line

        if (message != null) 
        {
            String[] list = split(trim(message), " ");

            if (list.length == 4 && list[0].equals("i")) 
            {
                yaw =  float(list[1]); // convert to float yaw
                pitch = float(list[2]); // convert to float pitch
                roll = float(list[3]); // convert to float roll
            } 
            else if (list.length == 5 && list[0].equals("s")) 
            {  
                A1 = float(list[1]);
                A2 = float(list[2]);
                A3 = float(list[3]);
                A4 = float(list[4]);
            } 
            else if (list.length >=2 && list[0].equals("b")) 
            {  
                Battery = int(list[1]);
            } 
            else if (list.length >= 2 && list[0].equals("m")) 
            {  
                MACid = int(list[1]);
            } 
            else 
            {
                //print anything extra to console
                //println(message);
            }
        }
    } while (message != null);
}

void SavetoCSV() 
{
    if (A1 != 0) 
    {
        TableRow newRow = table.addRow();
        newRow.setFloat("A1", (A1));
        newRow.setFloat("A2", (A2));
        newRow.setFloat("A3", (A3));
        newRow.setFloat("A4", (A4));

        //saveTable(table, Path);
    }
}

Дополнительная информация: - обработка P3 - Для записи, с остальной частью моего сценария, я могу получить до 80 Гц или около того - Я буду в порядке, сохранив все данные и проанализировав их позже

1 Ответ

0 голосов
/ 12 сентября 2018

Пошёл в буферный маршрут .... Думаю, я уже близко.Не уверен, что я сохраняю данные в правильном порядке или процесс сохранения остановит остальные процессы ...

Код:

import processing.serial.*;
import static javax.swing.JOptionPane.*;

//Arrays to save the data
LinkedList<Integer> A1c = new LinkedList<Integer>();
LinkedList<Integer> A2c = new LinkedList<Integer>();
LinkedList<Integer> A3c = new LinkedList<Integer>();
LinkedList<Integer> A4c = new LinkedList<Integer>();
int bufferLength = 500;
int bufflen = 0;

//Serial port selection
Serial myPort;
String COMx, COMlist = "";
final boolean debug = true;
String portName;

// Data variables
float yaw = 0.0; float pitch = 0.0; float roll = 0.0;
float A1, A2, A3, A4;

//Data log variables
Table table;
String Path = "PathtoFile.csv"; 


void setup() {
  //Set up GIU box
  size(1024, 768, P3D);
  frameRate(250);  
  strokeWeight(50);
  smooth();

  //Set up the logging table
  table = new Table();  
  table.addColumn("A1"); table.addColumn("A2"); table.addColumn("A3"); table.addColumn("A4");

      portName = chooseCOM();
}


void draw() {

    //SavetoCSV now called within SerialEvent()
    //SavetoCSV();
    //serialEvent(myPort);  // read and parse incoming serial message

  Some();
  Unrelated();
  FunctionsHere();
}


void serialEvent(Serial myPort) {
  int newLine = 13; // new line character in ASCII
  do {
    message = myPort.readStringUntil(newLine); // read from port until new line
    if (message != null) {
      String[] list = split(trim(message), " ");
      if (list.length == 4 && list[0].equals("i")) {
        yaw =  float(list[1]); // convert to float yaw
        pitch = float(list[2]); // convert to float pitch
        roll = float(list[3]); // convert to float roll
      } else if (list.length == 5 && list[0].equals("s")) {  
        A1 = float(list[1]);
        A2 = float(list[2]);
        A3 = float(list[3]);
        A4 = float(list[4]);

        if (bufflen < bufferLength) {
          A1c.push(int(A1));
          A2c.push(int(A2));
          A3c.push(int(A3));
          A4c.push(int(A4));

          bufflen++;
        }
        else{
          bufflen = 0;
          SavetoCSV();
        }
      } else if (list.length >=2 && list[0].equals("b")) {  
        Battery = int(list[1]);
      } else if (list.length >= 2 && list[0].equals("m")) {  
        MACid = int(list[1]);
      } else {
        //print anything extra to console
        //println(message);
      }
    }
  } while (message != null);
}

void SavetoCSV() {

  if (A1 != 0) {
    for (int i = bufferLength - 1; i >= 0; i--){
     if (i < bufferLength){
       TableRow newRow = table.addRow();
       newRow.setFloat("A1", (A1c.get(i)));
       newRow.setFloat("A2", (A2c.get(i)));
       newRow.setFloat("A3", (A3c.get(i)));
       newRow.setFloat("A4", (A4c.get(i)));
     } else saveTable(table, Path);
    }
  }
}


String chooseCOM() {
  setupP2 = true;
  try {
    if (debug) printArray(Serial.list());
    int i = Serial.list().length;
    if (i != 0) {
      if (i >= 2) {
        // need to check which port the inst uses -
        // for now we'll just let the user decide
        for (int j = 0; j < i; ) {
          COMlist += char(j+'a') + " = " + Serial.list()[j];
          if (++j < i) COMlist += ",  ";
        }
        COMx = showInputDialog("Which COM port is correct? (a,b,..):\n"+COMlist);
        if (COMx == null) exit();
        if (COMx.isEmpty()) exit();
        i = int(COMx.toLowerCase().charAt(0) - 'a') + 1;
      }
      String portName = Serial.list()[i-1];
      if (debug) //println(portName + " Selected");
      myPort = new Serial(this, portName, 115200); // change baud rate to your liking
      myPort.bufferUntil(13); // buffer until CR/LF appears, but not required..
      return portName;
    } else {
      showMessageDialog(frame, "Device is not connected to the PC");
      exit();
    }
  }
  catch (Exception e)
  { //Print the type of error
    showMessageDialog(frame, "COM port is not available (may\nbe in use by another program)");
    //println("Error:", e);
    exit();
  }
  return "noPort";
}
...