Kevin проделал отличную работу, объяснив, что у вас есть синтаксическая ошибка и как ее решить.
В дополнение к этому я хотел бы отметить проблему, я заметил в Simon's question, а также:
поплавка inByte = port.read();
Согласно documentaiton SERIAL на read():
Возвращает число в диапазоне от 0 до 255 для следующего байта, который ждет в буфере. Возвращает -1, если байт отсутствует, хотя этого следует избегать с помощью первого cheacking available(), чтобы увидеть, доступны ли данные.
Есть пара вопросов:
- EngduinoThermistor возвращает температуру как поплавок, и это не то, что
read()
возвращается. Он возвращает один байт за раз. Скажем, температура 25.71
. Это будет 5 байтов (2 5 . 7 1
, которые в байтах, представляющие от 0 до 255, будут 50 53 46 55 49
). Вам нужно будет преобразовать каждый байт в символ, а затем добавить каждый символ в строку, пока не будет найден символ новой строки (\n
), после чего счетчик байтов будет сброшен. После того, как полная строка собрана вместе, она может быть преобразована в float.Я рекомендую использовать либо readStringUntil() или комбинацию bufferUntil() и readString()
- Вы не проверять, если чтение() возвращает -1, которые вы всегда должны делать, если вы не используете serialEvent()
Я рекомендую двойную проверку, если данные отображаются правильно в серийном мониторе Arduino. Если это так, закройте Serial Monitor (так как вы можете одновременно открыть одно подключение к последовательному порту), а затем запустите свой код Arduino.
Вы также можете воспользоваться этим одним странным трюком: Arduino уже знает, какой последовательный порт и скорость передачи данных вы используете, и сохраняет это как предпочтение (поэтому вам не нужно выбирать порт каждый раз, когда вы перезапускаете Это). Это фактически хранится в Java Propertiesformat, что вы можете легко разобрать в разделе Обработка.
Вы можете легко найти место для этого файла с 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);
Кевин отметил
Я сделал поправку. но программа все еще не работает ... Он не может прочитать данные из arduino, и я не знаю, почему ... –