Java GUI和Arduino - 从Serial中提取信息

时间:2016-02-23 19:49:43

标签: java user-interface arduino serial-port rxtx

我目前正在参与Arduino项目。其中我需要读取5个模拟传感器。

每个传感器的arduino代码非常简单。但它是以下内容:

void setup() 
 {
  Serial.begin(9600);
 }

void loop() 
 {
 int sensor1 = analogRead(A0);
 float volt1 = sensor1 * (5.0 / 1023-0);
 Serial.print("The voltage on the sensor  1 is:   ");
 Serial.println(volt1);
 }

使用Arduino网站上的Java文档http://playground.arduino.cc/Interfacing/Java我能够设置Rx和Tx库。我还能够从Java控制台的串口获取数据。我现在需要做的是从控制台中提取该信息并将其显示在GUI上。

在Java控制台中,我有:

传感器1上的电压为:X
传感器2上的电压为:Y 传感器3上的电压为:Z
传感器4上的电压为:W
传感器5上的电压为:A

我需要将X,Y,Z,W和A的值分别放在不同的JTextField上

感谢您的帮助

2 个答案:

答案 0 :(得分:0)

查看示例输出数据:

The voltage on the sensor 1 is: X
The voltage on the sensor 2 is: Y
The voltage on the sensor 3 is: Z
The voltage on the sensor 4 is: W
The voltage on the sensor 5 is: A

听起来您只需要在:字符后获取数据并删除值周围的空格,以便将其解析为浮点值。 使用String类应该很简单:

  1. 使用indexOf()
  2. 获取最后一个“:”字符
  3. 使用substring()
  4. 切断字符串的最后一部分
  5. 使用trim()
  6. 清除空白

    这是一个基本的例子:

    String stringFromSerial = "The voltage on the sensor 1 is: X";
    String valueString = stringFromSerial.substring(stringFromSerial.lastIndexOf(":")+1).trim(); 
    System.out.println(valueString);
    

    如果它符合您的要求,您可以将其封装在一个函数中:

    float extractFloat(String serialMessage){
      float result = Float.NaN;
      try{
        result = Float.parseFloat(serialMessage.substring(serialMessage.indexOf(":")+1).trim());
      }catch(Exception e){
        System.err.println("Oh-oh! Something went wrong trying to convert " + serialMessage);
        e.printStackTrace();
      }
      return result;
    }
    

    我不确定是否值得发送这么多角色。 您可能需要考虑发送以逗号分隔的值,如csv行。

    这些方面的东西:

    Serial.print(volt1);
    Serial.print(",");
    Serial.print(volt2);
    Serial.print(",");
    Serial.print(volt3);
    Serial.print(",");
    Serial.print(volt4);
    Serial.print(",");
    Serial.println(volt4);
    

    关于这一点的好处是,在较新版本的Arduino(1.6.6或更高版本)中,您应该可以使用工具>串行绘图仪

    此外,如果你没有坚持使用原始java和swing组件,你可能想看看Processing并且它是Serial library

答案 1 :(得分:0)

我对你的问题的具体细节不太清楚,但我没有足够的评论意见,所以我至少会回答其中的一部分。

new JTextField(Float.toString(volt1));

将使用电压值创建JTextField。您可以将创建的字段分配给您希望的任何变量。

我不确定当你在变量中有值时,为什么要从控制台中提取值。

这有帮助吗?

如果没有,您是否可以更具体地了解您的要求以及您希望从控制台获取价值的原因?