matlab编写gui串口,MATLAB GUI串口编写问题

打开关闭按钮总出现这个错误怎么解决

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 上传

442a53943febe9465fc072b4fbe10813.gif

b2a5a3e0dcc7d508e00275fe42fce1b5.gif

27693b3953b96c4666c6888434ab1cde.png

2016-10-26 21:51 上传

442a53943febe9465fc072b4fbe10813.gif

b2a5a3e0dcc7d508e00275fe42fce1b5.gif

ca9080e3c93fb3119cdef5c2e083a8ea.png

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值