|
Tài trợ cho PIC Vietnam |
Giao tiếp cổng COM và LPT RS232, RS485 và LPT là những giao tiếp cơ bản và kinh điển khi mới học về vi điều khiển... |
|
Ðiều Chỉnh | Xếp Bài |
|
17-11-2006, 04:24 PM | #1 |
Đệ tử 9 túi
|
Giao tiếp RS232 trên PC qua Matlab
Mình đã viết bài này tại địa chỉ:
http://dientuvietnam.net/forums/show...?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 Code:
>> 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 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): Code:
>> 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 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: Code:
function Serial_Callback(obj,event) ind = fscanf(obj) Chúng ta đưa tham số tên hàm vào cho đối tượng s của ta: Code:
>> s.BytesAvailableFcn = @Serial_Callback; Code:
>>fopen(s); >>fprintf(s,"chao cac ban"); Bạn không giao tiếp nữa thì đóng cổng lại: Code:
>>fclose(s); Chúc các bạn thành công. thay đổi nội dung bởi: ngohaibac, 17-03-2007 lúc 10:37 PM. |
26-12-2006, 08:35 AM | #2 |
Đệ tử 9 túi
|
Chương trình giao tiếp trên PC với RS232 dùng Matlab :D.
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 . Sau nửa ngày hăng say lập trình , 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: 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à:
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. thay đổi nội dung bởi: ngohaibac, 26-12-2006 lúc 08:48 AM. |
05-01-2007, 03:08 PM | #3 |
Đệ tử 9 túi
|
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. |
01-05-2008, 01:01 PM | #4 |
Nhập môn đệ tử
Tham gia ngày: May 2008
Bài gửi: 2
: |
Anh cho em hỏi, các file .rar tải về xem bằng chương trình gì?
|
02-05-2008, 01:16 AM | #5 |
Đệ tử 9 túi
|
Em tải winrar tại địa chỉ:
http://www.rarlab.com/ |
10-01-2007, 03:20 PM | #6 |
Nhập môn đệ tử
Tham gia ngày: Apr 2006
Bài gửi: 1
: |
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? |
14-10-2008, 02:29 PM | #7 | |
Nhập môn đệ tử
Tham gia ngày: Apr 2008
Bài gửi: 1
: |
Trích:
|
|
10-01-2007, 04:40 PM | #8 |
Đệ tử 9 túi
|
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 . 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. |
09-03-2007, 01:06 AM | #9 |
Nhập môn đệ tử
Tham gia ngày: Sep 2006
Bài gửi: 7
: |
Lam card giao tiep bang PIC
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
|
09-03-2007, 10:55 PM | #10 |
Đệ tử 9 túi
|
@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. |
10-03-2007, 12:29 AM | #11 |
Đệ tử 9 túi
|
RS232 Communication V2.0
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. |
09-03-2015, 07:32 AM | #12 | |
Nhập môn đệ tử
Tham gia ngày: Oct 2007
Bài gửi: 3
: |
Trích:
|
|
13-04-2007, 07:43 PM | #13 |
Nhập môn đệ tử
Tham gia ngày: Aug 2006
Bài gửi: 4
: |
Anh Bắc cho em hỏi 1 tí:
Trong file Rs232 Comunication.m phần Code:
function RS232_Communication_OpeningFcn(hObject, eventdata, handles, varargin) handles.output = hObject; guidata(hObject, handles); Code:
handles.status_com = IsConnect; 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? Code:
guidata(hObject,handles); Code:
function button_Send_Callback(hObject, eventdata, handles) IsConnect = handles.status_com; s = handles.com; Code:
function button_Send_Callback(hObject, eventdata, handles) strTX = get(handles.edit_TX,'String'); fprintf(s,strTX); Code:
handles.com = s; guidata(hObject,handles); Code:
function button_Connect_Callback(hObject, eventdata, handles) s = serial(get_stringPopup(handles.popup_ComPort)); Code:
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; em chỉ thấy anh ghi code cho Code:
bytesAvailable_callback như sau: global hand; ind = fscanf(obj); set(hand.edit_RX,'String',ind); Code:
s.RecordName = get(handles.edit_RecordName,'String');s s.RecordMode = 'index'; Code:
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); Code:
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); Code:
s.BytesAvailableFcnCount = 1; s.BytesAvailableFcnMode = 'terminator'; 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 thay đổi nội dung bởi: Nguoi hieu hoc, 14-04-2007 lúc 12:19 AM. |
14-04-2007, 02:52 AM | #14 |
Đệ tử 9 túi
|
Code:
function RS232_Communication_OpeningFcn(hObject, eventdata, handles, varargin) handles.output = hObject; guidata(hObject, handles); 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. Code:
handles.status_com = IsConnect; guidata(hObject,handles); Tham khảo tại đây. Mai giải thích tiếp. Chúc em thành công. |
14-04-2007, 03:08 AM | #15 |
Đệ tử 9 túi
|
Code:
handles.com = s; guidata(hObject,handles); 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: Code:
s = handles.com; Code:
function button_Connect_Callback(hObject, eventdata, handles) s = serial(get_stringPopup(handles.popup_ComPort)); 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. Code:
global s; % ví dụ biến s là global Chúc em thành công. |
|
|
Similar Threads | ||||
Ðề tài | Người gửi | Chuyên mục | Trả lời | Bài mới |
Giao tiếp RS232 trên PC | ngohaibac | Giao tiếp cổng COM và LPT | 189 | 08-05-2024 08:10 PM |
giao tiep qua PCI de doc AD bằng Matlab | hanhluckyly | Matlab-Simulink & Labview & 20-Sim | 22 | 06-06-2011 09:55 PM |
Communicate between PC and PIC via RS232 standard using Matlab (GUI, IO). | ngohaibac | English forum on PICs | 3 | 02-06-2011 06:46 PM |
cần mua bộ thu GPS có giao tiếp RS232 | kienvq | Tìm mua sản phẩm | 15 | 17-03-2011 11:25 PM |
Help! Dùng C để giao tiếp RS232 | dandiennang | Các ngôn ngữ lập trình khác (CCS C, HT PIC,...) | 6 | 15-03-2009 06:41 PM |