1.我仿照罗飞华老师的串口通信助手自己做了个简易的串口通信助手,作为单片机的上位机来用,可是显示界面的edit控件只能显示三行字符串,其他的无法实时显示。我一直以为我模仿的有问题,可奇怪的是,我用罗老师的串口助手也只能显示这三行。以下是我用stc官方的串口通信助手的演示:
先输入半径10
再输入目的坐标(6,8,10)
可以看出程序可以很好的运行,并实时输出xyz坐标反馈给串口助手。而用matlab gui做的串口助手我实行了简化,将串口直接定成com4,波特率直接定成9600,省去了什么hex模式发送什么周期自动发送啥的,结果如下:
实际情况是我的程序可以正常运行,即电机可以正常转动,然而,edit控件界面永远只显示这三行,不会再实时显示后面的(X,Y,Z)坐标的变化值。请问这是为什么?
而且在运行期间matlab程序还爆出了几个错误:
这个错误是什么意思?求大神告诉我,本人刚开始接触matlab GUI部分
以下是我的matlabgui的代码:
function varargout = jiemian(varargin)
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @jiemian_OpeningFcn, ...
'gui_OutputFcn', @jiemian_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 jiemian_OpeningFcn(hObject, eventdata, handles, varargin)
handles.output = hObject;
guidata(hObject, handles);
function varargout = jiemian_OutputFcn(hObject, eventdata, handles)
varargout{1} = handles.output;
%打开串口按钮
function start_serial_Callback(hObject, eventdata, handles)
global scom
if get(hObject,'value')
scom=serial('com4');
set(scom,'BaudRate',9600,'Parity','none','DataBits',...
8,'StopBits',1,'BytesAvailableFcnCount',100,...
'BytesAvailableFcnMode','byte','BytesAvailableFcn',{@bytes,handles},...
'TimerPeriod',0.01,'timerfcn',{@bytes,handles})
try
fopen(scom);
catch
msgbox('串口不可获得!');
set(hObject, 'value', 0); %弹起本按钮
return
end
set(handles.xianshi, 'string', ''); %清空接收显示区
set(hObject, 'String', '关闭串口'); %设置本按钮文本为“关闭串口”
else
t=timerfind;
try
stop(t);
delete(t);
end
scoms=instrfind;
stopasync(scom);
fclose(scoms);
delete(scoms);
set(hObject, 'String', '打开串口'); %设置本按钮文本为“打开串口”
end
%bytes函数
function bytes(obj,eventdata,handles)
n=get(obj,'BytesAvailable');
if n
a=fread(obj,n,'uchar');
c=char(a');
set(handles.xianshi,'string',[get(handles.xianshi,'string') c])
set(handles.rec,'string',num2str(str2num(get(handles.rec,'string'))+length(c)))
end
%清空接收区按钮
function qingkong_Callback(hObject, eventdata, handles)
set(handles.xianshi,'string','')
%清空发送区按钮
function pushbutton1_Callback(hObject, eventdata, handles)
set(handles.sends,'string','')
% 发送按钮
function manual_send_Callback(hObject, eventdata, handles)
global scom
str=get(handles.sends,'string');
val=double(str);
set(handles.trans,'string',num2str(str2num(get(handles.trans,'string'))+length(str2num(str))))
if ~isempty(val)
try
str=get(scom,'TransferStatus');
catch
return
end
while 1
if ~(strcmp(str, 'write')||strcmp(str,'read&write'))
fwrite(scom,val,'uint8','async');
break
end
end
end
%发送区文本显示回调函数
function sends_Callback(hObject, eventdata, handles)
function sends_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
%接收区文本显示回调函数
function xianshi_Callback(hObject, eventdata, handles)
function xianshi_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
%清空计数按钮
function pushbutton2_Callback(hObject, eventdata, handles)
set([handles.rec,handles.trans],'string','0')