打开关闭按钮总出现这个错误怎么解决
function OpenSerialPort_Callback(hObject, eventdata, handles)
% 【打开/关闭串口】按钮的回掉函数
% 打开串口,并初始化相关参数
% % 若按下【打开串口】按钮,打开串口
global Scom
if get(handles.OpenSerialPort,'value')
% % 获取串口的端口名
Com_n = sprintf('com%d',get(handles.SerialPortCom,'value'));
% % 获取波特率
Rates = [300 600 1200 2400 4800 9600 19200 38400 43000 56000 57600 115200];
Baud_Rate = Rates(get(handles.SerialPortBaudrate,'value'));
% % 获取校验位设置
switch get(handles.CheckHex,'value')
case 1
CheckHex = 'none';
case 2
CheckHex = 'odd';
case 3
CheckHex = 'even';
end
% % 获取数据位个数
Data_Bits = 5 + get(handles.DataBits,'value');
% % 获取停止位个数
Stop_Bits = get(handles.StopBits,'value');
% % 创建串口对象
Scom = serial(Com_n);
% set(handles.OpenSerialPort,'value',0); % 弹起本按钮
% % 配置串口属性,指定其回掉函数
set(Scom,'BaudRate',Baud_Rate,'Parity',CheckHex,'DataBits',...
Data_Bits,'StopBits',Stop_Bits,'BytesAvailableFcnCount',10,...
'BytesAvailableFcnMode','byte','BytesAvailableFcn',{@bytes,handles},...
'TimerPeriod',0.05,'timerfcn',{@bytes,handles});
% % 将串口对象的句柄作为用户数据,存入窗口对象
set(handles.figure1,'UserData',Scom);
% % 尝试打开串口
try
fopen(Scom); %打开串口
catch % 若串口打开失败,提示“串口打开失败!”
msgbox('串口打开失败!');
return;
end
% % 打开串口后,允许串口发送数据,清空接收显示区,点亮串口状态指示灯,
% % 并更改本按钮文本为“关闭串口”
set(handles.OpenSerialPort,'value',0); % 弹起本按钮
set(handles.SerialPortSend,'Enable','on'); % 启用【手动发送】按钮
set(handles.HexSend,'Enable','on'); % 启用【Hex发送】按钮
set(handles.ComReadEdit,'string',''); % 清空接收显示区
set(hObject,'string','关闭串口'); % 设置本按钮文本为“关闭串口”
set(handles.LedCom,'value',1);
else % 若串口关闭
% % 停止并删除定时器
t = timerfind;
try
stop(t);
delete(t);
% set(handles.LedCom,'value','0');
clear t
end
% % 停止并删除串口对象
Scoms = instrfind;
stopasync(Scoms);
fclose(Scoms);
delete(Scoms);
% % 禁用【自动发送】和【手动发送】按钮,熄灭串口状态指示灯
set(handles.SerialPortSend,'Enable','off','value',0); % 禁用【手动发送】按钮
set(handles.LedCom,'value',0);
set(hObject,'string','打开串口'); % 设置本按钮文本为“打开串口”
set(handles.OpenSerialPort,'value',1); % 弹起本按钮
end
%%定时器的 BytesAvailableFcn 函数
function bytes(obj,eventdata,handles)
% 串口的 BytesAvailableFcn 回调函数
% 串口接收数据
% % 获取参数
global Scom hasData isShow isStopDisp isHexDisp isHexSend numRec numSend...
strRec val
strRec = getappdata(handles.figure1,'strRec'); %获取串口要显示的数据
numRec = getappdata(handles.figure1,'numRec'); %获取串口已接收数据的个数
isStopDisp = getappdata(handles.figure1,'isStopDisp'); %是否按下了【停止显示】按钮
isHexDisp = getappdata(handles.figure1,'isHexDisp'); %是否十六进制显示
isShow = getappdata(handles.figure1,'isShow'); %是否正在执行显示数据操作
% % 若正在执行数据显示操作,暂不接收串口数据
if isShow
return;
end
% % 获取串口可获取的数据个数
n = get(obj,'BytesAvailable');
% % 若串口有数据,接收所有数据
if n
% % 更新 hasData 参数,表明串口有数据显示
setappdata(handles.figure1,'hasData',true);
% % 读取串口数据
a = fread(obj,n,'uchar');
% % 若没有停止显示,将接收到的数据解算出来,准备显示
if ~ get(handles.StopDisp,'value')
% % 根据进制显示的状态,解析数据为要显示的字符串
if ~ get(handles.Hex16_Disp,'value')
c = char(a');
set(handles.ComReadEdit,'string',[get(handles.ComReadEdit,'string') c])
else
c=str2double(dec2hex(a'))';
set(handles.ComReadEdit,'string',[get(handles.ComReadEdit,'string') num2str(c) ' ']);
end
% % 更新已接收的数据个数
numRec = numRec + size(a,1);
% % 更新要显示的字符串
strRec = [strRec c];
end
% % 更新参数
setappdata(handles.figure1,'numRec',numRec); % 更新已接收的数据个数
setappdata(handles.figure1,'strRec',strRec); % 更新要显示的字符串
end
2016-10-26 21:51 上传
2016-10-26 21:51 上传