PDA

View Full Version : Nhận dữ liệu qua cổng RS232 và vẽ đồ thì lên Matlab??


dvnccbmacbt
28-02-2009, 10:36 PM
Chào mọi người.
Em đang thực hiện vẽ đồ thị tren matlab với dữ liệu là số xung encoder PIC truyền lên qua cổng com. Phần nhận dữ liệu em đã thực hiện xong. Nhưng vẽ đồ thị thì em chưa vẽ được. Nếu lưu lại dữ liệu nhận được rồi chờ đến khi kết thúc quá trình nhận dữ liệu thì không có vấn đề j.
Em có thắc mắc thế này: Nếu em muốn vẽ đồ thì ngay trong hàm ngắt của matlab có được không? Tức là động cơ đang quay và em muốn đồ thị cũng vẽ theo đó luôn chứ không chờ đến lúc động cơ dừng rồi mới vẽ ( em điêu khiên vị trí cua động cơ);
Em thấy trong luồng "PID cho động cơ đã có người làm rồi nhưng không thấy nói cụ thể về cái này. Mong mọi người giúp đỡ!

luckyboy150488
10-03-2010, 04:42 PM
mình cũng đang làm đề tài vẽ đồ thị dữ liệu nhận từ rs232 bạn nào có tài liệu share cho t với.t xin cám ơn

phulanchi
31-03-2010, 09:43 AM
Bạn ơi, cho mình hỏi để nhận dữ liệu từ COM trong Matlab thì phải làm thế nào?
Mình truyền được dữ liệu từ PC xuống VDK qua Matlab nhưng không thể nhận dữ liệu từ VDK gửi lên PC. Giá trị muốn gửi lên là số, như nhiệt độ đo được.

liusan
24-11-2010, 05:36 PM
Bạn ơi, cho mình hỏi để nhận dữ liệu từ COM trong Matlab thì phải làm thế nào?
Mình truyền được dữ liệu từ PC xuống VDK qua Matlab nhưng không thể nhận dữ liệu từ VDK gửi lên PC. Giá trị muốn gửi lên là số, như nhiệt độ đo được.
Bạn vào Matlab help gõ serial rồi tha hồ đọc.

liusan
24-11-2010, 05:42 PM
mình cũng đang làm đề tài vẽ đồ thị dữ liệu nhận từ rs232 bạn nào có tài liệu share cho t với.t xin cám ơn
Bạn dùng thử code này xem sao:

---my code---
serialObj=serial('COM1','baudrate',9600,'Timeout', 2);
serialObj.BytesAvailableFcnMode='byte';
serialObj.BytesAvailableFcnCount=2;
serialObj.BytesAvailableFcn={@mycallback,handles};
......
......
function mycallback(hObject, eventdata, handles)
tframe=2; %width of the oscilloscope screen
global ia count t tocold samples
if isempty(count)
count=1;
end
try
x=fread(handles.serialObj,2,'uint8');
ia(count)=x(1)*256+x(2); %x=[quotient reminder]
samples(count)=count;
catch e
errordlg(e.message);
end
count=count+1;
set(handles.plot1,'xdata',samples,'ydata',ia);
set(handles.axes1,'xlim',[0 count]...
,'ylim',[min(ia)-1 max(ia)+1]);

Hoặc trong file .txt ở dưới, đổi nó lại thành .m ha(tại mình up ko đc). Bạn về chỉnh sửa cho hợp với mình.

nguyendtt
13-12-2010, 06:38 PM
Em dùng đoạn lệnh dưới đây để xuất data và nhận data vào từ cổng com 1:
s = serial('COM1');
s.baudrate = 9600;
s.DataBits = 8;
s.Parity = 'none';
s.StopBit = 1;
s.ReadAsyncMode = 'continuous';
s.BytesAvailableFcnCount = 1;
s.Terminator = 'LF';
s.BytesAvailableFcnMode = 'terminator';
fopen(s);
fwrite(s,255);
n = fread(s,1);
if (n == 255)
set(handles.thketnoi,'String','ket noi thanh cong');
% Hide all setting popup menu.
set(handles.ComPort,'Enable','off');
set(handles.chedo,'Enable','off');
set(handles.dieukhien,'Enable','on');
else
set(handles.ketnoi,'Enable','on');
set(handles.thketnoi,'String','Loi, kiem tra lai cong COM');
end
fclose(s);
Nhưng xuất data thì nhanh còn nhận vào thì rất lâu (khoảng 2s) lại còn cảnh báo lỗi nữa:"Warning: The specified amount of data was not returned within the
Timeout period."
Pro nào biết xin chỉ giúp cách khắc phục lôi này với...Thanksssss

lequangthanh
19-06-2011, 09:29 AM
Em dùng đoạn lệnh dưới đây để xuất data và nhận data vào từ cổng com 1:
s = serial('COM1');
s.baudrate = 9600;
s.DataBits = 8;
s.Parity = 'none';
s.StopBit = 1;
s.ReadAsyncMode = 'continuous';
s.BytesAvailableFcnCount = 1;
s.Terminator = 'LF';
s.BytesAvailableFcnMode = 'terminator';
fopen(s);
fwrite(s,255);
n = fread(s,1);
if (n == 255)
set(handles.thketnoi,'String','ket noi thanh cong');
% Hide all setting popup menu.
set(handles.ComPort,'Enable','off');
set(handles.chedo,'Enable','off');
set(handles.dieukhien,'Enable','on');
else
set(handles.ketnoi,'Enable','on');
set(handles.thketnoi,'String','Loi, kiem tra lai cong COM');
end
fclose(s);
Nhưng xuất data thì nhanh còn nhận vào thì rất lâu (khoảng 2s) lại còn cảnh báo lỗi nữa:"Warning: The specified amount of data was not returned within the
Timeout period."
Pro nào biết xin chỉ giúp cách khắc phục lôi này với...Thanksssss
bạn xem lại cách định dạng dữ liệu đọc vào của bạn!

lequangthanh
19-06-2011, 09:59 AM
Chào mọi người.
Em đang thực hiện vẽ đồ thị tren matlab với dữ liệu là số xung encoder PIC truyền lên qua cổng com. Phần nhận dữ liệu em đã thực hiện xong. Nhưng vẽ đồ thị thì em chưa vẽ được. Nếu lưu lại dữ liệu nhận được rồi chờ đến khi kết thúc quá trình nhận dữ liệu thì không có vấn đề j.
Em có thắc mắc thế này: Nếu em muốn vẽ đồ thì ngay trong hàm ngắt của matlab có được không? Tức là động cơ đang quay và em muốn đồ thị cũng vẽ theo đó luôn chứ không chờ đến lúc động cơ dừng rồi mới vẽ ( em điêu khiên vị trí cua động cơ);
Em thấy trong luồng "PID cho động cơ đã có người làm rồi nhưng không thấy nói cụ thể về cái này. Mong mọi người giúp đỡ!
có nhiều cách giải quyết vấn đề này:


nếu bạn không lập trình trong GUI,bạn có thể làm được việc này ,vì hiện tại mình chưa làm được với GUI.

bạn định dạng cổng COM như sau:


s=serial('COM1');%lựa chọn cổng com tùy vào phần cứng của bạn
get(s);%lấy các thông tin về cổng
hàm trên sẽ trả về các thuộc tính của đối tượng s,giống như lập trình hướng đối tượng bạn có thể thay đổi thông số sau khi khởi tạo (với các thông số mặc định)
s.BaudRate=9600;hoặc set(s,'BaudRate',9600);
s.InputBufferSize=1024;%tùy chọn,có thể bỏ qua các bước này
s.TimeOut=2;%thời gian phát sinh lỗi nếu quá trình đọc dữ liệu vượt quá thời gian này
s.BytesAvailableFcnMode='byte';%chế độ gọi hàm ngắt sẽ là đếm số byte nhận được,mặc định là terminal:gọi hàm ngăt khi gặp ký tự kết thúc
s.BytesAvailableFcnCount=10;%định nghĩa số byte nhận được trong bộ đệm thu 10 byte thì gọi chương trình ngắt
s.BytesAvailableFcn=@vedothi;%khai bao hàm call back
vedothi là một hàm ngắt mà ta sẽ định nghĩa và lưu trong thư mục đang làm việc của matlab,cách định nghĩa hàm này có đôi chút khác biệt

cấu trúc hàm này như sau:
kích phải trong thư mục đang làm việc và chọn new>function
ta sẽ chỉnh sữa lại như sau:
Function y = vedothi(obj,event) % có trả về kiểu dữ liệu
obj:là đối tượng serial
ví dụ một hàm mầu như sau
function th( obj,event )
%TH Summary of this function goes here
% Detailed explanation goes here
figure

end

cái hàm trên có tên là th và thực hiện một công việc vô cùng đơn giản là tạo một cái cửa sổ figure.và không trả về kiểu dữ liệu gì hết,hehe
lưu ý là cái hàm này phải tạo trước khi khai báo hàm callback trong matlab nhé
công việc còn lại là
fopen(s);
một số bạn thắc mắc là việc gửi dữ liệu thì rất nhanh,còn đọc thì chậm,tất nhiên rồi
khi bạn khởi tạo cổng com,matlab mặc định thời gian đọc dữ liệu tối đa là 10s,khi bạn gửi dữ liệu xuống cổng,thì cái cổng trong máy tính bạn nó gủi dữ liệu đi cho thiết bị đầu cuối đọc,chứ nó đâu có gửi cho nó đọc đâu,vì vậy đâu có gì trong bộ đệm nhận đâu mà đọc,bạn muốn gửi,rồi nhận lại cái mình đã gửi thì phải nối dây số 2 và dây 3 của cổng com lại thì sẽ làm được việc này,còn nếu bạn đang dùng laptop,thì dùng phần mềm giả lập cổng com để thử nghiêm!!

chúc bạn thành công!!!

redstarhd
27-06-2011, 11:39 AM
Trời ơi các pro cứu em với, em đang làm đồ án về tạo mã manchester sử dụng 2 con pic smarter và slave để tạo mã manchester và yêu cầu hiển thị dạng xung của mã này trên PC thông qua cổng COM , nhưng em k bit dùng phần mềm nào cho thích hợp, matlab có được k ah hay là labview ??
Em mong sớm được các pro giúp đỡ:D