2009-06-01 18 views
4

JNAを使用して、コンピュータに接続されたUSBデバイスを介して通信しようとしています。 Javaと私に提供された.dllを使用しています。JNAの参照構造による継承構造

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 msgが問題であると仮定しています。また、Cのみのコードでテストしたときにデバイスが動作することを確認しました。

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

答えて

1

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

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

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

+0

それで、JNAにはたくさんの例が書かれています。 翻訳の仕方structs: https://jna.dev.java.net/javadoc/overview-summary.html#structures さらにタイプの翻訳がページに表示されます。 だから彼らはそれをすることができます...なぜ私はできません!いずれかの方法。入力のおかげで。 – tyeh26

1

構造の大きさは?そうであれば;あなたが与えた価値は間違っています。これを行う:

CANMsg msg = new CANMsg(); 
msg.len = msg.size(); 
1

私もcanplus_writeインターフェイスに問題があります。これまでのところ、すべてが提供されたドライバのバグを指しています - 私は、新しいUSBCANPlusモジュールがまだ適切なテスト段階を経ていないと思います。あなたのコードから、データフィールドは8バイト(CANメッセージのデータバイトの最大数)である必要があるため、古いバージョンのドライバを使用していることがわかります。私が自分の調査で見つけたことは、ドライバーがデータをASCII文字に正しく変換できないことです。つまり、01 02 03を送信する場合は、代わりにASCII文字 '1' '2' '3'をモジュールに送信します'0' '1' '0' '2' '0' '3' - あなたはこれを確認するためにUSB監視ソフトウェアを使用することができます。私は現時点でFTDIテクニカルサポートに連絡しており、すぐにドライバーのアップデートバージョンをリリースすることを望んでいます。

これがあなたの問題を解決してくれることを願って、私もそれらに連絡することをお勧めします。

0

使用しているDLLについてはわかりませんが、CANMsg.lenは実際にはbyte []データにいくつのバイトが入っているかを示す可能性があります。したがって、バイト[16]データ配列に書き込む量を追跡したり、終了文字列(文字列ASCIIがデータであると仮定)に基づいてlenを計算する必要があります。私はCANMsg.size()が存在するとは思っていません。あるいは上記のRustyのように実装されています。