Stap 4: Programmeren in Java te interpreteren binnenkomende Serial & testen
Nu, kale met mij omdat ik weet dat niemand houdt van werken met andermans code. Het is gewoon klote. U wellicht de instellingen van het COM kanaal, pariteit, stopbits en baudrate (gegevens) in de code (die kan worden bepaald via Apparaatbeheer, maar moet hetzelfde zijn als de code) te wijzigen. De onderstaande code werkt met Linux, Mac OS X en Windows. Mijn Arduino is op de standaard COM1 op 9600b/s. Ik per ongeluk achtergelaten sommige experimentele code daar terwijl het maken van een GUI maar ze heeft geen invloed op om het even wat dus probeer te negeren begrijpen sommige van de invoer van de bibliotheek. De map SerialTest is ook bevestigd voor referentie.
// *********************************************
importeren van java.awt.AWTException;
importeren van java.awt.Robot;
importeren van java.awt.event.KeyEvent;
importeren van java.io.BufferedReader;
importeren van java.io.InputStreamReader;
importeren van java.io.OutputStream;
importeren van gnu.io.CommPortIdentifier;
importeren van gnu.io.SerialPort;
importeren van gnu.io.SerialPortEvent;
importeren van gnu.io.SerialPortEventListener;
importeren van java.util.Enumeration;
importeren van javax.swing.*;
importeren van javax.swing.event.*;
importeren van java.awt.*;
import java.util.*;
importeren van javax.swing.JFrame;
importeren van java.awt.Color;
openbare klasse SerialTest implementeert SerialPortEventListener {}
SerialPort serialPort;
/ ** De poort die we gaan normaal te gebruiken. */
privé statisch definitief koord PORT_NAMES [] = {"/dev/tty.usbserial-A9007UX1", / / Mac OS X
"/ dev/ttyUSB0", / / Linux
"COM1", / / Windows
};
/**
* Een BufferedReader die zal worden gevoed door een InputStreamReader omzetten van de
* bytes naar tekens onafhankelijk maken van de weergegeven resultaten codepage
*/
privé BufferedReader ingevoerd;
/ ** De uitvoerstroom op de poort * /
privé outputlijn output;
/ ** Milliseconden te blokkeren tijdens het wachten voor de poort open * /
privé statische definitieve int TIME_OUT = 2000;
/ ** Standaard bits per seconde voor COM-poort. */
privé statische definitieve int DATA_RATE = 9600;
openbare nietige initialize() {}
CommPortIdentifier portId = null;
Opsomming portEnum = CommPortIdentifier.getPortIdentifiers();
Eerst, een exemplaar van de seriële poort als bedoeld in PORT_NAMES te vinden.
terwijl (portEnum.hasMoreElements()) {}
CommPortIdentifier currPortId = portEnum (CommPortIdentifier)
.nextElement();
voor (String portName: PORT_NAMES) {}
Als (currPortId.getName().equals(portName)) {}
portId = currPortId;
breken;
}
}
}
System.out.println ("poort-ID:");
System.out.println(portId);
System.out.println("");
Als (portId == null) {}
System.out.println kon ("niet vinden COM-poort.");
terugkeer;
}
Probeer {}
seriële poort openen en gebruik de naam van de klasse voor de appName.
serialPort = (SerialPort) portId.open(this.getClass().getName(),
TIME_OUT);
instellen poort parameters
serialPort.setSerialPortParams (DATA_RATE, SerialPort.DATABITS_8,
SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
Open de streams
invoer = nieuwe BufferedReader (nieuwe InputStreamReader ()
serialPort.getInputStream()));
uitvoer = serialPort.getOutputStream();
gebeurtenislisteners toevoegen
serialPort.addEventListener(this);
serialPort.notifyOnDataAvailable(true);
} catch (Exception e) {}
System.err.println(e.toString());
}
}
/**
* Dit moet worden aangeroepen wanneer u stopt met het gebruik van de poort. Hiermee wordt voorkomen dat
* poort vergrendeling op platformen als Linux.
*/
publiek gesynchroniseerd nietig close() {}
Als (serialPort! = null) {}
serialPort.removeEventListener();
serialPort.close();
}
}
/**
* Het verwerken van een gebeurtenis op de seriële poort. De gegevens lezen en afdrukken.
*/
publiek gesynchroniseerd nietig serialEvent(SerialPortEvent oEvent) {}
Als (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) {}
Probeer {}
InputLine koord = input.readLine();
MOTOR START
Als (inputLine.equals ("Start motor")) {}
System.out.println ("motor-Start bezig");
Probeer {}
Robot robot = nieuwe Robot();
robot.keyPress(KeyEvent.VK_S);
robot.delay(500);
robot.keyRelease(KeyEvent.VK_S);
} vangst (AWTException e) {}
e.printStackTrace();
}
}
RUITENWISSERS
Als (inputLine.equals ("ruitenwissers")) {}
System.out.println ("ruitenwissers bezig");
Probeer {}
Robot robot = nieuwe Robot();
robot.keyPress(KeyEvent.VK_W);
robot.delay(500);
robot.keyRelease(KeyEvent.VK_W);
} vangst (AWTException e) {}
e.printStackTrace();
}
}
PIT-SNELHEIDSBEGRENZER
Als (inputLine.equals ("Pit-snelheidsbegrenzer")) {}
System.out.println ("Pit-Limiter bezig");
Probeer {}
Robot robot = nieuwe Robot();
robot.keyPress(KeyEvent.VK_P);
robot.delay(500);
robot.keyRelease(KeyEvent.VK_P);
} vangst (AWTException e) {}
e.printStackTrace();
}
}
KOPLAMPEN
Als (inputLine.equals("Headlights")) {}
System.out.println ("koplampen bezig");
Probeer {}
Robot robot = nieuwe Robot();
robot.keyPress(KeyEvent.VK_H);
robot.delay(500);
robot.keyRelease(KeyEvent.VK_H);
} vangst (AWTException e) {}
e.printStackTrace();
}
}
} catch (Exception e) {}
System.err.println(e.toString());
}
}
Als (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) {}
}
Negeren van alle andere eventTypes, maar kunt u overwegen de andere
degenen.
}
openbare statische nietige leiding (koord [] args) gooit uitzondering {}
SerialTest main = nieuwe SerialTest();
Main.initialize();
Draad t = nieuwe Thread() {}
openbare nietige run() {}
de volgende regel zal dit app levend houden voor 1000 seconden,
wachten op de gebeurtenis en het reageren op hen (afdrukken
inkomende berichten naar de console).
Probeer {}
Thread.Sleep(1000000);
} vangst (InterruptedException ie) {}
}
}
};
t.Start();
System.out.println ("- de slag-");
System.out.println("");
}
}
// *********************************************
Zoals u zien kunt, zijn er 3 andere knoppen vastgehaakt. Wanneer Java ziet de seriële input van "Start motor" , zal het een toetsaanslag van Safgeven. De console output zal gooien IO. Uitzonderingen op je, maar wees niet bang, het is fixable door commentaar uit beide System.err.println(e.toString()); lijnen. Deze fouten interfereert niet met iets zodat ze niets anders zijn te bekommeren om te beginnen met. Om te veranderen wat doet elke switch, gewoon de variabelen die krijgen naar seriële in Arduino geschreven zijn wijzigen en wijzigen van de respectieve voorwaardelijke instructies in Java voor wanneer zij die seriële tekenreeksen ontvangt. Om te zien van de lijst met beschikbare opduiken opdrachten voor robot in Eclipse, type robot. en een kleine doos zal tonen van verschillende functies. Robot is verbazingwekkend, dat u kunt zelfs toewijzen om de muis op basis van input van de Arduino te bewegen.