Matlab và Serial Port

ctcngh

Thành Viên PIF
Mình đang muốn đọc giá trị UART gửi lên từ MCU để vẽ đồ thị trên matlab. Có tham khảo code trên mạng mà nó cứ hay bị báo là cổng COM không xài được, không tìm thấy,.... Cả buổi đành phải chép từ terminal qua mà vẽ, chưa làm cái đồ thị thời gian thực được.
Không biết có bạn nào làm về cái này chưa, giúp mình với.
 

mafiaWolf

Chủ tịch Hội phụ nữ PIF
Trong CLB có hướng dẫn cách tạo GUI mà... Thông báo đó cũng hay xảy ra nếu mà đang giao tiếp mà mình đột ngột rút mà không disconnect cũng bị
 

2death

Cố Vấn CLB
Staff member
Mình đang muốn đọc giá trị UART gửi lên từ MCU để vẽ đồ thị trên matlab. Có tham khảo code trên mạng mà nó cứ hay bị báo là cổng COM không xài được, không tìm thấy,.... Cả buổi đành phải chép từ terminal qua mà vẽ, chưa làm cái đồ thị thời gian thực được.
Không biết có bạn nào làm về cái này chưa, giúp mình với.
Em có thể dùng C# để vẽ đồ thị được mà, như hướng dẫn trong các lớp Cx của CLB :D

Còn muốn dùng Matlab, trước hết em phải biết cách kiểm tra cổng COM của mình trạng thái như thế nào, có thể tra "help" của matlab với keyword là "serial" hoặc xem ở: http://www.mathworks.com/help/matlab/ref/serial.html

Từ commandline của matlab, em có thể gõ lệnh: s1 = serial('COM1') (hay COM mấy đó tuỳ em, s1 chỉ là 1 cái biến thôi, em muốn đặt nó là cái giống gì cũng được), thì nó sẽ trả về cho em các info của cổng COM đó, chẳng hạn như sau:

Code:
   Serial Port Object : Serial-COM1
 
   Communication Settings 
      Port:               COM1
      BaudRate:           9600
      Terminator:         'LF'
 
   Communication State 
      Status:             closed
      RecordStatus:       off
 
   Read/Write State  
      TransferStatus:     idle
      BytesAvailable:     0
      ValuesReceived:     0
      ValuesSent:         0
Có các lệnh mở cổng, đóng cổng như (fclose, fopen,...) xem ở: http://www.mathworks.com/help/matlab/ref/serial.fclose.html
v.v. vận dụng kĩ năng google thần thánh để tìm tiếp.

Một thông số quan trọng của COM port (có thể khác nhau với mỗi máy tính, nên nhất định em phải kiểm tra với máy của mình), đó là Terminator. Chẳng hạn như trong ví dụ trên, Terminator: là kí tự 'LF' (linefeed). Đây là kí tự có ý nghĩa kết thúc chuỗi data mà cổng COM nhận được.

Chính vì vậy, data từ MCU gửi lên, để nhận qua cổng COM dùng Matlab, phải kết thúc bằng kí tự 'LF' để nhận biết kết thúc chuỗi dữ liệu.

Khi dùng GUI của matlab, cái ô text mà em để hiển thị data đó, trong property em phải cho ô đó có ít nhất 2 lines (vì 'LF' tự nó đã thêm 1 line rồi, nên em để 1 line sẽ không hiển thị được kết quả).

Data nhận về, đương nhiên là kiểu string, vì thế, em phải đổi sang kiểu số, ví dụ xài str2num, str2double,...:D
 

nguyễn đình huân

Cố Vấn CLB
Bạn có thể sử dụng simulink để đọc dữ liệu và vẽ như sau. Cắm cáp usb nối mcu với pc, mở MATLAB. Bạn mở simulink->tạo một model mới-> kéo thả vào đấy khối Serial receive và khối out1.

click vào khối Serial receive để chỉnh các thông số. Ví dụ ta muốn truyền 1 kênh dữ liệu kiểu uint16 thì chọn như hình trên. Nếu muốn truyền 2 kênh ta chọn data size là [1 2] hay [2 1].Bấm apply->khối serial configuration sẽ hiện ra, bạn chỉnh tiếp các thông số.
Code trên mcu để truyền 1 kênh dữ liệu kiểu uint16:
Code:
    uint8_t buf[2];
    buf[0] = val[0]&0XFF;
    buf[1] = (val[0]>>8)&0XFF;
    SendUART(buf,2);
Để vẽ đồ thị, bạn click phải vào dây nối từ khối serial receive ra, chọn Connect & create Viewer->Simulink->Scope. Cách khác là nối với khối Scope trong simulink.
Việc còn lại là bấm run :)+ double click vào cái mắt kiếng(hay khối Scope).
Để chỉnh thời gian thu thập data bạn vào thẻ Simulation->Configuration parameters->solver, thay đổi stop time. Tiện thể chọn luôn Type: fixed-step, solver: discrete để khỏi hiện dòng warning khi chạy.:D

Lưu ý: cắm cáp usb trước khi mở MATLAB
 
Top