[英]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;
刪除這個else
和break
。
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.