2016-11-11 2 views
1

Мой Arduino Код: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

Это не имеет смысла:

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

Вы создаете String переменную с именем port. Это означает, что переменная port может только указывает на String значения. Затем в следующей строке вы попытаетесь указать его на экземпляр Serial. Экземпляр Serial не является экземпляром String, поэтому вы получаете ошибку.

Вам необходимо разделить переменную String и переменную Serial на две отдельные переменные. Что-то вроде этого:

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

Пожалуйста, обратите внимание, что это именно то, как каждый пример в the Serial documentation это делает.

+0

Я сделал поправку. но программа все еще не работает ... Он не может прочитать данные из arduino, и я не знаю, почему ... –

0

Kevin проделал отличную работу, объяснив, что у вас есть синтаксическая ошибка и как ее решить.

В дополнение к этому я хотел бы отметить проблему, я заметил в Simon's question, а также:

поплавка inByte = port.read();

Согласно documentaiton SERIAL на read():

Возвращает число в диапазоне от 0 до 255 для следующего байта, который ждет в буфере. Возвращает -1, если байт отсутствует, хотя этого следует избегать с помощью первого cheacking available(), чтобы увидеть, доступны ли данные.

Есть пара вопросов:

  1. EngduinoThermistor возвращает температуру как поплавок, и это не то, что read() возвращается. Он возвращает один байт за раз. Скажем, температура 25.71. Это будет 5 байтов (2 5 . 7 1, которые в байтах, представляющие от 0 до 255, будут 50 53 46 55 49). Вам нужно будет преобразовать каждый байт в символ, а затем добавить каждый символ в строку, пока не будет найден символ новой строки (\n), после чего счетчик байтов будет сброшен. После того, как полная строка собрана вместе, она может быть преобразована в float.Я рекомендую использовать либо readStringUntil() или комбинацию bufferUntil() и readString()
  2. Вы не проверять, если чтение() возвращает -1, которые вы всегда должны делать, если вы не используете serialEvent()

Я рекомендую двойную проверку, если данные отображаются правильно в серийном мониторе Arduino. Если это так, закройте Serial Monitor (так как вы можете одновременно открыть одно подключение к последовательному порту), а затем запустите свой код Arduino.

Вы также можете воспользоваться этим одним странным трюком: Arduino уже знает, какой последовательный порт и скорость передачи данных вы используете, и сохраняет это как предпочтение (поэтому вам не нужно выбирать порт каждый раз, когда вы перезапускаете Это). Это фактически хранится в Java Propertiesformat, что вы можете легко разобрать в разделе Обработка.

Вы можете легко найти место для этого файла с Arduino Preferences панели: 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); 

Кевин отметил

Смежные вопросы