只需一步,快速开始
function start_serial_Callback(hObject, eventdata, handles) % 【打开/关闭串口】按钮的回调函数 % 打开串口,并初始化相关参数 %% 若按下【打开串口】按钮,打开串口 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')); %% 获取校验位设置 switch get(handles.jiaoyan, 'value') case 1 jiaoyan = 'none'; case 2 jiaoyan = 'odd'; case 3 jiaoyan = 'even'; end %% 获取数据位个数 data_bits = 5 + get(handles.data_bits, 'value'); %% 获取停止位个数 stop_bits = get(handles.stop_bits, 'value'); %% 创建串口对象 scom = serial(com_n); %% 配置串口属性,指定其回调函数 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}); %% 将串口对象的句柄作为用户数据,存入窗口对象 set(handles.figure1, 'UserData', scom); %% 尝试打开串口 try fopen(scom); %打开串口 catch % 若串口打开失败,提示“串口不可获得!” msgbox('串口不可获得!'); set(hObject, 'value', 0); %弹起本按钮 return; end %% 打开串口后,允许串口发送数据,清空接收显示区,点亮串口状态指示灯, %% 并更改本按钮文本为“关闭串口” set(handles.period_send, 'Enable', 'on'); %启用【自动发送】按钮 set(handles.manual_send, 'Enable', 'on'); %启用【手动发送】按钮 set(handles.xianshi, 'string', ''); %清空接收显示区 set(handles.activex1, 'value', 1); %点亮串口状态指示灯 set(hObject, 'String', '关闭串口'); %设置本按钮文本为“关闭串口” else %若关闭串口 %% 停止并删除定时器 t = timerfind; if ~isempty(t) stop(t); delete(t); end %% 停止并删除串口对象 scoms = instrfind; stopasync(scoms); fclose(scoms); delete(scoms); %% 禁用【自动发送】和【手动发送】按钮,熄灭串口状态指示灯 set(handles.period_send, 'Enable', 'off', 'value', 0); %禁用【自动发送】按钮 set(handles.manual_send, 'Enable', 'off'); %禁用【手动发送】按钮 set(handles.activex1, 'value', 0); %熄灭串口状态指示灯 end function dataDisp(obj, event, handles) global value % 串口的TimerFcn回调函数 % 串口数据显示 %% 获取参数 hasData = getappdata(handles.figure1, 'hasData'); %串口是否收到数据 strRec = getappdata(handles.figure1, 'strRec'); %串口数据的字符串形式,定时显示该数据 numRec = getappdata(handles.figure1, 'numRec'); %串口接收到的数据个数 %% 若串口没有接收到数据,先尝试接收串口数据 if ~hasData bytes(obj, event, handles); end %% 若串口有数据,显示串口数据 if hasData %% 给数据显示模块加互斥锁 %% 在执行显示数据模块时,不接受串口数据,即不执行BytesAvailableFcn回调函数 setappdata(handles.figure1, 'isShow', true); %% 若要显示的字符串长度超过10000,清空显示区 if length(strRec) > 10000 strRec = ''; setappdata(handles.figure1, 'strRec', strRec); end %% 显示数据 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')
使用道具 举报
本版积分规则 发表回复 回帖后跳转到最后一页
426
433
366
初级会员