matlab串口通信.rar
(17.46 KB, 售價(jià): 1 E幣)
103414lb9ioeu9dg4ignrn.png (63.71 KB)
下載附件
2020-4-27 17:31 上傳
部分代碼
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ì)象的句柄作為用戶(hù)數(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')
【必讀】版權(quán)免責(zé)聲明
1、本主題所有言論和內(nèi)容純屬會(huì)員個(gè)人意見(jiàn),與本論壇立場(chǎng)無(wú)關(guān)。2、本站對(duì)所發(fā)內(nèi)容真實(shí)性、客觀性、可用性不做任何保證也不負(fù)任何責(zé)任,網(wǎng)友之間僅出于學(xué)習(xí)目的進(jìn)行交流。3、對(duì)提供的數(shù)字內(nèi)容不擁有任何權(quán)利,其版權(quán)歸原著者擁有。請(qǐng)勿將該數(shù)字內(nèi)容進(jìn)行商業(yè)交易、轉(zhuǎn)載等行為,該內(nèi)容只為學(xué)習(xí)所提供,使用后發(fā)生的一切問(wèn)題與本站無(wú)關(guān)。 4、本網(wǎng)站不保證本站提供的下載資源的準(zhǔn)確性、安全性和完整性;同時(shí)本網(wǎng)站也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的損失或傷害。 5、本網(wǎng)站所有軟件和資料均為網(wǎng)友推薦收集整理而來(lái),僅供學(xué)習(xí)用途使用,請(qǐng)務(wù)必下載后兩小時(shí)內(nèi)刪除,禁止商用。6、如有侵犯你版權(quán)的,請(qǐng)及時(shí)聯(lián)系我們(電子郵箱1370723259@qq.com)指出,本站將立即改正。
|