昨天我发了一个问题(How can I use processing.app.Preferences in java?)。我将我的代码更改为此...
import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Enumeration;
public class Main {
static InputStream input;
static OutputStream output;
public static void main(String[] args) throws Exception{
ArrayList<String> portList = new ArrayList();
Enumeration portIdentifiers = CommPortIdentifier.getPortIdentifiers();
while(portIdentifiers.hasMoreElements()){
CommPortIdentifier portt = (CommPortIdentifier)portIdentifiers.nextElement();
portList.add(portt.getName());
}
CommPortIdentifier portId = CommPortIdentifier.getPortIdentifier(portList.get(0));
SerialPort port = (SerialPort)portId.open("Main", 9600);
input = port.getInputStream();
output = port.getOutputStream();
port.setSerialPortParams(9600,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE);
while(true){
while(input.available()>0) {
System.out.print((char)(input.read()));
}
}
}
}
这段代码正常运行,很好。 portId.open()
方法给出了两个参数,使用端口的进程的名字,第二个是数据发送速率。
但现在我的问题是如何编写一些代码并将我的硬代码更改为软代码。
“Main”和9600是常数。如何从jvm或System获取此信息或...我不知道......
当我使用Preferences.getInteger("serial.debug_rate")
时,我收到此错误
Exception in thread "main" java.lang.NumberFormatException: null
at java.lang.Integer.parseInt(Integer.java:542)
at java.lang.Integer.parseInt(Integer.java:615)
at processing.app.Preferences.getInteger(Preferences.java:885)
at pkg.Main.main(Main.java:36)
Java Result: 1
这是this link的前一段代码。
import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;
import java.io.InputStream;
import java.io.OutputStream;
import processing.app.Preferences;
public class Main {
static InputStream input;
static OutputStream output;
public static void main(String[] args) throws Exception{
Preferences.init(null);
System.out.println("Using port: " + Preferences.get("serial.port"));
CommPortIdentifier portId = CommPortIdentifier.getPortIdentifier(
Preferences.get("serial.port"));
SerialPort port = (SerialPort)portId.open("serial talk", 4000);
input = port.getInputStream();
output = port.getOutputStream();
port.setSerialPortParams(Preferences.getInteger("serial.debug_rate"),
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE);
while(true){
while(input.available()>0) {
System.out.print((char)(input.read()));
}
}
}
}
答案 0 :(得分:0)
如果您只是尝试从串口读取,那么读取端口名称和波特率值得使用Arduino的偏好文件吗?您将知道端口名称和波特率,因为您在将Arduino草图上传到电路板时手动选择它们。
在我看来,使用Processing's Serial library在幕后使用gnu.io.SerialPort;
似乎更简单:
import processing.serial.*;
Serial port;
void setup(){
print("Serial ports: ");println(Serial.list());
try{
port = new Serial(this,Serial.list()[0],9600);//try to open 1st port
}catch(Exception e){
System.err.println("*****Error Opening Serial Port!*****");
e.printStackTrace();
}
}
void draw(){/*you can draw the string to screen here if you like*/}
void serialEvent(Serial p) {
println(p.readString());
}
你也可以做一些像bufferUntil()这样的好事,这样你就不必手动等待角色完成将字符串附加到字符串。
该库位于modes\java\libraries\serial
下的Processing的安装文件夹中,因此您可以在纯Java项目中使用它,将serial和Processing的core.jar库添加到项目中并扩展PApplet。如果由于某种原因您不想使用Processing库,则可以learn from it。
此外,关于您的原始查询,您似乎没有加载首选项文件(它位于ARDUINO_INSTALL_FOLDER/lib/preferences.txt
),这就是您在检索值时可能会获得空引用的原因。此时,您还可以自由使用Java的首选项类,或者只是加载文本文件并检索serial.port=
与新行字符或serial.debug_rate
之间的内容以及换行符。
<强>更新强> 以上代码使用Arduino的首选项文件读取一个简单的字符串:
import processing.serial.*;
Serial port;
final String PORT_TOKEN = "serial.port=";
final String BAUD_TOKEN = "serial.debug_rate=";
void setup(){
print("Serial ports: ");println(Serial.list());
//begin parsing arduino prefs
String[] arduinoPrefs = loadStrings("C:\\Program Files\\Arduino\\lib\\preferences.txt");
String portName = "";
int baudRate = 0;
for(String s : arduinoPrefs){//for each line in text file
if(s.contains(PORT_TOKEN)) portName = s.substring(s.indexOf(PORT_TOKEN)+PORT_TOKEN.length());//find the PORT_TOKEN and if there is one, retrieve the value
if(s.contains(BAUD_TOKEN)) baudRate = int(s.substring(s.indexOf(BAUD_TOKEN)+BAUD_TOKEN.length()));//do the same for the BAUD_TOKEN
}
//end parsing arduino prefs
try{
if(portName.length() > 0 && baudRate > 0)
port = new Serial(this,portName,baudRate);
else
port = new Serial(this,Serial.list()[0],9600);//try to open 1st port
}catch(Exception e){
System.err.println("*****Error Opening Serial Port!*****");
e.printStackTrace();
}
}
void draw(){/*you can draw the string to screen here if you like*/}
void serialEvent(Serial p) {
println(p.readString());
}
请记住根据您的操作系统和Arduino安装文件夹更新loadString()
调用中的preferences.txt路径。