2012-11-05 83 views
3

EDITED & SOVLED(下同)發送0xFF和有符號字節計算CRC - WriteSingleCoil與Modbus和Java的和Android -

我使用Java的Android嘗試發送255字節(0xFF的WriteSingleCoil功能)到ModBUS服務器設備。

設備不運行,我不知道是否因爲無法解釋有符號的字節-1或由於我錯誤的計算CRC。 我不知道如何計算負數字節的CRC。

總結:我不知道如何發送函數05 Write Single Coil with 0xFF value for switch on the coil for from Java to ModBUS server。

任何人都可以幫助我嗎?

SOLUTION:

「iIndex = ucCRCLo^B:這樣的操作必須被寫爲iIndex =(ucCRCLo^B)& 0xff的,因爲&會施放ucCRCLo,b和將結果詮釋,這是32位,而短是16,所以你將有很多 額外位設置爲1「

此答案幫助了我。非常感謝TheDayOfcondor

但也是我的巨大問題是Java中帶符號字節的常見問題。我的CRC計算函數正確地處理無符號字節,但是如果我傳入內部有符號字節,它會給出錯誤。 ModBUS通信字節工作的技巧是在整個應用程序中以短字節爲單位進行工作,範圍爲0-255,甚至可以計算trames和CRC。只有在最後一步,發送Trame到ModBUS服務器時,再次將它們轉換爲字節。這是在運行。

希望這對將來的人有所幫助。

說明問題:

我想設置一個線圈與功能05 MODBUS,這是功能解釋:

請求

我tryiing設置ON

這十六進制:上地址1的線圈05 0A 00 01 FF 00 81 DC

該字節陣列:10 5 0 1 255 0 220 129

10:該從屬地址(10 = 0A十六進制)

05:功能代碼(強制單個線圈)

0001:的數據地址線圈。 (線圈#1 = 01進制)

FF00:寫狀態(FF00 = ON,0000 = OFF)

DC81:對於錯誤檢查的CRC(循環冗餘校驗)。

事情是Java使用帶符號的字節,所以我不能把255放在我的字節數組上。 我知道我應該把-1,但然後我無法正確計算CRC,因爲我有幾個預先計算的字節數組獲取CRC,但函數發送負指數。

所以:我不知道我是否正確地嘗試發送-1,如果我有發送255的替代方法,也不知道如何計算-1的CRC。

這是計算CRC功能:

public short[] GenerateCRC (byte[] pMsg) { 
    short ucCRCHi = 0xFF; 
    short ucCRCLo = 0xFF; 
    int iIndex; 

    for (byte b : pMsg) 
    { 
     iIndex = ucCRCLo^b; 

     try { 
      ucCRCLo = (short)(ucCRCHi^aucCRCHi[ (iIndex) ]); 
      ucCRCHi = aucCRCLo[ (iIndex) ]; 
     } catch (Exception e) { 
      Log.e(LOGTAG, "GenerateCRC: " + e.toString(), e); 
      e.printStackTrace(); 
     } 
    } 

     short[]result= new short[2]; 
     result0]= ucCRCHi; 
     result1]= ucCRCLo; 

     return result; 
} 

回答

1

的問題不是很清楚 - 但是,處理的字節最常見的問題是事實,Java沒有無符號字節,布爾運算總是之間int

處理字節的最好方法是使用整數,每個操作都使用0xff。還使用>>>爲右移(它是無符號版本)

實施例:

字節B =(字節)(255 & 0xff的)//給你 「無符號字節」

字節b =(字節)((二< < 2)爲0xFF)如果您發佈您的代碼來計算CRC //左移必須被截斷

我可以看看到它

的最好方式定義一個沒有usi的字節數組ng負數是這樣的:

byte[]={ (byte)0xff, (byte)0xff, (byte)0xff }; 
+0

嗨。非常感謝您的幫助。 抱歉不太清楚,我會盡力詳細解釋。 我已編輯帖子以提供更多信息。 –

+0

iIndex = ucCRCLo^b:像這樣的操作必須寫成iIndex =(ucCRCLo^b)&0xff,因爲&會將ucCRCLo,b和結果轉換爲int,32位,而short是16,所以您將有很多額外的位設置爲1 – thedayofcondor

+0

好的!再次感謝您的幫助。 CRC計算功能正在運行,但我仍未成功與ModBUS服務器通信。但我認爲問題在服務器內部,無法管理簽名字節。 所以我會尋找一個替代方案來設置值ON。 非常感謝。 –