我怎样才能在java中使用processing.app.Preferences.getInteger()方法?

时间:2014-07-24 08:59:50

标签: java serial-port processing

昨天我发了一个问题(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()));
            }
        }
    }
}

1 个答案:

答案 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路径。