2015-02-24 130 views
0

我已經實現了JSSC API,所以我可以與Com端口進行通信。 我發送一個命令像 「N \ r \ n」 個閱讀完成行Java串行端口

和我收到一個正常的超級終端應該是這樣的:

0100071CA79215021803164442180000

0100071C9F5415021803164514520000

0100071CDF5115022106142956600000

NOK

但是,當我這樣做與JSS C API我收到此(僅第一代碼)

0071CA79

的問題是,我隨機收到位部件和在代碼的最後,我失去了一些部分。但那不重要,我只需要每個代碼的前12位數字。

問題是現在我怎麼得到的功能只接收完整的行,而不是bitparts?

這是類 類PortReader2實現SerialPortEventListener的接收部分{

@Override 
    public void serialEvent(SerialPortEvent event) { 
     if(event.isRXCHAR()&& event.getEventValue() > 2) { 
      try { 
       // получение ответа от порта 
       String receivedData = serialPort.readString(); 
       System.out.println(receivedData.length() + ":" + receivedData); 
      } 
      catch (SerialPortException ex) { 
       System.out.println("Error in receiving response from port: " + ex); 
      } 
     } 

    } 
} 

這是發送部分

public void sendCodeCommand(SerialPort serialPort) { 
    // writing string to port 
    try { 
     Thread.sleep(3000); 
     serialPort.writeBytes("N\r\n".getBytes()); 
    } catch (SerialPortException | InterruptedException ex) { 
     Logger.getLogger(ComPortSendReceive.class.getName()).log(Level.SEVERE, null, ex); 
    } 
     System.out.println("String wrote to port, waiting for response.."); 
    } 

回答

0

要解決,你需要連接收到串了上述問題,轉換爲另一個字符串,用於累積從串行事件處理程序中的readString()函數接收到的字符串片段。因爲它是owm線程,所以它獲得一定數量的cpu時間來獲取串行數據,因此它有效地獲得串行端口輸入數據的部分順序讀取。所以這個例子將部分輸入放在一起來創建「整體」輸入。

String serialString; 

所以內的serialEvent處理程序:

try { 
serialStringFragment = serialPort.readString(); 
serialString.concat(serialStringFragment); 
} 

要麼你從readString得到()將字符串或積累字符串進行掃描以類似EOL條件的令牌。例如:

String [] dlLines = serialString.split("\r\n"); 

會將每行分隔到dlLines字符串數組中的元素。

不過,我發現,如果我有固定從我的目標設備的長度輸出這個工作得更好:

serialPort.readString(int bytecount); 

內嵌寫串行串,消除的serialEvent處理程序。

這是一個有點做作,但換句話說:

String expectedStringLength "0100071CA79215021803164442180000"; 
int serialstrlen = expectedStringLength.length(); 

所以serialstrlen顯然應該成爲每個預期線常數。

serialPort.writeString("N\r\n"); 
serialPort.readString(serialstrlen+2); // assuming cr lf 

應該讓你第一行。

將readString()放入循環中,根據預期的字符串更改serialstrelen參數值。檢查字符串是否有錯誤處理的替代內容。這對我有效。