|
程序在壓縮包內(nèi)
0.png (6.06 KB, 下載次數(shù): 76)
下載附件
2019-4-23 16:26 上傳
MATLAB源程序如下:
- function varargout = serial_communication(varargin)
- % 作者:羅
- % 功能;串口收發(fā)
- % 版本:20101103 V2.0
- gui_Singleton = 1;
- gui_State = struct('gui_Name', mfilename, ...
- 'gui_Singleton', gui_Singleton, ...
- 'gui_OpeningFcn', @serial_communication_OpeningFcn, ...
- 'gui_OutputFcn', @serial_communication_OutputFcn, ...
- 'gui_LayoutFcn', [] , ...
- 'gui_Callback', []);
- if nargin && ischar(varargin{1})
- gui_State.gui_Callback = str2func(varargin{1});
- end
- if nargout
- [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
- else
- gui_mainfcn(gui_State, varargin{:});
- end
- function serial_communication_OpeningFcn(hObject, eventdata, handles, varargin)
- handles.output = hObject;
- warning off all;
- %% 改變窗口左上角的圖標(biāo)為icon.jpg
- javaFrame = get(hObject, 'JavaFrame');
- javaFrame.setFigureIcon(javax.swing.ImageIcon('icon.jpg'));
- %% 初始化參數(shù)
- hasData = false; %表征串口是否接收到數(shù)據(jù)
- isShow = false; %表征是否正在進(jìn)行數(shù)據(jù)顯示,即是否正在執(zhí)行函數(shù)dataDisp
- isStopDisp = false; %表征是否按下了【停止顯示】按鈕
- isHexDisp = false; %表征是否勾選了【十六進(jìn)制顯示】
- isHexSend = false; %表征是否勾選了【十六進(jìn)制發(fā)送】
- numRec = 0; %接收字符計(jì)數(shù)
- numSend = 0; %發(fā)送字符計(jì)數(shù)
- strRec = ''; %已接收的字符串
- %讀取圖片數(shù)據(jù),只在第一次運(yùn)行時(shí)讀取
- pathstr = fileparts(which(mfilename));
- if exist([pathstr '\lamb.mat'], 'file') == 2
- load([pathstr '\lamb.mat']);
- else
- openData = imread('green.jpg');
- closedData = imread('red.jpg');
- save lamb.mat openData closedData;
- end
- %% 將上述參數(shù)作為應(yīng)用數(shù)據(jù),存入窗口對(duì)象內(nèi)
- setappdata(hObject, 'hasData', hasData);
- setappdata(hObject, 'strRec', strRec);
- setappdata(hObject, 'numRec', numRec);
- setappdata(hObject, 'numSend', numSend);
- setappdata(hObject, 'isShow', isShow);
- setappdata(hObject, 'isStopDisp', isStopDisp);
- setappdata(hObject, 'isHexDisp', isHexDisp);
- setappdata(hObject, 'isHexSend', isHexSend);
- setappdata(hObject, 'openData', openData);
- setappdata(hObject, 'closedData', closedData);
- %初始化串口狀態(tài)指示燈,串口燈默認(rèn)為關(guān)閉狀態(tài)
- set(handles.lamb, 'cdata', closedData);
- guidata(hObject, handles);
- function varargout = serial_communication_OutputFcn(hObject, eventdata, handles)
- varargout{1} = handles.output;
- function com_Callback(hObject, ~, handles)
- function com_CreateFcn(hObject, eventdata, handles)
- if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
- set(hObject,'BackgroundColor','white');
- end
- function rate_Callback(hObject, eventdata, handles)
- function rate_CreateFcn(hObject, eventdata, handles)
- if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
- set(hObject,'BackgroundColor','white');
- end
- function jiaoyan_Callback(hObject, eventdata, handles)
- function jiaoyan_CreateFcn(hObject, eventdata, handles)
- if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
- set(hObject,'BackgroundColor','white');
- end
- function data_bits_Callback(hObject, eventdata, handles)
- function data_bits_CreateFcn(hObject, eventdata, handles)
- if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
- set(hObject,'BackgroundColor','white');
- end
- function stop_bits_Callback(hObject, eventdata, handles)
- function stop_bits_CreateFcn(hObject, eventdata, handles)
- if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
- set(hObject,'BackgroundColor','white');
- end
- function start_serial_Callback(hObject, eventdata, handles)
- % 【打開/關(guān)閉串口】按鈕的回調(diào)函數(shù)
- % 打開串口,并初始化相關(guān)參數(shù)
- %% 若按下【打開串口】按鈕,打開串口
- if get(hObject, 'value')
- %% 獲取串口的端口名
- com_n = sprintf('com%d', get(handles.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);
- %% 嘗試打開串口
- try
- fopen(scom); %打開串口
- catch % 若串口打開失敗,提示“串口不可獲得!”
- msgbox('串口不可獲得!');
- set(hObject, 'value', 0); %彈起本按鈕
- return;
- end
- %% 打開串口后,允許串口發(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.lamb, 'cdata', getappdata('openData')); %點(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.lamb, 'cdata', getappdata('closedData')); %熄滅串口狀態(tài)指示燈
- set(hObject, 'String', '打開串口'); %設(shè)置本按鈕文本為“打開串口”
- end
- function dataDisp(obj, event, handles)
- % 串口的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ù)
- %% 若串口沒有接收到數(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)度超過10000,清空顯示區(qū)
- if length(strRec) > 10000
- strRec = '';
- setappdata(handles.figure1, 'strRec', strRec);
- end
- %% 顯示數(shù)據(jù)
- set(handles.xianshi, 'string', strRec);
- %% 更新接收計(jì)數(shù)
- set(handles.rec,'string', numRec);
- %% 更新hasData標(biāo)志,表明串口數(shù)據(jù)已經(jīng)顯示
- setappdata(handles.figure1, 'hasData', false);
- %% 給數(shù)據(jù)顯示模塊解鎖
- setappdata(handles.figure1, 'isShow', false);
- end
-
- function bytes(obj, ~, handles)
- % 串口的BytesAvailableFcn回調(diào)函數(shù)
- % 串口接收數(shù)據(jù)
- %% 獲取參數(shù)
- strRec = getappdata(handles.figure1, 'strRec'); %獲取串口要顯示的數(shù)據(jù)
- numRec = getappdata(handles.figure1, 'numRec'); %獲取串口已接收數(shù)據(jù)的個(gè)數(shù)
- isStopDisp = getappdata(handles.figure1, 'isStopDisp'); %是否按下了【停止顯示】按鈕
- isHexDisp = getappdata(handles.figure1, 'isHexDisp'); %是否十六進(jìn)制顯示
- isShow = getappdata(handles.figure1, 'isShow'); %是否正在執(zhí)行顯示數(shù)據(jù)操作
- %% 若正在執(zhí)行數(shù)據(jù)顯示操作,暫不接收串口數(shù)據(jù)
- if isShow
- return;
- end
- %% 獲取串口可獲取的數(shù)據(jù)個(gè)數(shù)
- n = get(obj, 'BytesAvailable');
- %% 若串口有數(shù)據(jù),接收所有數(shù)據(jù)
- if n
- %% 更新hasData參數(shù),表明串口有數(shù)據(jù)需要顯示
- setappdata(handles.figure1, 'hasData', true);
- %% 讀取串口數(shù)據(jù)
- a = fread(obj, n, 'uchar');
- %% 若沒有停止顯示,將接收到的數(shù)據(jù)解算出來,準(zhǔn)備顯示
- if ~isStopDisp
- %% 根據(jù)進(jìn)制顯示的狀態(tài),解析數(shù)據(jù)為要顯示的字符串
- if ~isHexDisp
- c = char(a');
- else
- strHex = dec2hex(a')';
- strHex2 = [strHex; blanks(size(a, 1))];
- c = strHex2(:)';
- end
- %% 更新已接收的數(shù)據(jù)個(gè)數(shù)
- numRec = numRec + size(a, 1);
- %% 更新要顯示的字符串
- strRec = [strRec c];
- end
- %% 更新參數(shù)
- setappdata(handles.figure1, 'numRec', numRec); %更新已接收的數(shù)據(jù)個(gè)數(shù)
- setappdata(handles.figure1, 'strRec', strRec); %更新要顯示的字符串
- end
- function qingkong_Callback(hObject, eventdata, handles)
- %% 清空要顯示的字符串
- setappdata(handles.figure1, 'strRec', '');
- %% 清空顯示
- set(handles.xianshi, 'String', '');
- function stop_disp_Callback(hObject, eventdata, handles)
- %% 根據(jù)【停止顯示】按鈕的狀態(tài),更新isStopDisp參數(shù)
- if get(hObject, 'Value')
- isStopDisp = true;
- else
- isStopDisp = false;
- end
- setappdata(handles.figure1, 'isStopDisp', isStopDisp);
- function radiobutton1_Callback(hObject, eventdata, handles)
- function radiobutton2_Callback(hObject, eventdata, handles)
- function togglebutton4_Callback(hObject, eventdata, handles)
- function hex_disp_Callback(hObject, eventdata, handles)
- %% 根據(jù)【十六進(jìn)制顯示】復(fù)選框的狀態(tài),更新isHexDisp參數(shù)
- if get(hObject, 'Value')
- isHexDisp = true;
- else
- isHexDisp = false;
- end
- setappdata(handles.figure1, 'isHexDisp', isHexDisp);
- function manual_send_Callback(hObject, eventdata, handles)
- scom = get(handles.figure1, 'UserData');
- numSend = getappdata(handles.figure1, 'numSend');
- val = get(handles.sends, 'UserData');
- numSend = numSend + length(val);
- set(handles.trans, 'string', num2str(numSend));
- setappdata(handles.figure1, 'numSend', numSend);
- %% 若要發(fā)送的數(shù)據(jù)不為空,發(fā)送數(shù)據(jù)
- if ~isempty(val)
- %% 設(shè)置倒計(jì)數(shù)的初值
- n = 1000;
- while n
- %% 獲取串口的傳輸狀態(tài),若串口沒有正在寫數(shù)據(jù),寫入數(shù)據(jù)
- str = get(scom, 'TransferStatus');
- if ~(strcmp(str, 'write') || strcmp(str, 'read&write'))
- fwrite(scom, val, 'uint8', 'async'); %數(shù)據(jù)寫入串口
- break;
- end
- n = n - 1; %倒計(jì)數(shù)
- end
- end
- function clear_send_Callback(hObject, eventdata, handles)
- %% 清空發(fā)送區(qū)
- set(handles.sends, 'string', '')
- %% 更新要發(fā)送的數(shù)據(jù)
- set(handles.sends, 'UserData', []);
- function checkbox2_Callback(hObject, eventdata, handles)
- function period_send_Callback(hObject, eventdata, handles)
- % 【自動(dòng)發(fā)送】按鈕的Callback回調(diào)函數(shù)
- %% 若按下【自動(dòng)發(fā)送】按鈕,啟動(dòng)定時(shí)器;否則,停止并刪除定時(shí)器
- if get(hObject, 'value')
- t1 = 0.001 * str2double(get(handles.period1, 'string'));%獲取定時(shí)器周期
- t = timer('ExecutionMode','fixedrate', 'Period', t1, 'TimerFcn',...
- {@manual_send_Callback, handles}); %創(chuàng)建定時(shí)器
- set(handles.period1, 'Enable', 'off'); %禁用設(shè)置定時(shí)器周期的Edit Text對(duì)象
- set(handles.sends, 'Enable', 'inactive'); %禁用數(shù)據(jù)發(fā)送編輯區(qū)
- start(t); %啟動(dòng)定時(shí)器
- else
- set(handles.period1, 'Enable', 'on'); %啟用設(shè)置定時(shí)器周期的Edit Text對(duì)象
- set(handles.sends, 'Enable', 'on'); %啟用數(shù)據(jù)發(fā)送編輯區(qū)
- t = timerfind; %查找定時(shí)器
- stop(t); %停止定時(shí)器
- delete(t); %刪除定時(shí)器
- end
- function period1_Callback(hObject, eventdata, handles)
- function period1_CreateFcn(hObject, eventdata, handles)
- if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
- set(hObject,'BackgroundColor','white');
- end
- function clear_count_Callback(hObject, eventdata, handles)
- %% 計(jì)數(shù)清零,并更新參數(shù)numRec和numSend
- set([handles.rec, handles.trans], 'string', '0')
- setappdata(handles.figure1, 'numRec', 0);
- setappdata(handles.figure1, 'numSend', 0);
- function copy_data_Callback(hObject, eventdata, handles)
- %% 設(shè)置是否允許復(fù)制接收數(shù)據(jù)顯示區(qū)內(nèi)的數(shù)據(jù)
- if get(hObject,'value')
- set(handles.xianshi, 'enable', 'on');
- else
- set(handles.xianshi, 'enable', 'inactive');
- end
- function figure1_CloseRequestFcn(hObject, eventdata, handles)
- % 關(guān)閉窗口時(shí),檢查定時(shí)器和串口是否已關(guān)閉
- % 若沒有關(guān)閉,則先關(guān)閉
- %% 查找定時(shí)器
- t = timerfind;
- %% 若存在定時(shí)器對(duì)象,停止并關(guān)閉
- if ~isempty(t)
- stop(t); %若定時(shí)器沒有停止,則停止定時(shí)器
- delete(t);
- end
- %% 查找串口對(duì)象
- scoms = instrfind;
- %% 嘗試停止、關(guān)閉刪除串口對(duì)象
- try
- stopasync(scoms);
- fclose(scoms);
- delete(scoms);
- end
- %% 關(guān)閉窗口
- delete(hObject);
- function hex_send_Callback(hObject, eventdata, handles)
- %% 根據(jù)【十六進(jìn)制發(fā)送】復(fù)選框的狀態(tài),更新isHexSend參數(shù)
- if get(hObject,'value')
- isHexSend = true;
- else
- isHexSend = false;
- end
- setappdata(handles.figure1, 'isHexSend', isHexSend);
- %% 更新要發(fā)送的數(shù)據(jù)
- sends_Callback(handles.sends, eventdata, handles);
- function sends_Callback(hObject, eventdata, handles)
- % 數(shù)據(jù)發(fā)送編輯區(qū)的Callback回調(diào)函數(shù)
- % 更新要發(fā)送的數(shù)據(jù)
- %% 獲取數(shù)據(jù)發(fā)送編輯區(qū)的字符串
- str = get(hObject, 'string');
- %% 獲取參數(shù)isHexSend的值
- isHexSend = getappdata(handles.figure1, 'isHexSend');
- if ~isHexSend %若為ASCII值形式發(fā)送,直接將字符串轉(zhuǎn)化為對(duì)應(yīng)的數(shù)值
- val = double(str);
- else %若為十六進(jìn)制發(fā)送,獲取要發(fā)送的數(shù)據(jù)
- n = find(str == ' '); %查找空格
- n =[0 n length(str)+1]; %空格的索引值
- %% 每?jī)蓚(gè)相鄰空格之間的字符串為數(shù)值的十六進(jìn)制形式,將其轉(zhuǎn)化為數(shù)值
- for i = 1 : length(n)-1
- temp = str(n(i)+1 : n(i+1)-1); %獲得每段數(shù)據(jù)的長(zhǎng)度,為數(shù)據(jù)轉(zhuǎn)換為十進(jìn)制做準(zhǔn)備
- if ~rem(length(temp), 2)
- b{i} = reshape(temp, 2, [])'; %將每段十六進(jìn)制字符串轉(zhuǎn)化為單元數(shù)組
- else
- break;
- end
- end
- val = hex2dec(b)'; %將十六進(jìn)制字符串轉(zhuǎn)化為十進(jìn)制數(shù),等待寫入串口
- end
- %% 更新要顯示的數(shù)據(jù)
- set(hObject, 'UserData', val);
- function lamb_Callback(hObject, eventdata, handles)
復(fù)制代碼
所有資料51hei提供下載:
serial_communication.rar
(34.92 KB, 下載次數(shù): 214)
2019-4-23 12:43 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|