matlab gui中查看串口是否创建,Matlab gui 如何使串口接收数据显示在不同窗口

如题,使用多个传感器接发送不同数据比如'one-110' 'two-120' 'three-130' 'four-140',然后串口接收数据后在串口助手界面上显示传感器的数据。但是只能存储在strRec中,然后一起显示在一个窗口中。但是为了显示清晰以及实时绘图,需要将这四组数据分开显示,比如将'one-110'显示在窗口1中,将'two-120'显示在窗口2中。这是目前写的代码,是基于罗老师的串口助手上修改的。

部分代码如下:

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.lamb, 'cdata', getappdata('openData')); %点亮串口状态指示灯

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.lamb, 'cdata', getappdata('closedData')); %熄灭串口状态指示灯

set(hObject, 'String', '打开串口');                  %设置本按钮文本为“打开串口”

end

function dataDisp(obj, event, handles)

%        串口的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

%% 显示数据

j=1

m=length(strRec)

w=strRec

q=char(cellstr(strsplit(strRec,'\r')))

[m,n]=size(q)

for i=1:m

if ~isempty(strfind(q(i),'one'))

x(j)=q(i)

j=j+1

set(handles.temperature1, 'string', x);

end

end

set(handles.xianshi, 'string', strRec);

%% 更新接收计数

set(handles.rec,'string', numRec);

%% 更新hasData标志,表明串口数据已经显示

setappdata(handles.figure1, 'hasData', false);

%% 给数据显示模块解锁

setappdata(handles.figure1, 'isShow', false);

end

function bytes(obj, ~, handles)

%   串口的BytesAvailableFcn回调函数

%   串口接收数据

%% 获取参数

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 ~isStopDisp

%% 根据进制显示的状态,解析数据为要显示的字符串

if ~isHexDisp

c = char(a');

else

strHex = dec2hex(a')';

strHex2 = [strHex; blanks(size(a, 1))];

c = strHex2(

7e05c9b83a44d0fac11190e64a3beda1.gif';

end

%% 更新已接收的数据个数

numRec = numRec + size(a, 1);

%% 更新要显示的字符串

strRec = [strRec c];

end

%% 更新参数

setappdata(handles.figure1, 'numRec', numRec); %更新已接收的数据个数

setappdata(handles.figure1, 'strRec', '');

setappdata(handles.figure1, 'strRec', strRec); %更新要显示的字符串

end

icon.jpg

(2.3 KB, 下载次数: 0)

2020-11-2 11:15 上传

b4d287d1aacbf0cf95a77c41289acfe6.gif

c5006d1a5b4047f80d42a7082635a87b.gif

icon.jpg

95b7a1b7ec2d77d8cfc61ce3407bda12.png

2020-11-2 11:13 上传

b4d287d1aacbf0cf95a77c41289acfe6.gif

c5006d1a5b4047f80d42a7082635a87b.gif

0e48a3cc6a70e20c8383b30ae5c532b0.png

7d0fbf4df9f93bb4af681906d56c13a1.gif

2020-11-2 11:15 上传

点击文件名下载附件

68.67 KB, 下载次数: 5

serial_communication.fig

6712fa43d918eeacb445e51bf896eabe.gif

2020-11-2 11:15 上传

点击文件名下载附件

21.43 KB, 下载次数: 4

serial_communication.m

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值