3

編集および解決済み(以下)

Java for Android を使用して、バイト 255 (WriteSingleCoil 関数の 0xFF) を ModBUS サーバー デバイスに送信しようとしています。

デバイスが実行されていません。符号付きバイト -1 を解釈できないためか、CRC の計算が間違っているためかはわかりません。負のバイトの CRC を計算する方法がわかりません。

要約: Java から ModBUS サーバーへのコイルのスイッチをオンにする関数 05 Write Single Coil を 0xFF 値で送信する方法がわかりません。

誰でも私を助けてもらえますか?

解決:

" iIndex = ucCRCLo ^ b: このような操作は、iIndex = (ucCRCLo ^ b)&0xff のように記述する必要があります。これは、& が ucCRCLo、b、および結果を int にキャストするためです。これは 32 ビットですが、short は 16 です。 1に設定された余分なビットの "

この答えは私を助けました。TheDayOfcondorに感謝します

しかし、私の大きな問題は、符号付きバイトに関する Java の通常の問題でもありました。私の CRC 計算関数は、符号なしバイトに対して正しく実行されますが、符号付きバイト内を渡すとエラーが発生します。ModBUS 通信でバイトを使用するための秘訣は、アプリ全体で short をバイトとして使用することです。これは、0 ~ 255 の範囲を持ち、trames と CRC を計算することもできます。そして、最後のステップでのみ、trame を ModBUS サーバーに送信するときに、再度バイトにキャストします。これは実行中です。

それが将来誰かに役立つことを願っています。

問題の説明:

関数 05 で ModBUS にコイルをオンに設定しようとしています。これは関数の説明です。

リクエスト

アドレス1のコイルをオンにしようとしています:

このヘックス: 0A 05 00 01 ff 00 DC 81

このバイト配列: 10 5 0 1 255 0 220 129

10: スレーブ アドレス (10 = 0A hex)

05: 機能コード (Force Single Coil)

0001: コイルのデータ アドレス。(コイル番号 1 = 01 hex)

FF00: 書き込むステータス ( FF00 = ON、0000 = OFF )

DC81: エラー チェック用の CRC (Cyclic Redundancy Check)。

問題は、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;
}
4

1 に答える 1

1

問題はあまり明確ではありませんが、バイトを扱う最も一般的な問題は、Javaに符号なしバイトがなく、ブール演算が常にintの間にあるという事実です。

バイトを処理する最良の方法は、整数を使用し、すべての操作を0xffで行うことです。また、右シフトには>>>を使用します(これは署名されていないバージョンです)

例:

byte b =(byte)(255&0xff)//「符号なしバイト」を提供します

バイトb=(バイト)((b << 2)0xff)//左シフトは切り捨てる必要があります

CRCを計算するためにコードを投稿すると、私はそれを調べることができます

負の数を使用せずにバイト配列を定義する最良の方法は、次のとおりです。

byte[]={ (byte)0xff, (byte)0xff, (byte)0xff };
于 2012-11-05T12:28:52.047 に答える