处理中 DropDownList 的串行 COM 端口选择

Serial COM Port Selection by DropDownList in processing

我在Processing 2.1.2中写了一个程序,通过串口在两台机器之间建立通信。在我的笔记本电脑上,它工作正常,但在我的台式机上,有多个串行端口可用,它没有检测到我的功能串行 COM 端口。

所以现在我希望它们出现在 Combo Button 上,我可以 select 从它们中选出一个。

你能指导我如何解决这个问题吗?

import processing.serial.*;

String input;
Serial port;

void setup() {
  size(448, 299,P3D);
  println(Serial.list());
  port = new Serial(this,Serial.list()[0], 9600);
  port.bufferUntil('\n');
}

void draw() {
  background(0);
  }

void serialEvent(Serial port)
{
 input = port.readString();
 if(input != null) {
   String[] values = split(input, " ");
   println(values[0]);
   println(values[1]);
   println(values[2]);
   } 
}

如评论中所述,可以使用 UI 库来显示下拉列表。首先,您必须选择一个库,例如 controlP5 which is very popular with Processing. You may choose to use Swing with a native look & feel or G4P。这完全取决于你。

之后,将串行端口列表插入下拉列表并在下拉列表中打开串行连接 listener/callback。

Bellow 是基于库附带的 controlP5dropdownlist 示例的概念验证草图:

import processing.serial.*;
import controlP5.*;

ControlP5 cp5;
DropdownList serialPortsList;

Serial serialPort;
final int BAUD_RATE = 9600;

void setup() {
  size(700, 400,P3D);

  String[] portNames = Serial.list();

  cp5 = new ControlP5(this);
  // create a DropdownList
  serialPortsList = cp5.addDropdownList("serial ports").setPosition(10, 10).setWidth(200);
  for(int i = 0 ; i < portNames.length; i++) serialPortsList.addItem(portNames[i], i);  
}


void controlEvent(ControlEvent theEvent) {
  // DropdownList is of type ControlGroup.
  // A controlEvent will be triggered from inside the ControlGroup class.
  // therefore you need to check the originator of the Event with
  // if (theEvent.isGroup())
  // to avoid an error message thrown by controlP5.
  if (theEvent.isGroup()) {
    // check if the Event was triggered from a ControlGroup
    println("event from group : "+theEvent.getGroup().getValue()+" from "+theEvent.getGroup());
    //check if there's a serial port open already, if so, close it
    if(serialPort != null){
      serialPort.stop();
      serialPort = null;
    }
    //open the selected core
    String portName = serialPortsList.getItem((int)theEvent.getValue()).getName();
    try{
      serialPort = new Serial(this,portName,BAUD_RATE);
    }catch(Exception e){
      System.err.println("Error opening serial port " + portName);
      e.printStackTrace();
    }
  } 
  else if (theEvent.isController()) {
    println("event from controller : "+theEvent.getController().getValue()+" from "+theEvent.getController());
  }
}

void draw() {
  background(128);
}

另请注意,在选择新的串行端口时将关闭任何现有连接,并处理打开串行端口的错误处理,以便程序不会在出现问题时崩溃。

例如,在 OSX 上你有蓝牙串行端口,它可能可用也可能不可用:

处理 3.3.7 对一个字符串根本不起作用

  String portName = serialPortsList.getItem((int)theEvent.getValue()).getName();

所以我花了很多神经和神经,但我的解决方法是将 getName 更改为 String(); 和

  String portName = serialPortsList.getItem((int)theEvent.getValue()).toString();

我不明白为什么 getName() 给我 "The function doesnt exist" 但 toString 工作正常。谁能解释一下?

  1. 对于变量:

    String[] portNames = Serial.list();
    

    更改为全局变量:

    String[] portNames;
    
  2. 在:

    void setup()
    

    变化:

    String[] portNames = Serial.list();
    

    至:

    portNames = Serial.list();
    
  3. 代码中:

    String portName = serialPortsList.getItem((int)theEvent.getValue()).toString();
    

    更改为:

    String portName =portNames.toString();