Arduino和Processing。错误不匹配

时间:2016-11-11 13:22:26

标签: c++ arduino processing

我的Arduino代码:

#include<EngduinoThermistor.h>
void setup()
{
  Serial.begin(9600);
  EngduinoThermistor.begin();
}void loop()
{
  float temp;
  temp = EngduinoThermistor.temperature();
  Serial.println(temp);
  delay(1000);
}

我的处理代码:

 import processing.serial.*;
    Serial port;
    float x = 0;

void setup() {
  size(600, 200);
  smooth();
  background(#9F9694);
  String port = Serial.list()[3];
  port = new Serial(this, "/dev/tty.usbmodem1411", 9600);
}

void draw() {
  stroke(50, 50, 50);
  float inByte = port.read();
  stroke(#791F33);
  strokeWeight(3);
  line(x, height, x, height-inByte); 
  print(inByte);
  if (x >=width) {
    x=0;
    background(255);
  }
  x++;
}

在这里,我无法将我的arduino上的数据发送到处理,因为始终存在错误说:类型不匹配processing.serial.Serial与java.lang.String不匹配,因为这两个语句:

  String port = Serial.list()[3];
  port = new Serial(this, "/dev/tty.usbmodem1411", 9600);

我在网上查了一下,但每个人都使用相同的代码将arduino与处理连接起来。我的处理代码有什么问题? arduino代码正常工作。

2 个答案:

答案 0 :(得分:0)

这没有意义:

String port = Serial.list()[3];
port = new Serial(this, "/dev/tty.usbmodem1411", 9600);

您正在创建名为String的{​​{1}}变量。这意味着port变量只能 指向port值。然后在下一行中,您尝试将其指向String的实例。 Serial的实例不是Serial的实例,这就是您收到错误的原因。

您需要将String变量和String变量分成两个单独的变量。像这样:

Serial

请注意,这正是the Serial documentation中的每个示例所做的。

答案 1 :(得分:0)

Kevin在解释你所获得的语法错误以及解决方法方面做得非常出色。

除此之外,我还要指出我在Simon's question中发现的一个问题:

  

float inByte = port.read();

根据Serial read()上的文件记录:

  

为缓冲区中等待的下一个字节返回0到255之间的数字。如果没有字节,则返回-1,尽管首先应该使用available()来查看数据是否可用,这应该避免。

有几个问题:

  1. EngduinoThermistor以浮动状态返回温度,而不是read()返回的温度。它一次返回一个字节。我们说温度是25.71。这将是5个字节(2 5 . 7 1,从0到255表示的字节将是50 53 46 55 49)。您需要将每个字节转换为字符,然后将每个字符附加到String,直到找到新行(\n)字符,然后字节计数器将重置。将完整字符串放在一起后,可以将其转换为浮点数。我建议使用readStringUntil()bufferUntil()readString()
  2. 的组合
  3. 您没有检查read()是否返回-1,除非您使用serialEvent()
  4. ,否则应该始终这样做

    我建议首先仔细检查数据是否在Arduino的串行监视器中正确显示。如果是,请关闭串行监视器(因为您可以一次打开一个串口连接),然后运行Arduino代码。

    你也可以利用这个奇怪的技巧:Arduino已经知道你正在使用什么串口和波特率并将其保存为首选项(因此你不必每次重启时都选择端口) )。这实际上存储在Java Properties format中,您可以在Processing中轻松解析。

    您可以从 Arduino首选项面板轻松找到此文件的位置: Arduino Preferences

    这是一个基本草图,试图从Arduino首选项中读取串口名称和波特率,然后读取一个字符串并将其打印到控制台(同时尝试处理一些错误):

    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.Properties;
    
    import processing.serial.*;
    
    String portName = null;
    int baudRate = 9600;
    
    Serial arduino;
    
    void setup(){
      readArduinoPrefs("/Users/George/Library/Arduino15/preferences.txt");
      println("last used Arduino port",portName,"with baud rate",baudRate);
    
      try{
        arduino = new Serial(this,portName,baudRate);
      }catch(Exception e){
        System.err.println("ERROR connecting to Arduino port " + portName);
        String message = e.getMessage();
        if(message.contains("not found")) println("Please make sure your Arduino is connected via USB!");
        if(message.contains("busy")) println("Please make sure the port isn't already opened/used by Serial Monitor or other programs!");
        e.printStackTrace();
        exit();
      }
    }
    void draw(){
    }
    void serialEvent(Serial s){
      println("received string",s.readStringUntil('\n'));
    }
    void readArduinoPrefs(String prefsPath){
      Properties prop = new Properties();
      InputStream input = null;
    
      try {
    
        input = new FileInputStream(prefsPath);
    
        prop.load(input);
    
        portName = prop.getProperty("serial.port");
        baudRate = int(prop.getProperty("serial.debug_rate"));
    
      } catch (IOException ex) {
        ex.printStackTrace();
      } finally {
        if (input != null) {
          try {
            input.close();
          } catch (IOException e) {
            e.printStackTrace();
          }
        }
      }
    
    }
    

    在实用方面,您可以随时在Arduino中手动配置端口名称和波特率,只需记住在您的情况下仔细检查syntax

    Serial(parent, portName, baudRate)
    

    e.g。

       new Serial(this, "/dev/tty.usbmodem1411", 9600);
    
    凯文指出