2009-06-01 67 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味精是這裏的問題。我還確認,該設備在使用C代碼進行測試時工作。

我已經仔細閱讀了JNA文檔......我想。任何指針。謝謝大家。

回答

1

我對JNA瞭解不多,但是當指針作爲簡單地址傳輸時,語言間數據傳輸通常會失敗。

如果這是它指向你想要發送的數據,那麼可能有一個打包方法在那裏調用。如果你沒有自己編寫它,也許它是由JNA框架生成的......可能對將它添加到你的問題很有用。

將C char映射到Java字節對我來說也有點奇怪,但我可以看到可能來自哪裏。你運行這個代碼的操作系統是什麼?

+0

所以,需要補充的是,JNA有很多實例記錄。 如何翻譯結構: https://jna.dev.java.net/javadoc/overview-summary.html#structures 類型的翻譯進一步在頁面上。 因此,他們可以做到這一點...爲什麼我不能!無論如何。感謝您的意見。 – tyeh26 2009-06-01 17:59:03

1

len是結構的大小?如是;那麼你給的價值是錯誤的。這樣做:

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]數組的數量,或者根據終止的空字符(假設String ASCII是數據)來計算len。我不認爲CANMsg.size()存在或像上面提到的Rusty一樣實現。