Java / Arduino-从串行端口读取数据

我有一个Java程序,必须读取Arduino发送的信息。我从这里获取了Java代码。现在,我不太了解它是如何工作的,但是我尝试对其进行修改,并且得到了以下信息:

import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.io.OutputStream;

import gnu.io.CommPortIdentifier;

import gnu.io.SerialPort;

import gnu.io.SerialPortEvent;

import gnu.io.SerialPortEventListener;

import java.util.Enumeration;

public class Serial implements SerialPortEventListener {

SerialPort serialPort;

private static final String PORT_NAMES[] = {

"/dev/tty.usbserial-A9007UX1", // Mac OS X

"/dev/ttyUSB0", // Linux

"COM3", // Windows

};

private BufferedReader input;

private static OutputStream output;

private static final int TIME_OUT = 2000;

private static final int DATA_RATE = 115200;

public void initialize() {

CommPortIdentifier portId = null;

Enumeration portEnum = CommPortIdentifier.getPortIdentifiers();

while (portEnum.hasMoreElements()) {

CommPortIdentifier currPortId = (CommPortIdentifier) portEnum.nextElement();

for (String portName : PORT_NAMES) {

if (currPortId.getName().equals(portName)) {

portId = currPortId;

break;

}

}

}

if (portId == null) {

System.out.println("Could not find COM port.");

return;

}

try {

serialPort = (SerialPort) portId.open(this.getClass().getName(),TIME_OUT);

serialPort.setSerialPortParams(DATA_RATE, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);

input = new BufferedReader(new InputStreamReader(serialPort.getInputStream()));

output = serialPort.getOutputStream();

serialPort.addEventListener(this);

serialPort.notifyOnDataAvailable(true);

}

catch (Exception e) {

System.err.println(e.toString());

}

}

public synchronized void serialEvent(SerialPortEvent oEvent) {

if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) {

try {

String inputLine=input.readLine();

System.out.println(inputLine);

} catch (Exception e) {

System.err.println(e.toString());

}

}

}

public synchronized void close() {

if (serialPort != null) {

serialPort.removeEventListener();

serialPort.close();

}

}

public Serial(String ncom){

if(Integer.parseInt(ncom)>=3 && Integer.parseInt(ncom)<=9)

PORT_NAMES[2] = "COM" + ncom;

initialize();

Thread t=new Thread() {

public void run() {

try {Thread.sleep(1000000);} catch (InterruptedException ie) {}

}

};

t.start();

System.out.println("Serial Comms Started");

}

public synchronized void send(int b){

try{

output.write(b);

}

catch (Exception e) {

System.err.println(e.toString());

}

}

public synchronized int read(){

int b = 0;

try{

b = (int)input.read();

}

catch (Exception e) {

System.err.println(e.toString());

}

return b;

}

}

我创建一个对象串行COM口,我需要在主程序,然后我使用Serial.readSerial.write当我需要它。

Serial.write效果很好,Arduino获取数据并将其显示在LCD显示屏中。问题是Serial.read。程序运行时,它会不断从串行端口读取数据(大约每40毫秒一次),但这并不意味着Arduino发送了一些信息。Arduino仅在按下按钮时才发送字节。因此,当Java代码运行时,它会在读取某些内容之前引发“

n”异常,这会导致很大的延迟。

我知道我需要类似的东西Serial.available(),我试过了input.available(),但是不起作用。我不知道如何解决这个问题。

如果您有能正常工作的代码,那么如果您能给我,我将非常感激。我只需要两种方法,读写,我不在乎代码如何工作:D

编辑:

我更改了Serial类,现在它又如前文所述具有此方法

public synchronized void serialEvent(SerialPortEvent oEvent) {

if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) {

try {

String inputLine=null;

if (input.ready()) {

inputLine = input.readLine();

panel.read(inputLine);

}

} catch (Exception e) {

System.err.println(e.toString());

}

}

}

在另一堂课(在本例中为面板)中,我得到了:

public void read(String data){

System.out.println(data);

System.out.println(data == "255");

if(data == "255")

//code here

}

它可以正确打印值,但data == "255"即使我确实得到255 …,也总是错误的Integer.parseInt。为什么要死?

编辑2:好解决了:

public void read(String data){

serialRead = Integer.parseInt(data);

if(serialRead == 255)

//code here

}

现在它正在工作..不知道为什么我必须这样做…无论如何:)

回答:

您不想专门编写示例代码中已经存在的读取函数,如TheMerovingian指出的,您可以在读取之前检查输入Buffer,这是我在一个项目中使用的工作代码。

import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.io.OutputStream;

import gnu.io.CommPortIdentifier;

import gnu.io.SerialPort;

import gnu.io.SerialPortEvent;

import gnu.io.SerialPortEventListener;

import java.util.Enumeration;

public class SerialTest implements SerialPortEventListener {

SerialPort serialPort;

/** The port we're normally going to use. */

private static final String PORT_NAMES[] = { "/dev/tty.usbserial-A9007UX1", // Mac OS X

"/dev/ttyUSB0", // Linux

"COM35", // Windows

};

private BufferedReader input;

private OutputStream output;

private static final int TIME_OUT = 2000;

private static final int DATA_RATE = 9600;

public void initialize() {

CommPortIdentifier portId = null;

Enumeration portEnum = CommPortIdentifier.getPortIdentifiers();

//First, Find an instance of serial port as set in PORT_NAMES.

while (portEnum.hasMoreElements()) {

CommPortIdentifier currPortId = (CommPortIdentifier) portEnum.nextElement();

for (String portName : PORT_NAMES) {

if (currPortId.getName().equals(portName)) {

portId = currPortId;

break;

}

}

}

if (portId == null) {

System.out.println("Could not find COM port.");

return;

}

try {

serialPort = (SerialPort) portId.open(this.getClass().getName(),

TIME_OUT);

serialPort.setSerialPortParams(DATA_RATE,

SerialPort.DATABITS_8,

SerialPort.STOPBITS_1,

SerialPort.PARITY_NONE);

// open the streams

input = new BufferedReader(new InputStreamReader(serialPort.getInputStream()));

output = serialPort.getOutputStream();

serialPort.addEventListener(this);

serialPort.notifyOnDataAvailable(true);

} catch (Exception e) {

System.err.println(e.toString());

}

}

public synchronized void close() {

if (serialPort != null) {

serialPort.removeEventListener();

serialPort.close();

}

}

public synchronized void serialEvent(SerialPortEvent oEvent) {

if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) {

try {

String inputLine=null;

if (input.ready()) {

inputLine = input.readLine();

System.out.println(inputLine);

}

} catch (Exception e) {

System.err.println(e.toString());

}

}

// Ignore all the other eventTypes, but you should consider the other ones.

}

public static void main(String[] args) throws Exception {

SerialTest main = new SerialTest();

main.initialize();

Thread t=new Thread() {

public void run() {

//the following line will keep this app alive for 1000 seconds,

//waiting for events to occur and responding to them (printing incoming messages to console).

try {Thread.sleep(1000000);} catch (InterruptedException ie) {}

}

};

t.start();

System.out.println("Started");

}

}

编辑:serialEvent函数负责读取缓冲区。

public synchronized void serialEvent(SerialPortEvent oEvent) {

if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) {

try {

String inputLine=null;

if (input.ready()) {

inputLine = input.readLine();

System.out.println(inputLine);

}

} catch (Exception e) {

System.err.println(e.toString());

}

}

// Ignore all the other eventTypes, but you should consider the other ones.

}

以上是 Java / Arduino-从串行端口读取数据 的全部内容, 来源链接: utcz.com/qa/397626.html

回到顶部