簡體   English   中英

Java將字節寫入串行端口USB

[英]Java writing bytes to serial port USB

我下面有一個代碼,我正在發送到串行USB端口...它正在工作,但現在不行! 如果發送了錯誤的字符串, akber()函數就會死掉...

如果我發送akber("1.0.0.0.1.5") -效果很好,

如果我發送akber("23.0.128.0.0.5") -它不起作用...

見下面的代碼

    public static byte[] akber(final String input) {
        StringTokenizer tokens = new StringTokenizer(input, ".");
        int numberOfArrays = tokens.countTokens();
        byte[][] byteArrays;
        byteArrays = new byte[numberOfArrays][4];
        int i = 0;
        int space = 0;
        while (tokens.hasMoreTokens()) {
            int x = Integer.valueOf(tokens.nextToken());
            if (x<256) { space++; } else { space+=2; }  
            byteArrays[i] = BigInteger.valueOf(x).toByteArray();
            i++;
        }
        final byte[] output = new byte[space];
        copySmallArraysToBigArray(byteArrays, output);
        return output;
    }

    public static void copySmallArraysToBigArray(final byte[][] smallArrays, final byte[] bigArray) {
        int currentOffset = 0;
        for (final byte[] currentArray : smallArrays) {
            System.arraycopy(currentArray, 0, bigArray, currentOffset, currentArray.length);
            currentOffset += currentArray.length;
        }
}

從函數調用:

serialPort.writeBytes(akber(data));

我需要它與“數據”字符串中的任何數字組合一起工作,因此它將其轉換為正確的字節類型並寫入端口...這不是我的代碼,我不太理解,但是仍然需要修復它:-)

更改此行:

if (x<256) { space++; } else { space+=2; }  

if (x<128) { space++; } else { space+=2; }  

我運行了您的代碼,最初它會引發IndexOutOfBoundsException

akber("1.0.128.0.0.5");

因此,請檢查您的代碼是否在某處不消耗異常,例如

try {
     exceptionThrowingMethod();
}      
catch(Exception e) {
}

如果exceptionThrowingMethod引發了異常,則代碼將繼續運行,就像未引發exceptionThrowingMethod一樣(但是exceptionThrowingMethod沒有成功執行!)

實際上,盡管上面的代碼允許代碼繼續工作,但是它不能解決問題,因為來自函數128的字節值等於負數或類似的值,並且發送了錯誤的值,因此USB硬件接收到錯誤的字符且無法正常工作...通過查看關於stackoverflow上的“ Java 128字節”的其他文章,得出了與128字節以上的字節代碼相同的結果,即負數相同,因此通過反復試驗解決了它,非常煩人-但更改了這一行至:

    if (x<128) { space++; } else { space+=2;
                int x2 = (x-128)*2;
                x=x-(x*2);
                if (x<-128) { x=x+x2; }
                }

這似乎起作用。 開心的日子,直到發現另一個問題! 對於希望將127以上的值轉換為字節的人們來說,這可能是一個簡單的解決方案,而不是我所看到的,並沒有真正理解的更標准的Java解決方案,因為它更習慣於編寫腳本。 謝謝。

暫無
暫無

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

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