2012-02-21 7 views
5

Tôi đang cố gắng viết một GUI MATLAB sử dụng giao diện XBee-API để nói chuyện với đài vô tuyến XBee trên bo mạch Arduino. GUI chủ yếu thu thập dữ liệu và phân tích các gói dữ liệu đến.Thực hiện giao diện Java trong MATLAB

Tôi muốn thực hiện addPacketListener như được xác định trong the Developer's Guide (see section "Receiving Packets") để chờ các gói xử lý. Trong Java, đây là cách nó sẽ được thực hiện:

xbee.addPacketListener(new PacketListener() { 
    public void processResponse(XBeeResponse response) { 
     // handle the response 
    } 
}); 

Trong MATLAB, tôi sẽ làm một addlistener() và thiết lập cuộc gọi lại của mình để làm chế biến của tôi.

Tôi không biết nhiều ở tất cả về Java, vì vậy tôi đã tự hỏi nếu nó có thể thiết lập mã processResponse một MATLAB la: Tôi có thể làm điều gì đó giống như sau:

function processResponse 
    #% do response here 
end 

>> xbee.addPacketListener(@processResponse) 

Tôi không chắc chắn nếu điều này có ý nghĩa hoàn toàn; về cơ bản những gì tôi đang cố gắng thực hiện là thực hiện một cuộc gọi lại khi các gói mới có sẵn cho XBee của tôi (mà trong Java được xử lý bởi addPacketListener).

+0

Tôi không hiểu đầy đủ những gì bạn đang yêu cầu. Khi bạn gọi phương thức addPacketListener như minh họa ở trên, bạn truyền vào một đối tượng mới (một lớp bên trong vô danh), phương thức processResponse của nó sẽ được gọi khi các gói đến. Đây là cuộc gọi lại - chỉ cần điền vào phần "xử lý phản hồi". – cutchin

+0

@cutchin vì vậy tôi có thể viết một lớp MATLAB riêng biệt để xuất một phương thức 'processResponse' và chuyển một thể hiện của lớp đó tới' addPacketListener'? Tôi đã cố gắng đi qua trong một đối tượng MATLAB với một phương thức 'processResponse' và có lỗi sau:' XB.addPacketListener (testclass) Không có phương thức 'addPacketListener' với chữ ký phù hợp được tìm thấy cho lớp 'com.rapplogic.xbee.api.XBee'' –

+0

Tôi không phải là một chuyên gia tích hợp MATLAB, nhưng tôi tin rằng bạn đang đi về phía sau này. Viết mã java của bạn để kích hoạt giao diện XBee và nhận các gói dữ liệu trước. Hãy chắc chắn rằng nó hoạt động từ dòng lệnh và bạn có thể thấy các gói tin đến. Từ đó, hãy viết một thư viện (một tệp .jar) mà bạn sẽ nhập vào matlib và lấy nó từ lớp của bạn như được mô tả ở đây (http://www.mathworks.com/help/techdoc/matlab_external/f6671 .html). – cutchin

Trả lời

3

Hãy cho tôi biết nếu tôi sai, nhưng có vẻ như bạn về cơ bản muốn chặn cuộc gọi của XBee tới PacketListener.processResponse(XBeeResponse x) và MATLAB xử lý nội dung của đối tượng đến XBeeResponse. Tôi không phải là một chuyên gia MATLAB, nhưng thậm chí có thể thực hiện một lớp Java bằng cách sử dụng mã MATLAB, và sau đó chuyển lớp đó về Java? Đoán của tôi có lẽ là không, nhưng tôi có thể sai.

Tôi nghĩ rằng vấn đề bạn đang gặp phải ở đây bắt nguồn từ thực tế là thật dễ dàng để thực hiện cuộc gọi MATLAB trên các đối tượng Java, nhưng không phải là cách khác xung quanh. Những gì tôi muốn làm là thực hiện một thực hiện đơn giản thực sự của PacketListener bằng cách sử dụng mã Java, và sau đó sử dụng một thư viện của bên thứ ba như matlabcontrol để thực hiện các cuộc gọi hàm từ thực thi Java PacketListener của bạn trở lại MATLAB.

Tôi phải giải quyết vấn đề này trên một dự án phần mềm lớn yêu cầu GUI được viết bằng Java để thực hiện cuộc gọi trên mã back-end được viết bằng MATLAB, vì vậy tôi có thể xác minh khả năng của MATLAB. Một tài nguyên quan trọng khác khi kiểm soát MATLAB từ bên trong Java, bạn nên đi theo con đường này, là undocumentedmatlab.com.

EDIT

Một điều khác để cảnh giác với được luồng ở phía Java. Bạn có thể có bất kỳ số lượng các chủ đề Java nào thực hiện các cuộc gọi MatLab cùng một lúc, nhưng MatLab sẽ "tuần tự hóa" tất cả các cuộc gọi từ Java. Giả sử Java cần gọi các hàm MatLab "f1" và "f2". Bạn thiết lập hai chủ đề Java và mỗi chủ đề gọi là f1 hoặc f2, cùng một lúc. MatLab sẽ buộc một người phải chờ cho người kia kết thúc trước khi bắt đầu cuộc gọi chức năng thứ hai, và hoàn toàn không xác định cái nào thực sự sẽ được gọi trước.

Lý do tôi nói điều này là, bất kỳ chủ đề Java nào gọi hàm processResponse(XBeeResponse x) sẽ bị chặn nếu nó thực hiện cuộc gọi tới MatLab và MatLab đã bận làm một việc khác. Nó có thể là tốt nhất để có PacketListener bộ nhớ cache của bạn đến XBeeResponse trường hợp để XBee không gặp khó khăn chờ đợi cho MatLab để xử lý dữ liệu. Chỉ là một thứ để ghi nhớ trong đầu.

+0

Bạn chắc chắn có thể truyền dữ liệu qua lại từ MATLAB đến Java, khá dễ dàng trong thực tế. – macduff

+0

matlabcontrol là một công cụ tuyệt vời. Cảm ơn! –

-1

Để giao tiếp MATLAB với Java, hãy thực hiện theo các yêu cầu giao diện trong Bringing Java Classes and Methods into MATLAB Workspace.

Điều quan trọng nhất là thêm đường dẫn đến các lớp jars Java của bạn vào đường dẫn javaclass và sau đó gọi các hàm tạo, phương thức, v.v.