我在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]);
}
}
答案 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上你会得到蓝牙串口,可能有也可能没用:
答案 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)
对于变量:
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();