matlab串口通信.rar
(17.46 KB, 售價(jià): 1 E幣)
function start_serial_Callback(hObject, eventdata, handles)
% 【打開(kāi)/關(guān)閉串口】按鈕的回調(diào)函數(shù)
% 打開(kāi)串口,并初始化相關(guān)參數(shù)
%% 若按下【打開(kāi)串口】按鈕,打開(kāi)串口
if get(hObject, 'value')
%% 獲取串口的端口名
com_n = sprintf('com%d', get(handles點(diǎn)com, 'value'));
%% 獲取波特率
rates = [300 600 1200 2400 4800 9600 19200 38400 43000 56000 57600 115200];
baud_rate = rates(get(handles.rate, 'value'));
%% 獲取校驗(yàn)位設(shè)置
switch get(handles.jiaoyan, 'value')
case 1
jiaoyan = 'none';
case 2
jiaoyan = 'odd';
case 3
jiaoyan = 'even';
end
%% 獲取數(shù)據(jù)位個(gè)數(shù)
data_bits = 5 + get(handles.data_bits, 'value');
%% 獲取停止位個(gè)數(shù)
stop_bits = get(handles.stop_bits, 'value');
%% 創(chuàng)建串口對(duì)象
scom = serial(com_n);
%% 配置串口屬性,指定其回調(diào)函數(shù)
set(scom, 'BaudRate', baud_rate, 'Parity', jiaoyan, 'DataBits',...
data_bits, 'StopBits', stop_bits, 'BytesAvailableFcnCount', 10,...
'BytesAvailableFcnMode', 'byte', 'BytesAvailableFcn', {@bytes, handles},...
'TimerPeriod', 0.05, 'timerfcn', {@dataDisp, handles});
%% 將串口對(duì)象的句柄作為用戶數(shù)據(jù),存入窗口對(duì)象
set(handles.figure1, 'UserData', scom);
%% 嘗試打開(kāi)串口
try
fopen(scom); %打開(kāi)串口
catch % 若串口打開(kāi)失敗,提示“串口不可獲得!”
msgbox('串口不可獲得!');
set(hObject, 'value', 0); %彈起本按鈕
return;
end
%% 打開(kāi)串口后,允許串口發(fā)送數(shù)據(jù),清空接收顯示區(qū),點(diǎn)亮串口狀態(tài)指示燈,
%% 并更改本按鈕文本為“關(guān)閉串口”
set(handles.period_send, 'Enable', 'on'); %啟用【自動(dòng)發(fā)送】按鈕
set(handles.manual_send, 'Enable', 'on'); %啟用【手動(dòng)發(fā)送】按鈕
set(handles.xianshi, 'string', ''); %清空接收顯示區(qū)
set(handles.activex1, 'value', 1); %點(diǎn)亮串口狀態(tài)指示燈
set(hObject, 'String', '關(guān)閉串口'); %設(shè)置本按鈕文本為“關(guān)閉串口”
else %若關(guān)閉串口
%% 停止并刪除定時(shí)器
t = timerfind;
if ~isempty(t)
stop(t);
delete(t);
end
%% 停止并刪除串口對(duì)象
scoms = instrfind;
stopasync(scoms);
fclose(scoms);
delete(scoms);
%% 禁用【自動(dòng)發(fā)送】和【手動(dòng)發(fā)送】按鈕,熄滅串口狀態(tài)指示燈
set(handles.period_send, 'Enable', 'off', 'value', 0); %禁用【自動(dòng)發(fā)送】按鈕
set(handles.manual_send, 'Enable', 'off'); %禁用【手動(dòng)發(fā)送】按鈕
set(handles.activex1, 'value', 0); %熄滅串口狀態(tài)指示燈
end
function dataDisp(obj, event, handles)
global value
% 串口的TimerFcn回調(diào)函數(shù)
% 串口數(shù)據(jù)顯示
%% 獲取參數(shù)
hasData = getappdata(handles.figure1, 'hasData'); %串口是否收到數(shù)據(jù)
strRec = getappdata(handles.figure1, 'strRec'); %串口數(shù)據(jù)的字符串形式,定時(shí)顯示該數(shù)據(jù)
numRec = getappdata(handles.figure1, 'numRec'); %串口接收到的數(shù)據(jù)個(gè)數(shù)
%% 若串口沒(méi)有接收到數(shù)據(jù),先嘗試接收串口數(shù)據(jù)
if ~hasData
bytes(obj, event, handles);
end
%% 若串口有數(shù)據(jù),顯示串口數(shù)據(jù)
if hasData
%% 給數(shù)據(jù)顯示模塊加互斥鎖
%% 在執(zhí)行顯示數(shù)據(jù)模塊時(shí),不接受串口數(shù)據(jù),即不執(zhí)行BytesAvailableFcn回調(diào)函數(shù)
setappdata(handles.figure1, 'isShow', true);
%% 若要顯示的字符串長(zhǎng)度超過(guò)10000,清空顯示區(qū)
if length(strRec) > 10000
strRec = '';
setappdata(handles.figure1, 'strRec', strRec);
end
%% 顯示數(shù)據(jù)
set(handles.xianshi, 'string', strRec);
%保存成.txt文件
% [FileName PathName]=uiputfile({'*.txt','Txt Files(*.txt)';'*.*','All Files(*.*)'},'choose a File');
% ysw= [PathName FileName];
% dlmwrite(ysw, strRec,'delimiter','\t');
% save ysw strRec
% save(char(ysw), 'strRec')
| 歡迎光臨 ELEOK (http://m.afoofa.cn/) | Powered by Discuz! X5.0 |