簡體   English   中英

從串口讀取雙倍

[英]Read double from serial port

我試圖從串行端口讀取雙精度。 我可以用String讀取它,但是當我將String解析為Double時,結果沒有任何意義,並且與String不同。

這是我的代碼:

public void serialEvent(SerialPortEvent event){
        switch(event.getEventType()) {

            case SerialPortEvent.DATA_AVAILABLE:
                byte[] readBuffer = new byte[8];
                try {
                    while (inputStream.available()>0) {
                     int numBytes = inputStream.read(readBuffer);
                     String peso = new String (readBuffer, 0, numBytes, "UTF-8");
                     System.out.print(new String (readBuffer, 0, numBytes, "UTF-8"));
                    //double d = ByteBuffer.wrap(readBuffer).order(ByteOrder.LITTLE_ENDIAN ).getDouble();
                    //System.out.print(d);
                     m_dWeightBuffer = Double.parseDouble(peso);
                     System.out.print(m_dWeightBuffer);
                     }
                     //System.out.print(new String (readBuffer, 0, numBytes, "UTF-8"));
                    } catch (IOException ex) {}
                break;

        } 
    }

但是現在,您知道如何將這個字符串轉換為Double嗎?

System.out.print(new String (readBuffer, 0, numBytes, "UTF-8")); 輸出: 000.250

m_dWeightBuffer = Double.parseDouble(peso); System.out.print(m_dWeightBuffer); 輸出: 0.00.0250.0錯誤

System.out.println(new String (readBuffer, 0, numBytes, "UTF-8")); 輸出:

0 0 0 .250

前言

似乎服務器正在4個塊(可能是64位)上寫串行端口:

  1. 0
  2. 0
  3. 0
  4. .250

您正在讀取的最大緩沖區為64位(readBuffer.length * 8位),因此最后一個可能是:

0011111111010000000000000000000000000000000000000000000000000000

試試吧:

        String s = "0011111111010000000000000000000000000000000000000000000000000000"; 
        double d = Double.longBitsToDouble(Long.parseLong(s,2));
        System.out.println(d); //-> 0.25

至於現在沒錯

回答

可能您想在一個點上處理所有4個塊,因此您可以嘗試以下操作-當然,這很大程度上取決於我忽略的協議語義:

    public void serialEvent(SerialPortEvent event){
            switch(event.getEventType()) {

                case SerialPortEvent.DATA_AVAILABLE:
                    byte[] readBuffer = new byte[8];
                    String peso = "";
                    try {
                         while (inputStream.available()>0) {
                             int numBytes = inputStream.read(readBuffer);
                             peso += new String (readBuffer, 0, numBytes, "UTF-8");
                         }

                         m_dWeightBuffer = Double.parseDouble(peso);

                    } catch (IOException ex) {}
                    break;

            } 
    }

即,在讀取所有數據之后創建雙精度型。

嘗試這樣做:

 public void serialEvent(SerialPortEvent event){
            switch(event.getEventType()) {

                case SerialPortEvent.DATA_AVAILABLE:
                    byte[] readBuffer = new byte[8];


                    try {
                         while (inputStream.available()>0) {
                             int numBytes = inputStream.read(readBuffer);
                             peso += new String (readBuffer, 0, numBytes, "UTF-8").replaceAll("\\s+","").replaceAll("\\n", "").replaceAll("\\r", "");

                         }
                    } catch (IOException ex) {}

                    break;

            } 
    }

在此SerialEvent方法的外部初始化String peso。

暫無
暫無

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

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