Kevin 出色地解释了您遇到的语法错误是什么意思以及如何解决它。
除此之外,我还想指出我在Simon's question 中发现的一个问题:
float inByte = port.read();
根据 Serial 在read() 上的文档:
为缓冲区中等待的下一个字节返回一个介于 0 和 255 之间的数字。如果没有字节,则返回 -1,尽管应该通过首先检查 available() 来查看数据是否可用来避免这种情况。
有几个问题:
- EngduinoThermistor 以浮点数形式返回温度,这不是
read() 返回的值。它一次返回一个字节。假设温度为25.71。这将是 5 个字节(2 5 . 7 1 表示从 0 到 255 的字节将是 50 53 46 55 49)。您需要将每个字节转换为一个字符,然后将每个字符附加到一个字符串,直到找到新行 (\n) 字符,然后字节计数器将重置。将完整的字符串放在一起后,可以将其转换为浮点数。我建议使用readStringUntil() 或bufferUntil() 和readString() 的组合
- 您没有检查 read() 是否返回 -1,除非您使用 serialEvent(),否则您应该始终这样做
我建议首先仔细检查数据是否在 Arduino 的串行监视器中正确显示。如果是,请关闭串行监视器(因为您一次可以打开一个到串行端口的连接),然后运行您的 Arduino 代码。
您还可以利用这个奇怪的技巧:Arduino 已经知道您正在使用的串行端口和波特率并将其保存为首选项(因此您不必每次重新启动它时都选择端口)。这实际上存储在 Java Properties format 中,您可以在 Processing 中轻松解析。
您可以从 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)
例如
new Serial(this, "/dev/tty.usbmodem1411", 9600);
正如凯文指出的那样