2009-01-27 80 views
1

我想通過Java讀取Windows串行端口的數據。我有javax.comm庫,能夠獲取一些數據但不正確的數據。當我將端口讀入字節數組並將其轉換爲文本時,我得到一系列字符,但沒有真正的文本字符串。我試圖將字節數組指定爲「UTF-8」和「US-ASCII」。有誰知道如何從中得到真實的文字?如何從串口讀取文本?

這裏是我的代碼:

while (inputStream.available() > 0) { 
int numBytes = inputStream.read(readBuffer); 
System.out.println("Reading from " + portId.getName() + ": "); 
System.out.println("Read " + numBytes + " bytes"); 
} 

System.out.println(new String(readBuffer)); 
System.out.println(new String(readBuffer, "UTF-8")); 
System.out.println(new String(readBuffer, "US-ASCII")); 

前三行的輸出不會讓我複製和粘貼(我假設,因爲他們是不正常的字符)。這裏是十六進制的輸出: 78786000e67e9e60061e8606781e66e0869e98e086f89898861878809e1e9880

我從一個Hollux GPS裝置,它確實字符串格式輸出讀數。我當然知道這一點,因爲我是通過C#實現的。

,我使用的通信,我知道是正確的從C#應用程序工作的設置是: 波特率:9600個 數據位:8 停止位:1 奇偶校驗:無

+0

@喬恩賽格爾 - 我注意到你重新標記清理`serial`和`port`標籤。我認爲最喜歡的標籤實際上是`串行端口`。感謝您的清理! – mtrw 2010-03-20 20:17:22

回答

1

我無法從您的代碼中知道,但看起來您正在使用java.io.InputStream來讀取對象。您應該使用java.io.BufferedReaderjava.io.InputSreamReader

有很多方法可以做到這一點,但是這就是我們使用:

javax.comm.SerialPort port = ...{initialize your serial port} 
BufferedReader portReader = 
    new BufferedReader(new InputStreamReader(port.getInputStream())); 

try { 
    String line = portReader.readLine(); 
} catch(IOException e) { ... } 
1

很可能連接的設備不使用文本協議。許多設備使用可能嵌入文本的二進制消息格式,但使用更簡潔的代碼表示其他信息。

請編輯您的問題,並提供更多信息,例如您通過串口與之通信的設備,以及從您運行的代碼中獲得的輸出。另一個有用的輸出添加將打印您讀取的數據的十六進制表示。對於一個快速和骯髒的方法如下:

import java.math.BigInteger; 
... 
System.out.println(new BigInteger(1, readBuffer).toString(16)); 

我還沒有與長天GPS的工作,但我已經寫與javax.comm儀接口。在這種情況下,該設備默認使用專有(二進制)Garmin協議,但可以在設備上啓用(基於文本的)NMEA 0183協議。是否有可能收到專有的Holux消息格式,並且需要使用GPS單元上的某些命令來切換協議?

0
byte[] readBuffer = null; 
       try { 
        while (inputStream.available() > 0) { 
         int n = inputStream.available(); 
         readBuffer = new byte[n]; 
         inputStream.read(readBuffer, 0, n); 
        } 
        String y = new String(readBuffer, StandardCharsets.ISO_8859_1); 
        String str = new String(readBuffer, "UTF-8"); 
        jTextField3.setText(" " + str+ " "); 

請我到字符串從二進制