在Processing中保存串行数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Processing中保存串行数据相关的知识,希望对你有一定的参考价值。

大家好,第二次

最初我正在寻找一个广泛的答案,但是这个帖子因为“太宽泛”而被封锁......所以我别无选择,只能详细说明。如果再次提出问题是违反论坛指南,我很抱歉,我是stackoverflow的新手,所以请善待。

我有数据进入250Hz的串口,我想把它全部保存到.csv文件中。当然draw()无法跟上那个数据速率......

目前我正在使用serialEvent(端口)来收集和解析数据。解析后,我在绘图中调用一个函数将数据添加到表中的新行,然后每隔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,..):
"+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
be 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 - 为了记录,我的脚本剩余部分可以达到80h左右 - 我可以保存所有数据并在以后解析

答案

走了缓冲路线....我想我现在已经接近了。不确定我是否按正确的顺序保存数据,或者保存过程是否会停止其余的进程...

码:

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,..):
"+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
be in use by another program)");
    //println("Error:", e);
    exit();
  }
  return "noPort";
}

以上是关于在Processing中保存串行数据的主要内容,如果未能解决你的问题,请参考以下文章

sql [SQL查询片段]用于在命令行或通过R和其他工具使用SQL的快速代码段#tags:sql,R,text processing,命令li

串行通信协议

processing可以保存指定区域的内容吗

从单个按钮从多个片段中提取数据

检索数据未出现在 ListView 的片段中

processing学习整理---Structure