Chào các bạn.
Mình xin tổng hợp lại một số bài viết của mình về lập trình giao tiếp RS232 trên PC bằng phần mềm Matlab.
I. Đối tượng Serial Object
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);
2. Chương trình RS232 Communication
Đây là chương trình mình viết dùng GUI, đã test với mạch FPGA Spartan 3E rồi.
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)
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)
Các bạn hãy lấy chương trình này thử xem mình viết ra sao nào
.
Tải chương trình: RS232 Communication (1188)
Các bài viết liên quan:
- Hướng dẫn lập trình giao tiếp RS232 trên PC bằng Visual C++ 6.0 Chào các bạn. Để cho website của mình thêm phong phú, nên mình cập nhật thêm một số tài liệu mà mình đã viết ở các diễn đàn điện tử. Có thể bản quyền vẫn thuộc về diễn đàn, nhưng mình nghĩ đây chỉ là sự chia sẻ cho những người chưa biết, chưa hiểu [...]...
- Thư viện giao tiếp RS232 cho PIC18 bằng HTPIC18 Đây là thư viện viết cho vi điều khiển PIC dòng PIC18 bằng HTPIC. Thư viện được tạo dựa vào Datasheet của PIC18. Đã test với PIC18F4680, PIC18F4431 File Header: UART.h // UART.h //============================ #ifndef _UART_H #define _UART_H //============================= #include "pic18.h" #include "sysdef.h" //============================= // Declare sosme functions void UART_Init(unsigned int BaudRate); // Initialize for [...]...
- Lập trình giao diện GUI trong Matlab (Phần 1) Mình viết bài này để tổng hợp lại các hướng dẫn về thiết kế giao diện GUI trong Matlab để các bạn dễ dàng thực hiện. Phần mềm: Matlab R2007a Bài đầu tiên mình sẽ giới thiệu các bạn giao diện GUI. 1. Mở phần mềm Matlab, gõ lệnh sau vào cửa sổ Command >> [...]...
- Tạo file .exe cho giao diện GUI Matlab Chào các bạn. Sau khi các bạn đã biết cách để viết một giao diện GUI, biết cách dịch ra file .exe tự chạy trên một máy khác thì bây giờ mình kết hợp làm sao đây ?? Bài này mình dịch một project GUI tương đối là nhiều thành phần: RS232 Communication đã được [...]...
- Vẽ đồ thị trong Matlab Mình đang làm đồ án về đề tài giao tiếp máy tính và vđk qua công com, mình có 1 thắc mắc mong được các bạn chỉ giáo: khi dữ liệu được truyền vào máy tính thì có sự kiện BytesAvailable, mình viết hàm serial_Callback() để đọc dữ liệu này như sau: function serial_CallBack(obj,event) inval=fread(obj,1); [...]...
- Tạo file .exe trong Matlab dùng Matlab Compiler Có nhiều bạn khá băn khoăn về việc dịch một ứng dụng trong Matlab ra file .exe để chạy độc lập trên các máy không cài Matlab đúng không ?? Hay là cách để đóng gói sản phẩm của mình thì nên làm thế nào ? Để có thể dịch ra file .exe yêu cầu [...]...




{ 78 comments… read them below or add one }
Chào anh Ngô hải Bắc.
Mình có ý định tìm hiểu và thực hiên 1 mạch đo và ghi nhận nhiệt độ môi trường (lưu vào file) động thời có thể gửi tin nhắn SMS cảnh báo khi quá một mức ngưỡng quy định.
Mình định sử dụng IC 89c51, giao tiếp với máy tính qua cổng RS232 và sử dụng chương trình Matlab.
Tạm thời mình định ghi nhận nhiệt độ lưu vào file trước (phần cảnh báo sẽ nghiên cứu sau).
Ý tưởng mình thế này:
Dùng cảm biến nhiệt –> ADC–> 89c51–>max232–> PC.
Nếu anh có ý tưởng hay tài liệu gì hay, mong anh giúp đỡ. Thank anh trước.
Chào bạn.Mình dùm chương trình MATLAB-RS232 của bạn nhưng nếu tự gửi, tự nhận thì oki.Nhưng nếu nhận data từ nguồn ngoài (PIC) thì ko hiển thị lên được.
Anh nqquan a.em muốn vẽ đồ thị từ tín hiệu vi điều khiển qua rs232 hiển thị mô phỏng thời gian thực sử dụng matlab thì làm như thế nào ạ? tín hiệu nhận từ vdk của matlab có dạng 1 2 4 5 ví dụ như vậy.bây giờ làm thế nào để hiển thị nó trên dồ thị matlab
có gì anh giúp em mới:anh gửi vào địa chỉ mail:hieu.tranthe@gmail.com anh biết thì giúp em với thank!
Em sử dụng chương trình giao tiếp máy tính của anh để giao tiếp với VDK và gặp các vấn đề sau. Anh xem và giúp em giải quyết với nhé. Em đang nghiên cứu nhưng chưa ra nên hỏi anh, nhờ giúp đỡ. Chân thành cảm ơn.
Minh Tâm:
Quá trình truyền dữ liệu thành công nhưng gặp phải những vấn đề sau:
Khi truyền từ máy tính xuống VDK thì, giá trị >10 truyền xuống VDK không nhận được.
Khi truyền từ VDK lên máy tính thì:
Truyền 0 nhận được là 128 và cứ thế tăng lên( truyền 1 nhận là 129) tuy nhiên khi truyền đến giá trị 31 tức nhận được là 159 thì OK nhưng đến 32 tức phải nhận được 160 thì không đúng mà chỉ nhận được 128, lặp lại như cũ.
Đó là các vấn đề em gặp phải. Anh chỉ giúp em nha. Cám ơn nhiều.
Source em đã chỉnh sửa như sau:
Trong hàm button_Connect_Callback
s.BytesAvailableFcnCount = 1;
s.InputBufferSize =1;
s.OutputBufferSize =1;
s.BytesAvailableFcnMode = ‘byte’;
Trong hàm BytesAvailable_Callback
ind=fread(obj,1,’uint8′);
kqua=num2str(ind);
set(hand.edit_RX,’String’,kqua);
Trong hàm button_Send_Callback
%fprintf(s,strTX);
fwrite(s,numsend,’int8′);
Đã sửa được rồi. Vui quá.
Chào bạn! Mình đang làm bộ chuyển đổi UART sang Ethernet. mình đang thử trên KIT C8051f120 của Silabs. Con giao tiếp Ethernet là CP2200. Mình đang có vướng mắc là làm sao để tính toán Buffer tối ưu nhất.
Thanks! em đang làm đồ án điều khiển thiết bị qua điện thoại và điều khiển bằng PC giao tiếp qua RS232 anh có thể góp ý cho em về Matlab không
Em muốn điều khiển thiết bị qua line điện thoại, bên phía phát em sử dụng máy tính giao tiếp với VĐK, nhờ VĐK từ dữ liệu nhận được từ cổng Serial chuyển thành tín hiệu điều khiển MT8888 phát ra số điện thoại cũng như là tín hiệu điều khiển.
Em rất mong muốn phần mềm được dùng để thực hiện việc giao tiếp giữa máy tính và VĐK là Matlab nhưng em thấy nó thật sự khó quá. Mong anh cho em ít gợi ý.
Cho em hỏi nữa là làm sao VĐK nhận tín hiệu từ Serial thì có thể chuyển thành mã BCD truyền cho MT8888. Đây là cái mà em thắc mắc nhất.
Đọc xong anh thấy em biết rất ít về điện tử đúng không! Nhưng em đang tìm hiều. Mong anh giúp đỡ.
Thân chào!
chào anh, em tên Phương, hiện em đang làm về cái board Altera Nios Kit. Em đang dùng thử cái code giao tiếp cổng COM do anh viết. cái đề tài của em la biến cái Kit đó thành một cái FIR filter. Em đã làm xong hardware và software lun rùi. Nhưng em ko bít làm sao cho giám khảo thấy đó là cái FIR filter. Em định dùng cổng COM để lấy cái input và cái output của nó ra. Rùi sau đó so sánh với nhau. Nhưng em đang bí, ko bít làm sao lấy nó ra được.
anh có thể cho em một số hướng dẫn ko?
Thanks
Chào anh!Anh cho em hỏi phần mềm RS232 Communication của anh có thể gửi file dữ liệu được không ạ?Nếu giao tiếp 2 máy tính qua modem thì có gì khác không? Em đang làm bài tập về phần này nên muốn hỏi anh chỉ dẫn.Rất mong được anh trả lời sớm
Em muốn gửi file qua cái này thì làm thêm phần nữa thôi: Đọc file kiểu binary hay bình thường, rồi send từng byte dữ liệu đi đến hết là xong mà em.
Còn giao tiếp 2 máy tính qua Modem, em phải xem Modem gì ? Nếu bình thường thì nó là Ethernet đó, còn em nối = cổng COM thì lại khác. Em xem thêm về modem nhé, xem thông số có khác không. Anh nhớ là k khác khi dùng với RS232.
Chúc em thành công.
Cảm ơn anh ạ.ý em nói là modem vẫn hay dùng với cổng COM ạ.đúng là em chưa xem kỹ các thông số của modem.em sẽ về nghiên cứu kỹ lại.có gì khúc mắc em sẽ lại hỏi anh sau nhe!chào anh!
Em dang chỉnh lại chương trình của anh để hoàn thành bài tập của em. 2 khó khăn ban đầu của em là:
- Khi kiểm tra hoạt động của modem bằng lệnh AT, modem có xác nhận lại là OK.Nhưng khi em nối thẳng 2 modem với nhau không qua mạng điện thoại(2 modem đă được mối với máytính) thì khi gửi text,phần receiver chi nhận lại được kí tự mình gửi đi mà không nhận được của đối phương.Thử 1vài lệnh khác ,modem cũng đều đáp OK. Vậy lý do có thể tại sao vậy anh?
- Em bổ sung thêm phần gửi file,bằng cách thêm vào button_selectdata và button_senddata. Em muốn khi ấn vào buttuon_selectdata thì sẽ mở ra1 hộp thoại chọn file(sử dụng lệnh uigetfile)
Khi ấn button_senddata thì chương trình sẽ viết dữ liệu qua cổng comdưới dạng binary
Chương trình em viết là:
———————————————————————————————————————————-
function button_SelectData_Callback(hObject, eventdata, handles)
% hObject handle to button_SelectData (see GCBO)
% eventdata reserved – to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
[filename, pathname] = uigetfile(‘*.*’, ‘Select One File’);
if isequal(filename,0)|isequal(pathname,0)
disp(‘File not found’)
else
SelectedFile = ([ pathname, filename,])
handles.SelectedFile = SelectedFile;
guidata(hObject,handles);
end
%% — Executes on button press in button_SendData.
function button_SendData_Callback(hObject, eventdata, handles)
% hObject handle to button_SendData (see GCBO)
% eventdata reserved – to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
IsConnect = handles.status_com;
s = handles.com;
SelectedFile = handles.SelectedFile;
if (IsConnect == 1)
set(handles.edit_StatusSend,’String’,'Sending… ‘);
%SelectedFile = get_stringPopup(handles.SelectedFile);
fid = fopen(‘SelectedFile’,'wb’);
fwrite(s,fid,’bin’);
set(handles.edit_StatusSend,’String’,'Sent successfully ‘);
end
handles.com = s;
guidata(hObject,handles);
—————————————————————————————————————————————————–
Nhưng kết quả của việc viết dữ liệu không như ý muốn.
À nhân tiện em hỏi anh luôn.Em muốn thêm vào cái giao diện của anh: mỗi chân DSR,CTS
CD,RI sẽ có 1cái đèn.Trong khi giao tiếp,chân nào hoạt động thì đèn sẽ sáng.Anh có thể
hướng dẫn cho em được ko.Vì em ko biết lam mấy cái đèn đó thế nào và viết hàm callback
ra sao.hix
Anh có thể giành chut thời gian xem hộ em được k?
Cảm ơn anh trước nha!
Bác Bắc cho mình hỏi có gặp trường hợp thiết bị open trước khi mở máy tính xảy ra lỗi “Serial Port in use by another application” này không? Và cách khắc phục như thế nào?
chao anh! em đang chạy thử giao tiếp qua cổng com1 như vi dụ dơn gian anh hướng dẫn là dùng led để thử. Nhưng cứ đến hàm fprinft là báo lỗi.Do ko rành về matlab lắm nên em ko thể chạy được mà đèn thử cũng ko sáng.Mong anh giúp đỡ.Cám ơn!
Chào em.
Khái niệm “chạy” hay “không chạy” rất là general, em phải có kĩ năng debug khi một chương trình không chạy đúng theo tính toán, đó là một kĩ năng rất tốt để làm việc em ạ. Việc gì khó khăn cũng thế, em phải làm chắc chắn từng bước và test từng bước.
Có lỗi gì đều nằm ở cửa sổ Command Window, em cứ gửi lên đây anh sẽ xem nhé.
Chúc em thành công.
Bác Bắc cho mình hỏi có gặp trường hợp thiết bị open trước khi mở máy tính xảy ra lỗi “Serial Port in use by another application” này không? Và cách khắc phục như thế nào?
Thank Bác nhiều.
anh bac co so dien thoai di dong hok.Cho em xin di,vi co nhieu van de ve matlab giao tiep voi may tinh can phai hoi truc tiep voi anh moi hieu duoc.
Chào em. Số điện thoại của anh nè: +82-41-569-0205 Em cứ gọi thoải mái nhé, k thì vào http://diendan.hocdelam.org tham gia cũng được
Chúc em thành công.
anh bắc ơi cho em hỏi khi thực hiện nối chân 2 và 3 của cổng com lại rồi cho chạy như anh nói em nhận được thông báo sao anh xem giúp em với cảm ơn anh nhiều
>> 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
>> 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
>> s.BytesAvailableFcn = @Serial_Callback;
>> fopen(s);
>> fprintf(s,”chao cac ban”);
??? fprintf(s,”chao cac ban”);
|
Error: Missing variable or function.
fprintf(s,”chao cac ban”); => Cái này sai rồi, trong Matlab xâu kí tự được bọc giữa dấu nháy ‘ chứ không phải “. Em thử lại: fprintf(s,’chao cac ban’);
Em cảm ơn anh bắc em làm được rồi cho em hỏi thêm một câu nửa nhen nếu mình sử dụng Gui matlab giao tiếp với plc s7200 được không anh .Em đả làm đồ án về plc giao tiếp vb rồi giờ em muốn làm giao tiếp với matlab và có thêm phần xử lí ảnh nửa anh thấy có khả thi không và anh có thể gợi ý hướng đi được không anh hải bắc em cảm ơn anh
Em chào anh Hải Bắc.
Những gì em tìm kiếm được phần nhiều em đều bắt gặp những bài gợi ý của anh trên các 4rum. Có một vấn đề em tìm mãi không được, em muốn nhờ anh giúp đỡ.
Em muốn lập một cái GUI trên Matlab giao tiếp với cổng RS232. và nối với một mạch Vi xử lí (ở đây em xử dụng AVR) để để điều khiển ổn định giữ thăng bằng (sử dụng cảm biến góc nghiêng Gyro). Dự định của em là tín hiệu của cảm biến ngoài việc Xử lý điều khiển, nó sẽ được Vi điều khiển xử lý và gửi lên máy tính. Công việc của máy tính là vẽ được đồ thị biểu diễn khả năng và tốc độ ổn định. Để từ đó tìm được các giá trị các hàm Kp,Ki,Kd thích hợp. (Em đang học năm 2, những cái này là em tự mày mò và đi hỏi thầy ở trường chứ chưa được học, nên có chỗ nào sai về chuyên ngành xin anh bỏ qua).
Em muốn nhờ anh chỉ điểm giúp em cách vẽ đồ thị trên GUI Matlab theo yêu cầu trên được không ạ?
Anh gửi vào mail tuyen.hmi@gmail.com hoặc tuyenhmi@yahoo.com cho em nhé.
Chào em.
Việc vẽ đồ thị trên GUI này rất đơn giản mà em. Em tìm trong website này, anh viết nhiều bài về cái này lắm rồi em ạ.
Chúc em thành công.
Các anh thật đáng nể .. giỏi thật ..
Em đang làm cái đồ án cánh tay máy gắp vật có gắn camera xử lý ảnh bằng matlap cho tay máy hoạt động. trong đó cánh tay máy lập trình bằng PLC S7-200, xử lý ảnh bằng matlap, giao tiếp với máy tính bằng winCC plexible 2008. em chưa hướng được cách lập trình phần xử lý ảnh này và cách liên kết giữa PLC,wincc,và matlap. anh giúp em với. nếu có tài liệu hướng dẫn hay một vài bài mẫu anh gửi cho em nha. mail em nè: dnsonhai@gmail.com.
cảm ơn anh nhiều!
chào em.
Anh không khoái mảng PLC nên không tìm hiểu nhiều nên không có kiến thức về WinCC và mấy món kia lắm, nên không đưa ra lời khuyên cho em được.
Chúc em thành công.
Chào Anh!
Anh cho em hỏi
Đang em làm luận văn về điều khiển thiết bị từ xa qua mạng GSM bằng cách nhắn tin tới sim trong modem GSM
yêu cầu là kết hợp GSM và FPGA, một vi điều khiển AVR. Anh có thể chỉ dùm em hướng thực hiện được không ạ
Cám ơn anh
Em có module GSM rồi thì cần gì FPGA làm gì nhỉ ? giao tiếp với module này chỉ cần RS232 và các lệnh với cú pháp cho sẵn rồi, cứ thế mà truyền đi thôi (AT, …).
Chúc em thành công.
Vâng, cám ơn anh. Nhưng mà thầy Hướng Dẫn em bắt buộc phải có FPGA vào, do đó mới khó. Bây giờ em cần giao tiêp RS232 giữa FPGA Spartan 3E của Xilinx và AVR. Em đã thử viết nhiều lần rồi mà chưa được. Em phải làm sao?
Cái này trong example của Xilinx có cái về tạo giao thức UART để giao tiếp mà. Em xem thí dụ có sử dụng PicoBlaze là xong.
Chúc em thành công.
anh có thể nói rõ hơn không, em tìm hoài chưa biết sử dụng. Anh có thể cho em xin ít tài liệu này không?
Cám ơn anh nhiều…
Em đọc đoạn code thấy có các khai báo:
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;
Có fải S. là cho biết khai báo cho Serial
còn @ là sao vậy anh ??? Em help mãi trong Matlab mà chẳng tìm được tài liệu nói về nó …
Xin cám ơn câu trả lời của anh
Chào em.
s là biến serial mà anh khai báo ở trước đó. Còn @ để lấy địa chỉ của hàm đó, cái này gọi là gán con trỏ hàm.
Chúc em thành công.
em cũng đang tìm hiểu về cái modem GSM ..
Hôm bữa thi truyền nhận được …
nhưng mà MODEM truyền nhiều dòng lệnh .. còn trong MATLAB thì chỉ nhận từng dòng lệnh..
Còn ở khung RX thì chỉ nhận đươc dòng lệnh cuối cùng …
Khôgn giống như Hyper Terminal trong máy
Nóbị j thế anh ??
Ah .. xin lỗi anh … để em cố xem lại … đag lúg túg wá ..
.. chưa xem mà hỏi rồi ..
..
Cố gắng lên em.
Chúc em thành công.
Trời đất .. hxhx .. tự nhiên giờ cái MATLAB không nhận chuỗi RX về luôn rồi anh ơi gửi đi thì vẫn gửi ào ào (vì khi em disconnect ở matlab .. nhảy wa Hyper Connect thi vẫn nhận đc đầy đủ kết quả và chuỗi trả về ??
giao tiếp Hyper terminal thì vẫn bình thường ??
Nó bị gì thế anh ??
Chào em.
Cái đó lâu lâu rồi anh không dùng lại, không biết lỗi gì nhỉ. Em có để ý, khi gửi về Matlab thì gửi thêm các kí tự xuống dòng không em ?
Chúc em thành công.
Không anh ơi .. chẳng có j trong khung RX cả .. giốg như là k nhận được chuỗi trả về ấy .. còn khi giao tiếp với MODEM GSM thì bình thường ah ..
hx
Thanks anh
.. em đag làm về cái này …
Có j em làm fiền anh típ ..
sinh viên gà wá anh àh .. hx
hxhx … Qua mấy ngày lui cui lui cui mò mẫm thì cũng đã tìm ra cái lỗi của con MODEM nhà em rồi ..


Cám ơn anh nhiều nha ..
Ah … mà nhân tiện anh cho em hỏi cái …
Em đag muốn đọc dữ liệu từ trong SIM (không phải những dữ liệu quan trọng .. mà chỉ là những tin nhắn SMS thôi) .. Cái này thì thiết bị ngoài chợ trời bán đầy anh àh ..
Nhưgn em đag thắc mắc là liệu mình có thể dùng 1 cái mạch j đó để đọc SMS .. và giao tiếp với matlab qua cổng COM được không ??
Anh có từng nghe nói về cái này chưa anh ???
Nếu có thì send em 1 vài tài liệu với nha .. ;p
Cám ơn anh
em muon mo phong truyen nhan chuan rs232 bang matlab simulink nhung em chua biet cach viet thu nhan start bit sotp bit cac anh chi gium em . thank so much
anh hai oi em mo phong chuan rs232 dong bo bit ko duoc anh huong dan giup em nha! thank you so much
Anh ơi … có thể giúp e 1 cái nữa được không ??
Em đag muốn quét chuỗi trong khung nhận RX thì phải làm sao anh ??
Ví dụ như chuỗi RX nhận được là ‘OK’ thì chương trìh sẽ tự động gửi thêm 1 chuỗi yêu cầu khác đó anh ??
mấy cái liên kết rối rem quá .. em làm mấy hôm nay mà chẳng được
Cám ơn anh
anh oi,e dang lam bai tap dung con 89c51 giao tiep voi may tinh de dieu khien do sang cua led thong wa viec dieu khien do rong xung,vd nhu co 10 muc(0-9).moi lan bam mot phim bat ky tu 0-9 thi do sang cua led se sang khac nhau.thay keu bon e dung VB viet giao dien nhung e chi moi tim hieu thui nen ko bit viet code sao nua.a co the chi e vai chieu dc ko?
thank a nhiu lam
hxhx … anh B bỏ cái Topic này lun rồi ..
Chào anh, em đã tải chương trình mẫu của anh, và cho chạy thử. Em dùng chương trình Virtual sẻial port driver 6.9 để tạo 2 cổng com ảo 1 và 2 kết nối với nhau. Chương trình mẫu của anh em cho kết nối với com1, chương trình terminal em cho kết nối với com 2. khi thực hiện chuyển dữ liệu thử thì thấy bên chương trình của anh gửi dữ liệu đi được, trong khi phần nhận thì không thể hiện được( gửi từ chương trình tẻminal về chương trình của anh không nhận được, mặc dù ở 2 cổng com ảo vẫn thấy lượng bytes gửi và nhận). Em cũng có thắc mắc là: trong đoạn function BytesAvailable_Callback(obj,event) anh có ghi:
global hand;
ind = fscanf(obj);
save data;
% Edit code here – Ngo Hai Bac
str = get(hand.edit_RX,’String’)
temp = sprintf(‘%s\n%s\n’,ind, str)
set(hand.edit_RX,’String’,ind);
thì nhiệm vụ của cái temp đó là gì. Thanks anh
Cái temp đó chỉ là format lại cái string theo đúng ý và hiển thị lên edit text mà thôi, chẳng có gì cả.
Lưu ý, các chương trình khác gửi vào Matlab thì nhớ send ký tự xuống dòng CR/LF thì nó mới nhận dc, kiểu như là terminal char vậy.
Chúc em thành công.
Thanks anh rất nhiều, có đọc qua mấy cái comment của những tiền bối, tuy nhiên không biết về vụ kí tự xuống hàng này, giờ đã thực hiện được. Cảm ơn anh.
À, vẫn còn một chỗ thắc mắc. Cái temp thì vẫn biết là chuyển đổi dạng dữ liệu, tuy nhiên phần set(…) em thấy là set cái ind chứ đâu phải là set cái temp, có phải là dư phần này hoặc em hiểu sai ở đâu mong anh chỉ giáo
Chào anh.
Em nối tắt chân 2 và chân 3 của cổng COM lại rồi nhập đoạn chương trình sau:
s = serial(‘COM1′);
fopen(s);
fprintf(s, ‘chao’)
nhan = fscanf(s);
Nó báo lỗi: Warning: A timeout occurred before the read operation completed.
Vậy cho em hỏi làm sao khác phục lỗi này?
Em nên viết một hàm Callback cho cổng COM này nhé, như thế thì khi có byte nhận được về từ cổng COM thì em sẽ biết được, còn em gõ thế kia thì sao mà nhận được, khi gõ xong thì các byte đó đã nhận dc từ lâu rồi còn đâu, thì em đợi làm gì có gì
.
Em đọc lại bài viết của anh đi nhé.
Viết hàm Callback cho cổng COM này như thế nào ạ? Dùng để làm gì ạ? Mong anh chỉ giáo!
Viết hàm Callback chính là một dạng viết hàm xử lý ngắt. Chương trình này sẽ xử lý dữ liệu khi dữ liệu gửi tới cổng COM. Nếu không có chương trình ngắt này, em phải dùng phương pháp khác, đó là: hỏi dò (polling) để liên tục đọc ở cổng COM đó xem có dữ liệu chuyển đến hay không.
Chúc em thành công.
Chào anh,
em đã đọc các bài của anh, anh viết rất hay.
Em cũng mới học MATLAB. Lập trình GUI em đã lam được việc đọc dữ liệu từ file Excel để vẽ 1 đồ thị.
Truyền dữ liệu từ MATLAB xuống VĐK thì OK (trong CodevisionAVR dùng 1 hàm getchar và putchar), nhưng để nhận giá trị từ VĐK lên MATLAB thì chưa thể được, ví dụ như muốn VĐK gửi lên giá trị 26 thì phải làm thế nào để gửi và nhận được.
Cảm ơn anh rất nhiều!
Em gửi thêm kí tự kết thúc chuỗi cho xâu kí tự của em là được. Ký tự: CR, LF đó em. Xem thêm trong bảng mã ASCII xem nhé.
Chúc em thành công.
Anh ơi, thế trong bài có đoạn code là
s.ReadAsyncMode = ‘continuous’;
s.BytesAvailableFcnCount = 1;
s.Terminator = ‘CR’
s.BytesAvailableFcnMode = ‘terminator’;%’terminator’;
Em sửa lại thành
s.ReadAsyncMode = ‘continuous’;
s.BytesAvailableFcnCount = 1;
s.Terminator = ”
s.BytesAvailableFcnMode = ‘terminator’;%’terminator’;
Thì như vậy chương trình chạy có còn đúng không ạ. Như thế thì em thấy nó không gửi CR hay LF xuống slave nữa. Nhưng em chưa thử nếu gửi từ slave lên thì nó có hiện không? Anh giúp em với!
Thanks!
Cái này anh chưa test, em test thử rồi thông báo lên đây nhé. Nghiên cứu là phải thử nghiệm mà
Chúc em thành công.
cái này em tìm ra cách khắc phúc rồi.
Với giao thức lệnh gửi xuống stop byte là ‘!’ và lệnh gửi lên stopbyte là ‘*’ thì ta làm như sau:
lúc kết nối COM. thiết lập s.terminator = ‘*’; (hay ‘CR’ hay gì đó hoặc cũng có thể không khởi tạo cũng được. Nhưng nên đặt là * để ta có thể nhận dữ liệu từ COM trước khi gửi dữ liệu)
Đến hàm function button_Send_Callback(hObject, eventdata, handles) thì ta thêm vào:
+ Sau dòng code: if (IsConnect == 1) dòng sau.
s.terminator = ‘!’;
+ Và trên dòng end % end của function button_Sen_Callback(…, …, …) dòng:
s.terminator = ‘*’;
Đó là mẹo vặt của em vọc cái cái của anh và biến nó sang thành RS485.
Chúc mừng em nhé. Em giỏi quá
Có gì sai trong đó à anh? Anh chỉ cho em với!
Em mua 1 cổng DB9 cái rồi nối tắt chân 2 và 3 của nó với nhau. Sau đó em gắn cổng này vào máy tính.
Em viết hàm callback như sau:
function Serial_Callback(obj,event)
ind = fscanf(obj)
Sau đó em lưu file với tên Serial_Callback.m vào thư mục Current Directory của Matlab.
Em nhập các dòng lệnh sau:
>> s = serial(‘COM1′)
>> get(s)
>> s.BytesAvailableFcn =@Serial_Callback;
>> get(s)
Em thấy thông số BytesAvailableFcn là:
BytesAvailableFcn = [1x1 function_handle]
Em nhập tiếp:
>> fopen(s)
>> fprintf(s,’chao cac ban’);
Nhưng tạo sao em không thấy được string nhận được. Em chỉ thấy dòng sau hiện ra:
>>
Em thử load cái chương trình anh tạo ở trong bài viết đó về test xem. nếu không được thì tức là cổng COM của em có vấn đề. Hoặc là dùng Hyper terminal test xem nhé.
Chúc em thành công.
Anh Bắc à, cái chương trình của anh làm sao cái receiver không nhận vậy.
Em gắn vào 1 slave. Gửi xuống đó chuỗi @123! và nếu dùng hyperterminal thì nhận được #123! nhưng dùng chương trình của anh thì lại không nhận được gì cả là sao vậy ạ!
Thế cho em hỏi trong cái thiết lập terminator.
Code ban đầu là ‘CR’ => khi gửi data lên phải có thêm kí tự xuống dòng đúng không ạ
Vậy thì cần sửa như thế nào để không cần phải thêm kí tự xuống dòng ạ.
Do serial object là đối tượng định nghĩa sẵn trong Matlab rồi em, nên luôn cần phải có kí tự Terminator, là kí tự kết thúc phiên truyền thôi. Em làm quen thì sẽ thấy nó rất hiệu quả, và trong rất nhiều cách thực hiện ng ta vẫn làm như thế. A nghĩ là Matlab sử dụng hàm fgets hay tương tự thế để thao tác với dữ liệu này rồi
Chúc em thành công.
Anh Bắc ơi cho em hỏi chút. Trong Matlab có câu lệnh nào
+ xóa bộ nhớ đệm nhận từ slave không ạ. Em giao tiếp với slave nhưng slave gửi chưa đủ xâu thì bị ngắt ngoài, lần sau gửi nó sẽ đưa hết những cái trước ra. Nên em hỏi cách xóa bộ nhớ đệm.
+ Anh có cách nào delay thời gian là 10ms trong matlab không ạ.
Chào annh Bắc,
Bạn của em vừa rồi làm đề tài tốt nghiệp xong , khi bạn nhấn nút trên gui để lấy dữ liệu từ mạch vi điều khiển bên ngoài(lấy nhiệt độ từ cảm biến) ,sao em thấy chậm quá, mất tới 10s, trong một thời điểm chỉ có lấy được 1 tín hiệu cảm biến à, tụi em muốn là khi nhân một nút trên gui,nhận về 10 cảm biến, hiển thị trên text box. Anh Bắc co cách truyen nao nhanh va lam một lúc không chỉ cho tụi em với, cảm ơn anh Bắc nhiều
Chúc anh sức khỏe và thành công
chao ah . em dag lam de tai ve led ma tran giao tiep may tinh bang visual basic. ah co the chi dan em hoac cho em tai lieu khog
Anh ơi cho em hỏi
sao bài của Anh em gỏ y chan mà nó cứ báo lổi ở chổ State
dòng Read/Write State
Anh có file matlab bài ví dụ mà anh trình bày ở trên không cho em xin.
em mới làm quen matlab nên gỏ theo mà nó cứ báo lổi nhìu quá em không bít sữa làm sao.
em Đang làm giao tiếp Matlab với con vi sử lý AVR atmega32. anh có tài liệu gì liên quan thì cho em xin nha.
ở trên có ban hỏi về avr giống em mà chưa thấy Anh trả lời
em cám ơn Anh nhiều.
Chào bạn.
Cái này thì có gì khó khăn đâu. Bạn cứ giao tiếp RS232 và 8051 bình thường như bạn vẫn làm với các loại ngôn ngữ khác vì nó chỉ là cái giao diện thôi.
Còn gửi tin nhắn SMS thì mình k rành lắm. Có khi phải lập trình thêm sử dụng dịch vụ web để gửi đến một số điện thoại cố định. (Có người làm ok rùi).
Còn quá trình để lấy nhiệt độ thì bạn đọc kĩ cái datasheet của ADC là được mà.
Chúc bạn thành công.
Chào bạn.
Khi gửi lên PC thì sâu kí tự gửi lên phải kết thúc bằng kí tự xuống dòng CR (Carry return) thì mới hiển thị lên được.
Vì đó là terminal mà mình cấu hình cho Matlab mà.
Chúc bạn thành công.
Chào em.
Mấy hôm anh bận làm Project quá, k có thời gian bỏ Matlab ra để xem lỗi cho em cả. Em sửa điều gì vậy ?
Chúc em thành công.
Chào em.
Anh rất vui được giúp đỡ em. Có vấn đề gì, em cứ post lên đây, khi nào rảnh anh sẽ trả lời nhé.
Chúc em thành công.
Chào em.
Giao tiếp giữa máy tính và VĐK qua RS232 thực chất là làm cho 2 thằng hiểu nhau, truyền cùng một tốc độ, dữ liệu được truyền từng byte một em ạ. RS232 là chuẩn rồi, em có thể đọc được trên rất là nhiều tài nguyên trên mạng.
Việc chuyển thành mã BCD rất đơn giản khi em đã nhận được dữ liệu rồi, chỉ cần em gọi hàm chuyển đổi từ byte sang mã BCD tương ứng thôi em ạ.
Chúc em thành công.
Chào anh Hải Bắc! Em đang làm quen với FPGAs, tới phần giao tiếp RS232 em không biết làm thế nào, em đang làm cái đồ án về FPGA, mà em chưa từng làm giao tiếp với máy tính, anh giúp em với, anh chỉ cho em là cần dùng phần mềm gì và cách giao tiếp ra sao, em thấy anh làm nhiều về FPGA rồi nên em nhờ anh giúp em. Em cảm ơn anh nhiều!
Chào em.
Ngày xưa anh dùng FPGA giao tiếp với máy tính thông qua thư viện UART của PicoBlaze (chíp nhúng), và viết bằng code ASM. Em truy cập vào site sau nhé: http://www.xilinx.com/ipcenter/processor_central/picoblaze/picoblaze_user_resources.htm
Em xem thêm các design mẫu có sử dụng PicoBlaze : http://www.xilinx.com/products/boards/s3estarter/reference_designs.htm
Chúc em thành công.
Thế anh cho em hỏi, phải sửa như thế nào thì mới hiện được mà không cần kí tự CR ạ.
Thank!
{ 2 trackbacks }