arduino串口值java_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.read和Serial.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

}

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值