我的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代码正常工作。
答案 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()来查看数据是否可用,这应该避免。
有几个问题:
read()
返回的温度。它一次返回一个字节。我们说温度是25.71
。这将是5个字节(2 5 . 7 1
,从0到255表示的字节将是50 53 46 55 49
)。您需要将每个字节转换为字符,然后将每个字符附加到String,直到找到新行(\n
)字符,然后字节计数器将重置。将完整字符串放在一起后,可以将其转换为浮点数。我建议使用readStringUntil()或bufferUntil()和readString() 我建议首先仔细检查数据是否在Arduino的串行监视器中正确显示。如果是,请关闭串行监视器(因为您可以一次打开一个串口连接),然后运行Arduino代码。
你也可以利用这个奇怪的技巧:Arduino已经知道你正在使用什么串口和波特率并将其保存为首选项(因此你不必每次重启时都选择端口) )。这实际上存储在Java Properties format中,您可以在Processing中轻松解析。
这是一个基本草图,试图从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);
凯文指出