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

时间:2015-03-17 19:01:06

标签: drop-down-menu processing windows-7-x64 serial-communication

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

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

您能指导我如何解决此问题吗?

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]);
   } 
}

3 个答案:

答案 0 :(得分:2)

如评论中所述,可以使用UI库来显示下拉列表。首先,您必须选择一个库,例如controlP5,它非常受Processing处理。您可以选择使用具有原生外观的Swing&感觉还是G4P。这完全取决于你。

之后,应该将串行端口列表插入下拉列表并打开下拉监听器/回调上的串行连接。

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上你会得到蓝牙串口,可能有也可能没用:

serial ports list using controlP5 library

答案 1 :(得分:0)

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

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

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

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

我不明白为什么getName()给我“函数不存在”但toString可以正常工作的原因。有人可以解释吗?

答案 2 :(得分:0)

  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();