java - 创建一个单独的线程来从java中的2路串行端口读取

标签 java multithreading

我想从串行端口读取数据,为此我需要一个单独的线程,该线程将在后台运行并不断检查“数据是否可供读取”,此外串行端口是两种方式(rx-德克萨斯州)。一种方法是添加一个串行事件监听器,但我不知道如何使后台线程执行相同的操作,请帮助我!

我已经创建了一个类读取,它从其他类获取输入流,并且我正在创建这个读取类的线程,以便它在后台运行以查看是否触发了任何接收事件,但接收事件没有发生没有发生,有什么问题吗?

import java.io.IOException;
import java.io.InputStream; 
import java.util.TooManyListenersException;
import javax.comm.SerialPort;
import javax.comm.SerialPortEvent;
import javax.comm.SerialPortEventListener;


public class read implements SerialPortEventListener, Runnable {

InputStream inputStream;
SerialPort sp;
public read(SerialPort sp, InputStream input){

    inputStream = input;
    this.sp = sp;
    try {
        sp.addEventListener(this);
} catch (TooManyListenersException e) {System.out.println(e);}
    sp.notifyOnDataAvailable(true);
/*    try{
        sp.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
    }
    catch(Exception e){}*/

        new Thread(this).start();

}

@Override
    public void run() {
    try {
        Thread.sleep(20000);
    } catch (InterruptedException e) {System.out.println(e);}
}
@Override
public void serialEvent(SerialPortEvent event) {
    switch(event.getEventType()) {
    case SerialPortEvent.BI:
    case SerialPortEvent.OE:
    case SerialPortEvent.FE:
    case SerialPortEvent.PE:
    case SerialPortEvent.CD:
    case SerialPortEvent.CTS:
    case SerialPortEvent.DSR:
    case SerialPortEvent.RI:
    case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
        break;
    case SerialPortEvent.DATA_AVAILABLE:
        byte[] readBuffer = new byte[1000];

        try {
            while (true) {

                int numBytes;
                if(inputStream.available() > 0){

                    numBytes = inputStream.read(readBuffer);

                }
                else
                    break;

            }
             System.out.print(new String(readBuffer));
             try{
    inputStream.close();
    sp.close();
    }
    catch(Exception e){}
        } catch (IOException e) {System.out.println(e);}
        break;
    }
}
}

最佳答案

I want to read data from a serial port and for that I need a separate thread which will run in the background and continously check for 'whether data is available to be read'

不,你不知道。你需要一个倾听者。你已经有一个听众了。您已将其添加到串行端口。你不需要任何其他东西。您不需要将监听器作为线程启动。它是JavaComm会自动调用的回调对象。

further the serial port is two way(rx-tx). One way to do this is to add a serial event listener but i'm not getting how to make a background thread to do the same ...

那是因为你不必这样做。您误解了监听器的工作原理。当监听器触发时,将执行相应回调方法中的代码。就是这样。您不需要线程。

I have made a class read, which takes an input stream from some other class

正确。

and I am making a thread of this read class so that it runs in the background to see if any recieve event is triggered

不必要且毫无意义,见上文。

but the recieving isn't happening, what's the problem, anyone?

你做错了。删除线程,删除 run() 方法,删除 start(),然后等待事件传递到回调方法。

重新编写您的代码:

case SerialPortEvent.DATA_AVAILABLE:
    byte[] readBuffer = new byte[1000];

    try {
        while (true) {

删除循环。

            int numBytes;
            if(inputStream.available() > 0){

删除测试。这已经是事实了,这就是 case SerialPortEvent.DATA_AVAILABLE 的含义。

                numBytes = inputStream.read(readBuffer);
            }
            else
                break;

删除此elsebreak

         System.out.print(new String(readBuffer));

更改为

         System.out.print(new String(readBuffer, 0, numBytes));

您忽略了 read() 返回的长度,因此您正在构造一个 String,其中包含缓冲区末尾超出读取内容的垃圾。

         try{
inputStream.close();
sp.close();
}

删除所有这些。您不应仅仅因为当前没有数据可供读取而关闭输入流。将其保持打开状态。目前,您正在关闭流,从而在第一个数据到达后禁用监听器。

关于java - 创建一个单独的线程来从java中的2路串行端口读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40112996/

相关文章:

multithreading - 缺少OpenMP功能: Thread Priority

c# - 简单的多线程 - 将语句合并为两行

java - for 循环是导致此代码中错误的原因吗?

java - 如何将一个 JTextArea 与另一个 JTextArea 并排放置?

java - 根据 JRadioButton 选择更改 JButton 的图标

java - 优先下载管理器(Java、Android)

java - 使用从文件中读取的新数据更新 JTextArea

java - 在 Mongo 3.3.0 中使用 QueryBuilder 查询 Mongo 集合

java - ThreadPoolExecutor 和 RejectedExecutionExceptionHandler

c# - 具有间隔的高效多个 tcp 客户端