处理中 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 工作正常。谁能解释一下?
对于变量:
String[] portNames = Serial.list();
更改为全局变量:
String[] portNames;
在:
void setup()
变化:
String[] portNames = Serial.list();
至:
portNames = Serial.list();
代码中:
String portName = serialPortsList.getItem((int)theEvent.getValue()).toString();
更改为:
String portName =portNames.toString();
我在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 工作正常。谁能解释一下?
对于变量:
String[] portNames = Serial.list();
更改为全局变量:
String[] portNames;
在:
void setup()
变化:
String[] portNames = Serial.list();
至:
portNames = Serial.list();
代码中:
String portName = serialPortsList.getItem((int)theEvent.getValue()).toString();
更改为:
String portName =portNames.toString();