PDA

View Full Version : Giao tiếp RS232 trên PC qua Matlab


ngohaibac
17-11-2006, 04:24 PM
Mình đã viết bài này tại địa chỉ:
http://dientuvietnam.net/forums/showthread.php?t=3312&page=2

Để biết thêm chi tiết về giao tiếp với PC qua cổng RS232 qua Matlab các bạn dùng Help của Matlab và search với từ khóa: serial.

Việc giao tiếp này cũng rất dễ dàng thực hiện, không có gì là quá cao siêu cả. Mình đã giao tiếp thành công rùi. Để test nó các bạn hãy đấu tắt 2 chân 2 và 3 (TX và RX) của cổng COM lại.

Đầu tiên mình sẽ đưa ra môt chương trình thật là đơn gian, thiết lập ít tham số, còn chi tiết về thiết lập tham số nó thế nào? ý nghĩa ra sao? thì sẽ nói sau, mình cứ làm đơn giản trước rùi phức tạp -> hiểu hết về thiết lập này sau.

Bài này mình giới thiệu cách tạo đối tượng, kết nối, viêt hàm callback.

Tạo đối tượng:
Chúng ta gõ lệnh và kết quả hiện luôn (nhớ là k có dấu ; ở cuối lệnh
>> s = serial('COM1')

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

Như vậy đối tượng là Serial-COM1, tốc độ 9600,..

Tiếp theo, chúng ta xem các tham số của đối tượng như thế nào bằng lệnh get(s):
>> get(s)
ByteOrder = littleEndian
BytesAvailable = 0
BytesAvailableFcn =
BytesAvailableFcnCount = 48
BytesAvailableFcnMode = terminator
BytesToOutput = 0
ErrorFcn =
InputBufferSize = 512
Name = Serial-COM1
ObjectVisibility = on
OutputBufferSize = 512
OutputEmptyFcn =
RecordDetail = compact
RecordMode = overwrite
RecordName = record.txt
RecordStatus = off
Status = closed
Tag =
Timeout = 10
TimerFcn =
TimerPeriod = 1
TransferStatus = idle
Type = serial
UserData = []
ValuesReceived = 0
ValuesSent = 0

SERIAL specific properties:
BaudRate = 9600
BreakInterruptFcn =
DataBits = 8
DataTerminalReady = on
FlowControl = none
Parity = none
PinStatus = [1x1 struct]
PinStatusFcn =
Port = COM1
ReadAsyncMode = continuous
RequestToSend = on
StopBits = 1
Terminator = LF
Các bạn thấy là có rất nhiều tham số phải không? chúng ta ở đây quan tâm đến tham số: BytesAvailableFcn tham số này chưa thết lập. Tham số này chính là hàm callback mà nó sẽ gọi khi có byte nhận được ở bộ đệm nhận.Vậy chúng ta viết hàm này chính là viết hàm OnComm đáp ứng sự kiện ReceiveEvent như trong MSCOMM của MS vậy.

Thiết lập này phải thực hiện trước khi mở cổng để giao tiếp, nên chúng ta sẽ viết hàm callback trước. Bạn viết 1 m-file với tên Serial_Callback.m như sau:
function Serial_Callback(obj,event)
ind = fscanf(obj)


Cú pháp của hàm callback như trên với obj là đối tượng kiểu Serial như trên. Hàm có tác dụng đọc dữ liệu và hiển thị luôn kết quả lên command window.

Chúng ta đưa tham số tên hàm vào cho đối tượng s của ta:

>> s.BytesAvailableFcn = @Serial_Callback;


Tiếp theo chúng ta bắt đầu giao tiếp:
>>fopen(s);
>>fprintf(s,"chao cac ban");

Sau đó các bạn xem kết quả thế nào, sau đó thử truyền các kí tự khác xem bằng lệnh fprintf(s,...), hoặc thử với vi xử lý xem cho nó truyền lên các bạn sẽ thấy rất hay.

Bạn không giao tiếp nữa thì đóng cổng lại:
>>fclose(s);

Mình viết tiếp sau còn giờ đi ngủ đã.

Chúc các bạn thành công.

ngohaibac
26-12-2006, 08:35 AM
Chào tất cả mọi người,

Hôm qua vừa thi xong được một môn, làm bài cũng gọi là tạm tạm không biết được mấy điểm :D. Sau nửa ngày hăng say lập trình :D, mình xin gửi mọi người một chương trình giao tiếp RS232 bằng Matlab.

Giao diện của nó như sau:

http://i36.photobucket.com/albums/e46/ngohaibac/Matlab%20Simulink/PVN_0101.gif


Cách dùng:

1/ Chọn tham số cho Rs232 rùi ấn nút Connect để bắt đầu kết nối với RS232 nhé.

2/ Nhập dữ liệu vào ô TX rùi nhấn nút Send để gửi dữ liệu.

3/ Để thay đổi tham số (tốc độ, ..) cho RS232 thì phải nhấn Disconnect trước rùi chỉnh tham số nhé. Sau đó quay lại bước 1.

Các bạn chú ý, đây là chương trình mình viết dưới dạng mở, tức là các bạn có thể thêm code vào các hàm để phục vụ mục đích của mình. Đó chính là các hàm ngắt nhận, ngắt gửi,...

BytesAvailableFcnCount là số byte nhận được trong bộ đệm nhận trước khi xảy ra ngắt nhận.

Các hàm đó là:

function ByteAvailable_Callback(obj, event)
function OutputEmpty_Callback(obj, event)
function Error_Callback (obj, event)
function PinStatus_Callback(obj, event)
function Timer_Callback (obj,event)
function BreakInterrupt_Callback(obj, event)


Chương trình này dùng GUI nên để biết thêm chi tiết về cách lập trình và chạy chuơng trình mời các bạn vào luồng Lập trình GUI trên Matlab ở www.dientuvietnam.net nhé:

http://dientuvietnam.net/forums/showthread.php?t=594

Trong chương trình, bạn có thể dùng chức năng About để xem hướng dẫn (User Manual), mình mới chỉ viết bằng tiếng Anh thôi.

Chương trình mình đã test khi nối tắt 2 chân 2 và 3 của RS232 lại với nhau. Còn với Vi điều khiển, .. mong các bạn test nhé.

Chúc các bạn thành công.

ngohaibac
05-01-2007, 03:08 PM
Chào các bạn,

Khi các bạn muốn thao tác với dữ liệu vừa nhận được thì các bạn edit thêm code trong hàm sau:

function ByteAvailable_Callback(obj, event)

Mà không thấy ai có ý kiến gì nhỉ? Các bạn dùng có vấn đề gì không nhỉ ?

Mình rất mong có đóng góp ý kiến của các bạn để cho chương trình được hoạt động tốt hơn. Các bạn có thể đặt câu hỏi, mình sẽ trả lời các bạn ngay khi có thể.

Chúc các bạn thành công.

t3i
10-01-2007, 03:20 PM
Mình thấy đây là một đề tài rất hay đấy. Mình đã test chương trình của bạn ngohaibac và cho giao tiếp với Vi điều khiển, thêm một số hàm và lệnh theo ý muốn và có kết quả tương đối tốt. Trước đây mình thường dùng VB để viết giao diện, nay đọc chương trình mẫu của Bắc mình làm ứng dụng tương tự như viết trong VB và không thấy phức tạp hơn là mấy.
Có vẻ như việc chọn gui và serial matlab để viết giao diện còn chưa được nhiều người chú ý thì phải?

ngohaibac
10-01-2007, 04:40 PM
Chào bạn.

Rất cảm ơn bạn đã test chương trình của mình. Nếu chương trình có gì cần chú ý thì xin bạn cho ý kiến để mình hoàn thiện chương trình hơn.

Mọi người không chú ý đến nhiều Matlab có thể do nó khó chăng? hoặc có thể là nó nặng quá không chạy được :D. Nhưng mình thấy Matlab rất là hay.

Trong thời gian tới, mình sẽ nghiên cứu thêm labview để viết giao tiếp máy tính. Dùng Labview sẽ có nhiều điều còn thú vị hơn nữa. Qua Labview bạn có thể dễ dàng giao tiếp với LPT, RS232, PCI,..

Chúc các bạn thành công.

phamvanthang
09-03-2007, 01:06 AM
Tôi muốn thực hiện một ứng dụng thế này: Lập trình một chương trình điều khiển robot trên máy tính và đưa chương trình cho PIC thực hiện, tức là PIC đóng vai trò của một card giao tiếp giữa máy tính và robot. Như vậy có được không nhỉ? Mong mọi người cho ý kiến

ngohaibac
09-03-2007, 10:55 PM
@phamvanthang: Chào bạn, mình nghĩ là có thể làm được. PC sẽ tính toán đưa ra các tham số thích hợp điều khiển cho robot, các tham số này truyền xuống cho PIC. PIC có thể đóng vai trò như Master truyền các tham số thích hợp cho các slave khác trong robot.

Việc thu thập dữ liệu được truyền liên tục hoặc theo chu kì từ các Slave lên Master và truyền lên PC. Nếu PIC dùng để lưu trữ dữ liệu nhiều thì chắc là phải thêm RAM rùi.

Trên đây là suy nghĩ của mình.

ngohaibac
10-03-2007, 12:29 AM
Chào các bạn.

Mình đã sửa lại một tí để fix một số lỗi trong quá trình trao đổi dữ liệu giữa các hàm Callback bằng cách sử dụng cấu trúc handles, trao đổi giữa hàm ngắt của Serial Object bằng biến toàn cục global hand.

Bây giờ các hàm sẽ không phải trao đổi dữ liệu qua data.mat nữa, tránh được lỗi khi save và load nhiều thì file này bị hỏng.

Chúc các bạn thành công.

Nguoi hieu hoc
13-04-2007, 07:43 PM
Anh Bắc cho em hỏi 1 tí:
Trong file Rs232 Comunication.m
phần
function RS232_Communication_OpeningFcn(hObject, eventdata, handles, varargin)
handles.output = hObject;
guidata(hObject, handles);

có tác dụng gì vậy anh? Nếu không có 2 dòng này thì chương trình ko chạy dc.
handles.status_com = IsConnect; dòng naỳ là để đưa ra tình trạng cổng Com là chưa nối hả anh? phần status_com là của cái nào thế anh?
em đọc trong help có nói nếu khai báo s = serial('COM1'); thì s.status là tình trạng cổng Com open hay close , còn status_com này thì em chưa hiểu , nó là tag nào của phần tử nào trong file *.fig vậy anh?
guidata(hObject,handles); dòng này để lưu lại biến handles hả anh ? có tác dụng như thế nào vậy anh?
function button_Send_Callback(hObject, eventdata, handles)
IsConnect = handles.status_com;
s = handles.com;
là thế nào vậy anh ? sao file *.m này biết rõ tag com là của ai? em đâu có thấy anh khai báo đối tượng nào là com đâu . Chẳng lẽ nó ngầm hiểu là cổng Com luôn hả anh?
function button_Send_Callback(hObject, eventdata, handles)
strTX = get(handles.edit_TX,'String');
fprintf(s,strTX);
vậy là anh truyền chuỗi hả anh , và 1 byte hả anh?
handles.com = s;
guidata(hObject,handles);
2 dòng này đẻ làm gì vậy anh?biến s là biến toàn cục nên ta lưu giá trị của nó lại cho các function khác dùng hả anh?
function button_Connect_Callback(hObject, eventdata, handles)
s = serial(get_stringPopup(handles.popup_ComPort));
nếu s là toàn cục vậy tại sao ở function nút Connect dc bấm lại có khai báo s như thế này chi vậy anh ? chọn lại s là 1 trong các cổng Com hả anh? vậy biến s khai báo ở mấy hàm khác chi vậy anh?
s.BytesAvailableFcn = @BytesAvailable_Callback;
s.OutputEmptyFcn = @OutputEmpty_Callback;
s.BreakInterruptFcn = @BreakInterrupt_Callback;
s.ErrorFcn = @Error_Callback;
s.PinStatusFcn = @PinStatus_Callback;
s.BreakInterruptFcn = @BreakInterrupt_Callback;
s.TimerFcn = @Timer_Callback;
phần này để chi vậy anh , có dấu @ để làm gì vậy anh?
em chỉ thấy anh ghi code cho
bytesAvailable_callback như sau:
global hand;
ind = fscanf(obj);
set(hand.edit_RX,'String',ind);
biến ind ở đây là đọc giá trị đưa vào hả anh?

s.RecordName = get(handles.edit_RecordName,'String');s
s.RecordMode = 'index';
tại sao chúng ta phải có phần record này vậy anh?
function figure1_DeleteFcn(hObject, eventdata, handles)
IsConnect = handles.status_com;
if (IsConnect == 1),
s = handles.com;
record(s,'off')
fclose(s);
delete(s);
clear s;
IsConnect = 0;
end
delete(hObject);
còn function deletefcn có tác dụng gì vậy anh?
function figure1_CloseRequestFcn(hObject, eventdata, handles)
IsConnect = handles.status_com;
if (IsConnect == 1),
s = handles.com;
record(s,'off');
fclose(s);
delete(s);
clear s;
IsConnect = 0;
end
delete(hObject);
function này có tác dụng gì vậy anh?

s.BytesAvailableFcnCount = 1;
s.BytesAvailableFcnMode = 'terminator';
ở đây anh chỉ truyền 1 byte theo kiểu ASCII thôi hả anh? muốn 3 byte mình chỉ thay đổi s.BytesAvailableFcnCount = 3; là được hả anh?

Em thấy trong phần Simulink có hỗ trợ RS 232 luôn , sao lấy ở đó hỗ trợ được không anh? Em mới làm quen với Matlab và giao tiếp cồng Com , xin anh chỉ giáo ạ (^_^)

À anh

ngohaibac
14-04-2007, 02:52 AM
function RS232_Communication_OpeningFcn(hObject, eventdata, handles, varargin)
handles.output = hObject;
guidata(hObject, handles);

Em tra cứu lệnh guidata nhé.

Handles là một cấu trúc, và output là một trường của nó lưu trữ đầu ra của hàm mà em. Các điều khiển menu, button,.. của em sẽ được truy nhập qua cấu trúc này.

guidata(hObject, handles) sẽ lưu dữ liệu của biến handles vào đối tượng hiện tại hObject.

handles.status_com = IsConnect;
guidata(hObject,handles);


status_com là tên của một trường của handles anh tự đặt để từ hàm callback hay openning, .. của điều khiển nào anh cũng truy nhập để đọc ra được giá trị của status_com tức trạng thái của cổng COM đó. còn guidata là lưu lại cấu trúc handles vừa thay đổi vào hObject.

Tham khảo tại đây. (http://www.mathworks.com/access/helpdesk/help/techdoc/index.html?/access/helpdesk/help/techdoc/ref/guidata.html&http://www.mathworks.com/cgi-bin/texis/webinator/search/?db=MSS&prox=page&rorder=750&rprox=750&rdfreq=500&rwfreq=500&rlead=250&sufs=0&order=r&is_summary_on=1&ResultCount=10&query=guidata&submitButtonName=Search)

Mai giải thích tiếp.

Chúc em thành công.

ngohaibac
14-04-2007, 03:08 AM
handles.com = s;
guidata(hObject,handles);


Sau khi anh khởi tạo cho cổng com với các tham số cần thiết vào biến s thì anh lưu vào cấu trúc handles với trường là com.

Còn ở các hàm khác truy nhập vào đối tượng này thông qua handles.com thôi. Khi lấy lại đối tượng này dùng lệnh sau:


s = handles.com;


Có thể thay s bằng bất cứ tên nào em muốn. Không sao cả.


function button_Connect_Callback(hObject, eventdata, handles)
s = serial(get_stringPopup(handles.popup_ComPort));


em xem hàm get_stringPopup() ở dưới nhé. Hàm này trả về String mà người dùng chọn trọng popup_ComPort đó. Em chọn Com1 thì s là đối tượng COM1. còn s không phải là biến global em ạ - anh không dùng cách này. Trong này em có thể thay s bằng tên gì cũng ok đó.

Nếu em muốn dùng biến global cho các hàm thì các hàm phải có cùng khai báo sau trong phần thực hiện hàm.

global s; % ví dụ biến s là global


Lúc nào rảnh lại viết tiếp nhé em.

Chúc em thành công.

Nguoi hieu hoc
18-04-2007, 07:43 PM
Anh Bắc cho em hỏi tí:
Sao em viết chương trình giao tiếp cổng Com giữa Pic 16f877A với máy tính bằng chương trình Matlab của anh đó.
Chương trình trên Pic như sau:
Code:

#include <16F877a.h>
#include <stdlib.h>

#fuses HS,NOWDT,NOPROTECT,NOLVP,PUT
#use delay(clock=20000000)
#use rs232(BAUD=9600,PARITY=N,XMIT=PIN_C6,RCV=PIN_C7)
#use fast_io(B)
#byte PORTA=0x05
#byte PORTB=0x06
#byte PORTC=0x07
#byte PORTD=0x08
int m,d,a,i;
char h;
void main()
{
a=0;
i=0;
h=getc();
if (h='3')
{
for (d=1;d<3;d++)
{
for (i=48;i<56;i++)
{
putc(i);
// ở đây nếu em có delay_ms(100) thì kết quả cũng như ở phía dưới
}
}
}
if (h>null)
{
putc('r');
}
}


Khi em đánh vào chỗ text phần Transmit đó anh , em không thấy tín hiệu trả về ở phần text của receive?

Nếu em tự viết bằng các dòng lệnh trên Command Window đó anh:
Code:

s = serial('COM1','BaudRate',9600);
>> fopen(s)
>> fprintf(s,'3')
>> fscanf(s)
Warning: A timeout occurred before the Terminator was reached.

ans =

012345670123456

nó hiện ra thông báo như thế đó anh ? em không hiểu timeout ở đây có ảnh hưởng gì không nữa?
Theo như em hiểu thì timeout là khoảng thời gian tối đa cho việc đọc và ghi dữ liệu qua cổng Com phải ko anh? Mặc định của nó là 10s
10 s này là cho việc truyền mỗi ký tự hay sao vậy anh ? em đã thử khai báo thay đổi timeout như sau
Code:

>> s.timeout=0.1 % tức là 100 ms

hay cho nó lớn hơn
>> s.timeout=50 % tức là 50s

nhưng sao nó vẫn hiện thông báo :Warning: A timeout occurred before the Terminator was reached

anh chỉ dùm em với.

À ở đây em muốn hỏi thêm về anh là em định dùng chương trình này để mở rộng cho điều khiển động cơ bằng PID. Em sẽ dùng Matlab nhập 3 thông số xuống , sau đó em đọc tín hiệu hồi tiếp từ encoder vể qua Com và vẽ lên đồ thị. Như vậy thì em phải có 1 biến thời gian phải không anh?
Giả sử em cho cứ sau 100 ms ( có lớn quá không anh?) PIC xuất tín hiệu số encoder đọc được qua cổng Com , rồi em theo đoạn code của anh thêm vào:
Code:

function BytesAvailable_Callback(obj,event)
global hand;
ind = fscanf(obj);
% Edit code here - Ngo Hai Bac
set(handles.edit_RX,'String',ind);
set(handles.dulieu,'string','co du lieu');
% em viết thêm:
y =str2double(ind);
axes(handles.dothi);
x = 0:.1:100;
plot(x,y,'k','LineWidth',2);grid

em lấy biến y là tín hiệu đọc từ cổng Com ( đổi ind từ string ra double)
rồi em vẽ đồ thị trên GUI.Nhưng mà em nghĩ biến x ở đây phải là 1 biến theo thời gian thực phải không anh? Vậy em làm sao khai báo biến x theo thời gian thực vậy anh?

Ạnh chỉ em với (^_^)

ngohaibac
19-04-2007, 12:22 AM
Anh không làm CCS nên không rõ ý nghĩ sâu của từng lệnh. Nhưng anh nghĩ thế này. Lệnh h = getc(); nó có chờ khi có dữ liệu ở thanh ghi RXREG không nhỉ? Vì nếu đơn thuần lệnh này chỉ đọc giá trị thanh ghi thì chương trinh này không ổn.

Vì biết khi nào có dữ liệu từ PC gửi xuông?? Do đó xảy ra Timeout là tất nhiên là thời gian mà PC sẽ chờ đọc dữ liệu, chờ mãi không được thì nó phải thôi chứ.

Còn chương trình Matlab em muốn đọc theo thời gian thì làm thế k dc đâu..

Khoảng thời gian mỗi khi em đọc dữ liệu có thể coi như là một chu kì trích mẫu đó em. Do đó,mỗi khi đọc là đọc giá trị Xi, và Yi, chứ không phải x là một vector ở đây đâu :D. Còn lúc nào em thích plot thì plot thôi, ví dụ đọc được 100 giá trị thì xuất thì xuất. Nếu Xi là thời gian thì Xi = T*i;

Em dùng một biến toàn cục global để đếm chỉ số của mảng em nhé.

Chúc em thành công.

ngohaibac
29-10-2007, 09:25 AM
Chào các bạn.

Mình đã sửa lại một số lỗi vớ vẩn của chương trình rùi :D. Terminator là kí tự: CR (carry return).

Chương trình này đã được test với board mạch Spartan 3E và giao tiếp rất cool.

Chỉ còn 1 vấn đề hiển thị trên Edit Box là chưa theo ý của mình thôi. Mình sẽ fix lỗi này trong thời gian sớm nhất.

Chúc các bạn thành công.

ngohaibac
10-11-2007, 01:03 PM
Đã biên dịch thành công ra file .exe của ứng dụng. Máy các bạn không cần cài Matlab vẫn chạy ngon lành :D

Địa chỉ download:
http://bmnhy.dieukhien.net/NOHB/Matlab_Simulink/RS232_Communication_pkg.rar

Các bạn giải nén và chạy file RS232_Communication_pkg.exe nó sẽ tự giải nén ra 2 file: RS232_Communication.exe và RS232_Communication.ctf.

Khi đó chạy file: RS232_Communication.exe để chạy ứng dụng.

Chúc các bạn thành công.

ngohaibac
10-11-2007, 04:59 PM
Chào các bạn. Khi chạy trên máy k cài Matlab yêu cầu phải cài MATLAB Component Runtime (MCR)

Khi chạy thì đầu tiên phải copy file MCRInstaller.exe vào trong thư mục cùng với file RS232_Communication.exe và chạy lại bình thường là được. Đầu tiên nó sẽ yêu cầu cài MCR, cài bình thường. Lần sau chạy sẽ không bắt cài nữa.

Mình dùng Matlab R2007b nên dùng MCR 7.7. Link:
http://www.esnips.com/web/MatlabSimulink

Các bạn downlod 4 phần: MCRInstaller.part1.rar, MCRInstaller.part2.rar, MCRInstaller.part3.rar, MCRInstaller.part4.rar

Chúc các bạn thành công.

toanck86
21-11-2007, 09:49 PM
Hix! down trên esnips chậm quá :(

che_gl
02-02-2008, 12:14 AM
các bạn ở đây cho mình hỏi 1 chút :
mình cũng đang dùng RS232 để kết nối 1 Oszilloscop Tektronix THS720 với cả máy tính qua Matlab ,nhưng vẫn có 1 số câu hỏi liệu có thể truyền dữ liệu từ Oszilloscop vào máy tính qua matlab được ko? tại mình có thử dùng theo hướng dẫn của nguyenhaibac nhưng mình nhận được từ giao tiếp RS232 chỉ là những gì mình đưa vào qua cửa sổ matlab mà thôi ? và nếu có thể truyền được những giá trị đo từ THS720 sang máy tính thì mình liệu có thể tạo 1 Timer ở matlab để chỉ nhận số 1 giá trị đo nhất định từ Oszilloscop mà thôi

thax tất cả các bác cho những câu trả lời

che_gl
05-02-2008, 04:15 PM
ko có bác nào gặp vấn đề giống em ah . Em thử kết nối mãi mà không được, mỗi lần gửi 1 thông tin gì đó vào matlab : fprintf ('*IDN?'), thì matlab chỉ trả lời . Warning: A timeout occurred before the Terminator was reached

có bác nào biết lỗi này ở đâu ko ah

dvnccbmacbt
16-02-2008, 08:47 AM
Mọi người cho em hỏi với!
Đọc hướng dẫn của Matlab thấy có viết về terminator. Có 2 lựa chọn là CR (carriage return) hoặc LF (line feed). Em chưa hiểu chỗ này. TERMINTOR là cái gì? CR va LF là gì và có ý nghĩa thế nào? Mong mọi người giúp đỡ. Em cảm ơn nhiều!

che_gl
23-02-2008, 06:51 AM
tức là ở cuối câu lệnh của bạn là LF thì có nghĩa là câu lệnh kết thúc , còn muốn lặp lại câu lệnh thì dùng CR (ở đây có nghĩa là bạn phải xác định cho cái Terminator )
giả sử như cái Oilloskop của mình ở trên mình gửi qua Rs232 1 lệnh gì đó và ko muốn gửi gì thêm thì chỉ để Terminator là LF thôi

xuan_vtdhqs
05-03-2008, 11:08 PM
Bắc à!bây giờ tối đang làm đồ án tốt nghiệp,tôi cần truyền dữ liệu từ PC xuống thẳng van điều khiển để điều khiển van đóng mở thì tôi phải làm như thế nào??ở đây tôi ko dùng vi xử lý để nhận dữ liệu truyền từ máy tính xuống mà truyền trực tiếp xuống van,liệu như vậy có được ko?vì tôi làm về xử lý ảnh và nhận dạng ảnh mà.Tôi nhận dạng và phân loại hoa quả,khi phân loại trên PC xong thì tôi cần out nó xuống điều khiển van đóng mở để điều khiển cơ cấu cần gạt.Cố gắng bớt chút thời gian chỉ dùm nhé.Tôi vừa mới bắt đầu học về matlab nên đang còn kém lắm.Thank!

namqn
06-03-2008, 05:17 AM
Mọi người cho em hỏi với!
Đọc hướng dẫn của Matlab thấy có viết về terminator. Có 2 lựa chọn là CR (carriage return) hoặc LF (line feed). Em chưa hiểu chỗ này. TERMINTOR là cái gì? CR va LF là gì và có ý nghĩa thế nào? Mong mọi người giúp đỡ. Em cảm ơn nhiều!
CR là mã điều khiển của động tác về đầu dòng, LF là mã điều khiển của động tác xuống dòng. Các phiên bản MATLAB cho các hệ điều hành khác nhau có thể sử dụng terminator khác nhau (điều này tùy vào hệ điều hành, và cũng tùy vào chương trình đích sẽ nhận thông điệp từ MATLAB ra sao). Terminator được dùng để báo hiệu kết thúc thông điệp.

Thân,

NANO
19-04-2008, 05:39 PM
các pác ơi, làm thế nào để làm việc với COM20 bây giờ nhỉ? em dùng USB to COM của Lap.

ngohaibac
21-04-2008, 05:50 PM
các pác ơi, làm thế nào để làm việc với COM20 bây giờ nhỉ? em dùng USB to COM của Lap.

Bạn thay đổi thuộc tính String của Combo Box Comport là dc mà. Bạn thêm Com20 vào.

Chúc bạn thành công.

eman2127
01-05-2008, 01:01 PM
Anh cho em hỏi, các file .rar tải về xem bằng chương trình gì?

ngohaibac
02-05-2008, 01:16 AM
Anh cho em hỏi, các file .rar tải về xem bằng chương trình gì?
Em tải winrar tại địa chỉ:
http://www.rarlab.com/

bachhuutai
04-08-2008, 03:37 PM
mình là thành viên mới vô. mình đang làm đề tài về mobile robot. thầy kêu sử dụng phần mềm aria để điều khiển robot. nhưng làm hổm rày mà chưa được gì hết, giao tiếp giữa phần mềm aria và vdk qua com1, aria không nhận được phần cứng. bác nào có kinh nghiệm về phần này chỉ mình với. chân thành cảm ơn!

ngoquang
18-09-2008, 07:14 PM
Bạn Ngô hải Bác và các bạn cho minh hỏi: Hiện tại minh đang dùng matlab mô phải robot scara 2 bậc tự do. Giải thuật dùng mạng neural. Tín hiệu hồi tiếp là q và qdot. Chạy trên matlab khá tốt với chu kì lấy mẫu 0.001s. Giờ mình muốn điều khiển mô hình thật là cánh tay 2 bậc tự do. Điều khiển 2 động cơ servo motor 12V. Dùng 2 con PIC 16 bit 2 động cơ. Như vậy nếu con PIC giao tiếp với PC qua COM thi có đáp ứng được tốc độ hay không. Bác hải Bắc có biết cách giao tiếp Matlab qua cong LPT hay không chỉ giúp với. Minh cần làm gấp lắm, sắp bảo vệ rùi.
Thanks

godfather
14-10-2008, 02:29 PM
Mình thấy đây là một đề tài rất hay đấy. Mình đã test chương trình của bạn ngohaibac và cho giao tiếp với Vi điều khiển, thêm một số hàm và lệnh theo ý muốn và có kết quả tương đối tốt. Trước đây mình thường dùng VB để viết giao diện, nay đọc chương trình mẫu của Bắc mình làm ứng dụng tương tự như viết trong VB và không thấy phức tạp hơn là mấy.
Có vẻ như việc chọn gui và serial matlab để viết giao diện còn chưa được nhiều người chú ý thì phải?

bạn t3i ơi bạn có thể post chương trình test của bạn lên đây cho mọi người tham khảo được không, vì mình đang có ý định giống như bạ mà chưa biết bắt đầu thế nào cả. Thank

bynoud
27-12-2008, 06:09 PM
anh Bac Hai oi
em thử thiết kế 1 GUI giống của anh
nhưng khi chạy, mỗi lần nhấn connect rui Disconnect la lại tạo thêm 1 biến serial mới
dù em đã clear biến serial mỗi lần disconnect
vậy phải làm sao hả anh???

ducmanhmaste
29-03-2009, 10:56 PM
Bạn Hải Bắc cho mình hỏi một chút nhé : Hàm p-file trong Matlab là hàm gì vậy bạn?
Muốn Matlab ko xuất ra màn hình mà xuất kết quả dưới dạng mã để truyền đi khi dùng Xpc Target thì làm như thế nào?
Thanks nhiều nhé!

lecanhhuy
10-04-2009, 12:35 PM
Chào anh Bắc Hải em gặp tí vấn đề này: Em làm theo tutorial của anh , em giao tiếp với VDK . Em gửi lên máy tính chuỗi kí tự này

ind =

Hello Le Canh Huy




ind =

DD06KTD01




ind =

----------------------------
thì nó nhận được .Nhưng khi dùng hàm fprintf(s,'1') nó kô trả về liền mà đợi em nhấn Reset nó mới trả về. Em muốn nó báo ngắt trả về liền em mong anh giúp đỡ.

Sau khi Reset

ind =

Hello Le Canh Huy 2



ind =

DD06KTD01




ind =

----------------------------

ngohaibac
17-04-2009, 02:53 PM
Lưu ý: Matlab dùng kí tự CR/LF để xác định đã gửi xong chuỗi. Nên ở VĐK em phải gửi lên kí tự xuống dòng để kết thúc phiên gửi của em.

Chúc em thành công.

atek
05-09-2009, 07:50 PM
Đây là một chủ đề rất hay
Nếu có thể mình có thể ứng dụng nhiều thay vì phải dùng card PCI trong quá trình điều khiển đối tượng thực . Nhiều khi rất tốn kém . Tuy nhiên mình thấy giao tiếp nối tiếp qua cổng COM có giới hạn về vấn đề tốc độ truyền nên khi điều khiển các đối tượng đòi hỏi đáp ứng nhanh nhiều khi còn hạn chế . Chắc phải tìm hiểu thêm.
mong bạn Ngô Hải Bắc và mọi người thảo luận tiếp chủ đề này

phamngocloi
22-03-2010, 11:54 PM
bac Hai oi cho hỏi lệnh '
"user_response = modaldlg('Title','Exit');" trong đó modaldlg là j vậy

longmilk
25-05-2010, 10:31 PM
Đã biên dịch thành công ra file .exe của ứng dụng. Máy các bạn không cần cài Matlab vẫn chạy ngon lành :D

Địa chỉ download:
http://bmnhy.dieukhien.net/NOHB/Matlab_Simulink/RS232_Communication_pkg.rar

Các bạn giải nén và chạy file RS232_Communication_pkg.exe nó sẽ tự giải nén ra 2 file: RS232_Communication.exe và RS232_Communication.ctf.

Khi đó chạy file: RS232_Communication.exe để chạy ứng dụng.

Chúc các bạn thành công.

Trời ah. Bác ko rành về Matlab rồi.Muốn dịch ra file EXE để chạy mà không cần IDE của Matlab thì bác phải đóng gói bộ Library của Matlab lại ( nặng gần 200 Mbs) vị chi cái chương trình của bác là hơn 200 Mbs đấy ngohaibac ah

giapbk07
08-12-2010, 09:19 PM
chán ghê,e thử test mấy lệnh đầu của anh,tạo xong Serial_Callback khi gọi hàm fopen(s) nó báo lỗi COM not available,k hỉu gì hết lun,chỉ mới thử lệnh,chưa có làm gì hết
Chán,không biết là có phải do Lap ko có cổng COM ko hả anhem nghĩ mình kiếm cái cổng chuyển USB sang COM là ok ùi chú

gauconhatxi
13-12-2010, 07:45 PM
cho minh hoi loi~ nay` khi su dung phan mem cua ban
??? Error using ==> serial.fopen at 72
Port: COM1 is not available. No ports are available.
Use INSTRFIND to determine if other instrument objects are
connected to the requested device.

Error in ==> RS232_Communication>button_Connect_Callback at
264
fopen(s);

Error in ==> gui_mainfcn at 96
feval(varargin{:});

Error in ==> RS232_Communication at 46
gui_mainfcn(gui_State, varargin{:});

??? Error while evaluating uicontrol Callback

blackmagician
12-05-2011, 10:52 PM
cho minh hoi loi~ nay` khi su dung phan mem cua ban
??? Error using ==> serial.fopen at 72
Port: COM1 is not available. No ports are available.
Use INSTRFIND to determine if other instrument objects are
connected to the requested device.

Error in ==> RS232_Communication>button_Connect_Callback at
264
fopen(s);

Error in ==> gui_mainfcn at 96
feval(varargin{:});

Error in ==> RS232_Communication at 46
gui_mainfcn(gui_State, varargin{:});

??? Error while evaluating uicontrol Callback

Bạn đã mở COM1 được rồi mà chưa đóng hoặc cổng COM1 đã sử dụng.

Bạn coi coi kỹ button_Connect thêm dòng vào phía cuối chương trình.
fclose(s);
delete(s);
clear s;

Nếu đã lở mở cổng COM ra rồi mà không đóng lại được thì log off rồi vào lại windows là cổng COM bình thường lại.

Thân.

nptb
14-05-2011, 12:14 AM
a bac ah!
e doc tren mang cung thay a viet chuong trinh visual basic 6.0, nen e mong a giup do e vai dieu ma e k biet ve visual basic.
e dang lam do an tot nghiep "dem san pham" viet bang ngon ngu "VHDL" va giao tiep voi visual basic6.0 de quan ly duoc "so dem"
e da viet duoc pham mem dem duoc san pham va thu xuat ra "led don" va "led 7 doan" thi thay tot, nhung khi toi phan giao tiep voi may tinh qua RS232 de thiet ke giao dien "quan ly so dem" tren visual basic6.0 thi e lai bi , e da doc nhieu tai lieu tren mang nhung sao doc vai k hieu.
e mong a giup do, e cam on a nhieu.

nptb
14-05-2011, 12:15 AM
a bac ah!
e doc tren mang cung thay a viet chuong trinh visual basic 6.0, nen e mong a giup do e vai dieu ma e k biet ve visual basic.
e dang lam do an tot nghiep "dem san pham" viet bang ngon ngu "VHDL" va giao tiep voi visual basic6.0 de quan ly duoc "so dem"
e da viet duoc pham mem dem duoc san pham va thu xuat ra "led don" va "led 7 doan" thi thay tot, nhung khi toi phan giao tiep voi may tinh qua RS232 de thiet ke giao dien "quan ly so dem" tren visual basic6.0 thi e lai bi , e da doc nhieu tai lieu tren mang nhung sao doc vai k hieu.
e mong a giup do, e cam on a nhieu.

nptb
14-05-2011, 12:18 AM
a bac ah!
e doc tren mang cung thay a viet chuong trinh visual basic 6.0, nen e mong a giup do e vai dieu ma e k biet ve visual basic.
e dang lam do an tot nghiep "dem san pham" viet bang ngon ngu "VHDL" va giao tiep voi visual basic6.0 de quan ly duoc "so dem"
e da viet duoc pham mem dem duoc san pham va thu xuat ra "led don" va "led 7 doan" thi thay tot, nhung khi toi phan giao tiep voi may tinh qua RS232 de thiet ke giao dien "quan ly so dem" tren visual basic thi e lai bi , e da doc nhieu tai lieu tren mang nhung sao doc vai k hieu.
e mong a giup do, e cam on a nhieu.
e rat mong duoc su giup do cua cac a tren dien dan
cuoi thang6 nop do an cua e roi, a nao da lam wa roi xin giup dum e
cam on cac a nhieu

nptb
14-05-2011, 12:19 AM
a bac ah!
e doc tren mang cung thay a viet chuong trinh visual basic 6.0, nen e mong a giup do e vai dieu ma e k biet ve visual basic.
e dang lam do an tot nghiep "dem san pham" viet bang ngon ngu "VHDL" va giao tiep voi visual basic6.0 de quan ly duoc "so dem"
e da viet duoc pham mem dem duoc san pham va thu xuat ra "led don" va "led 7 doan" thi thay tot, nhung khi toi phan giao tiep voi may tinh qua RS232 de thiet ke giao dien "quan ly so dem" tren visual basic thi e lai bi , e da doc nhieu tai lieu tren mang nhung sao doc vai k hieu.
e mong a giup do, e cam on a nhieu.
e rat mong duoc su giup do cua cac a tren dien dan
cuoi thang 6 nay la nop do an cua e roi ma e moi chi lam toi do ah? phan cuoi e mong cac a giup do dum e, a nao da lam wa roi xin giup dum e
cam on cac a nhieu

hoanghiep88
15-12-2011, 12:36 PM
anh Bắc à? em đang làm đồ án về giám sát vật chuyển động.viết chương trình = Matlab ma e chưa hiểu lắm về matlab.e kết nối công com qua matlab mà cũng chưa thành công.a giúp e được ko?

vvv123
28-02-2012, 11:11 PM
anh oi cho em hỏi anh dùng phần mềm nào để viết code vậy anh???

electronical
09-03-2015, 07:32 AM
Chào các bạn.

Mình đã sửa lại một tí để fix một số lỗi trong quá trình trao đổi dữ liệu giữa các hàm Callback bằng cách sử dụng cấu trúc handles, trao đổi giữa hàm ngắt của Serial Object bằng biến toàn cục global hand.

Bây giờ các hàm sẽ không phải trao đổi dữ liệu qua data.mat nữa, tránh được lỗi khi save và load nhiều thì file này bị hỏng.

Chúc các bạn thành công.
Bài viết của anh rất hay. em đang nghiên cứu về mảng này, nay có bài của anh viết rất hữu ích cám ơn anh Ngô Bắc Hải rất nhiều.

KhanhDuy2120161
18-11-2015, 03:51 PM
Em đã đọc ở phần trên, nhưng em có tí việc muốn hỏi. Nếu có sai sót các anh thông cảm nhé. Em cũng hứng thú với Matlab lắm, nhưng giờ vẫn đang lay hoay, không biết làm sao vẽ đồ thị vận tốc theo thời gian của động cơ DCServo mô phỏng trên Proteus và lập tringf code trên PIC-CCS, mong anh nào đã từng làm qua, cho em vài thông tin.
Rất cám ơn ạ.