4

JNA を使用して、コンピューターに接続された USB デバイスを介して通信しようとしています。Java と提供された .dll を使用します。書き込み機能に問題があります:

C コード:

typedef struct {
    unsigned int id;
    unsigned int timestamp;
    unsigned char flags;
    unsigned char len;
    unsigned char data[16];
} CANMsg;

CAN_STATUS canplus_Write(
        CANHANDLE handle, //long
        CANMsg *msg
    );

同等のJava:

public class CANMsg extends Structure{
    public int id = 0;
    public int timestamp = 0;
    public byte flags = 0;
    public byte len = 8;
    public byte data[] = new byte[16];
}

int canplus_Write(NativeLong handle, CANMsg msg);

開閉できることを確認しております。閉じるには NativeLong ハンドルが必要なので、ここでは CANMsg メッセージが問題であると想定しています。また、C のみのコードでテストした場合、デバイスが動作することも確認しています。

私はJNAのドキュメントを徹底的に読みました...と思います。任意のポインター。皆さんありがとう。

4

4 に答える 4

1

私もcanplus_writeインターフェースに問題があります。これまでのところ、すべてが提供されたドライバーのバグを示しています-新しいUSBCANPlusモジュールはまだ適切なテスト段階を経ていないと思います。コードから、データフィールドは8バイト(CANメッセージのデータバイトの最大数)で構成されている必要があるため、最初に古いバージョンのドライバーを使用していることがわかります。私自身の調査でわかったことは、ドライバーがデータをASCII文字に適切に変換できないことです。つまり、01 02 03を送信する場合は、代わりにASCII文字「1」「2」「3」をモジュールに送信します。 of'0''1''0''2''0''3'-USB監視ソフトウェアを使用してこれを確認できます。

これであなたの問題も解決することを願っています。私も彼らと連絡を取ることをお勧めします。

于 2009-08-06T16:48:59.787 に答える
1

JNAについてはよくわかりませんが、ポインタが単純なアドレスとして転送されると、言語間のデータ転送は通常失敗します。

それが送信したいデータを指している場合、おそらくどこかにパッケージ化メソッド呼び出しがあります。自分で書いていない場合は、この JNA フレームワークによって生成されている可能性があります...質問に追加すると役立つ場合があります。

C char を Java バイトにマッピングすることも少し奇妙ですが、それがどこから来たのかはわかります。このコードを実行しているオペレーティング システムは何ですか?

于 2009-06-01T17:48:45.587 に答える
1

len は構造体のサイズですか? もし、そうなら; あなたが与えた値は間違っています。これを行う:

CANMsg msg = new CANMsg();
msg.len = msg.size();
于 2009-07-29T17:44:52.750 に答える
0

使用しているdllについては何も知りませんが、CANMsg.lenは実際にbyte []データに含まれるバイト数を参照している可能性が高いです。したがって、byte[16] データ配列に書き込む量を追跡するか、終端の null char に基づいて len を計算する必要があります (文字列 ASCII がデータであると仮定します)。CANMsg.size() が存在しないか、上記の Rusty が示唆するように実装されているとは思いません。

于 2010-06-10T13:17:34.853 に答える