簡體   English   中英

在java中創建一個單獨的線程以從2路串行端口讀取

[英]Creating a separate thread to read from a 2 way serial port in java

我想從串行端口讀取數據,為此我需要一個單獨的線程,該線程將在后台運行並不斷檢查“是否可以讀取數據”,此外串行端口是兩種方式(rx-tx)。 一種方法是添加一個串行事件偵聽器,但我不知道如何制作后台線程來做同樣的事情,請幫幫我!

我做了一個類讀取,它從其他一些類中獲取輸入流,並且我正在創建這個讀取類的線程,以便它在后台運行以查看是否觸發了任何接收事件,但接收沒有發生,有什么問題嗎,有人嗎?

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;
    }
}
}

我想從串行端口讀取數據,為此我需要一個單獨的線程,該線程將在后台運行並不斷檢查“是否可以讀取數據”

不,你沒有。 你需要一個傾聽者。 你已經有了一個聽眾。 您已將其添加到串行端口。 你不需要其他任何東西。 您不需要將偵聽器作為線程啟動。 它是 JavaComm 將自動調用的回調對象。

此外,串行端口是雙向的(rx-tx)。 一種方法是添加一個串行事件偵聽器,但我不知道如何使后台線程執行相同的操作...

那是因為你不必這樣做。 您誤解了偵聽器的工作方式。 當偵聽器觸發時,將執行相應回調方法中的代碼。 就是這樣。 您不需要線程。

我讀了一個類,它從其他類中獲取輸入流

正確的。

我正在創建這個讀取類的線程,以便它在后台運行以查看是否觸發了任何接收事件

不必要和毫無意義,見上文。

但接收沒有發生,有什么問題,有人嗎?

你這樣做是錯的。 刪除線程,刪除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();
}

刪除這一切。 您不應僅僅因為當前沒有可供讀取的數據而關閉輸入流。 讓它打開。 目前您正在關閉流,因此在第一條數據到達后禁用偵聽器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM