簡體   English   中英

閱讀Complete Line Java串行端口

[英]Read Complete Line Java Serial Port

我已經實現了JSSC API,因此我可以與Com Port進行通信。 我發送一個像“N \\ r \\ n”這樣的命令

我在普通超級終端中收到的內容應如下所示:

0100071CA79215021803164442180000

0100071C9F5415021803164514520000

0100071CDF5115022106142956600000

NOK

但是,當我使用JSSC API執行相同操作時,我會收到此信息(僅限第一個代碼)

010

0071CA79

2150218

0316444

218

問題是我隨機收到位部分,在代碼的末尾我丟失了一些部分。 但這並不重要我只需要每個代碼的前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..");
    }

要修復所述問題,您需要將收到的字符串連接到另一個字符串,該字符串累積從readString()函數接收的字符串片段,該函數位於serialEvent處理程序中。 因為它是它的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參數值。 檢查字符串是否有替代內容以進行錯誤處理。 這對我有用。

暫無
暫無

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

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