运行 在 GUI 中无限循环接收和发送数据 |软件
Running infinite loop to receive and send data in GUI | MATLAB
我正在开展一个项目,通过 XBees 从一台笔记本电脑向另一台笔记本电脑传输数据。我已经完成了 GUI 界面,但是接收部分有问题。由于接收方不知道接收文件的确切时间,我写了一个无限循环:
recv=[];
while (1)
while s.BytesAvailable==0
end
a=fscanf(s);
recv=[recv a]
end
如何运行这个for
一直循环,从程序的最开始一直循环到用户关闭程序,用户仍然可以选择不同的数据来转发吗?
换句话说;将职责分成两部分接收部分总是 运行ning;而传输部分仅在用户想要传输数据时工作...
我不熟悉 MATLAB,但在大多数编程环境中,您将无限循环检查串行端口上的输入,然后处理来自 GUI 的任何事件。如果更改内部 while
循环,则可以在 while(1)
:
中执行其他操作
recv=[];
while (1)
while s.BytesAvailable>0
a=fscanf(s);
recv=[recv a]
end
; Check for GUI events
end
Matlab支持异步读操作,当端口接收到数据时触发。触发器可以是最小字节数,也可以是特殊字符。
您必须使用 BytesAvailableFcn
回调 属性。
您可以使用 setappdata
和 getappdata
来存储太大而无法容纳在端口的输入缓冲区中的数组。
假设您将主图的句柄保存到名为 hfig
:
的变量中
在主图形用户界面代码中:
s.BytesAvailableFcnCount = 1 ; %// number of byte to receive before the callback is triggered
s.BytesAvailableFcnMode = 'byte' ;
s.BytesAvailableFcn = {@myCustomReceiveFunction,hfig} ; %// function to execute when the 'ByteAvailable' event is triggered.
recv = [] ; %// initialize the variable
setappdata( hfig , 'LargeReceivedPacket' , recv ) %// store it into APPDATA
并作为一个单独的函数:
function myCustomReceiveFunction(hobj,evt,hfig)
%// retrieve the variable in case you want to keep history data
%// (otherwise just initialize that to recv = [])
recv = getappdata( hfig , 'LargeReceivedPacket' )
%// now read all the input buffer until empty
while hobj.BytesAvailable>0
a=fscanf(hobj);
recv=[recv a]
end
%// now do what you want with your received data
%// this function will execute and return control to the main gui
%// when terminated (when the input buffer is all read).
%// it will be executed again each time the 'ByteAvailable' event is fired.
%//
%// if you did something with "recv" and want to save it, use setappdata again:
setappdata( hfig , 'LargeReceivedPacket' , recv ) %// store it into APPDATA
我正在开展一个项目,通过 XBees 从一台笔记本电脑向另一台笔记本电脑传输数据。我已经完成了 GUI 界面,但是接收部分有问题。由于接收方不知道接收文件的确切时间,我写了一个无限循环:
recv=[];
while (1)
while s.BytesAvailable==0
end
a=fscanf(s);
recv=[recv a]
end
如何运行这个for
一直循环,从程序的最开始一直循环到用户关闭程序,用户仍然可以选择不同的数据来转发吗?
换句话说;将职责分成两部分接收部分总是 运行ning;而传输部分仅在用户想要传输数据时工作...
我不熟悉 MATLAB,但在大多数编程环境中,您将无限循环检查串行端口上的输入,然后处理来自 GUI 的任何事件。如果更改内部 while
循环,则可以在 while(1)
:
recv=[];
while (1)
while s.BytesAvailable>0
a=fscanf(s);
recv=[recv a]
end
; Check for GUI events
end
Matlab支持异步读操作,当端口接收到数据时触发。触发器可以是最小字节数,也可以是特殊字符。
您必须使用 BytesAvailableFcn
回调 属性。
您可以使用 setappdata
和 getappdata
来存储太大而无法容纳在端口的输入缓冲区中的数组。
假设您将主图的句柄保存到名为 hfig
:
在主图形用户界面代码中:
s.BytesAvailableFcnCount = 1 ; %// number of byte to receive before the callback is triggered
s.BytesAvailableFcnMode = 'byte' ;
s.BytesAvailableFcn = {@myCustomReceiveFunction,hfig} ; %// function to execute when the 'ByteAvailable' event is triggered.
recv = [] ; %// initialize the variable
setappdata( hfig , 'LargeReceivedPacket' , recv ) %// store it into APPDATA
并作为一个单独的函数:
function myCustomReceiveFunction(hobj,evt,hfig)
%// retrieve the variable in case you want to keep history data
%// (otherwise just initialize that to recv = [])
recv = getappdata( hfig , 'LargeReceivedPacket' )
%// now read all the input buffer until empty
while hobj.BytesAvailable>0
a=fscanf(hobj);
recv=[recv a]
end
%// now do what you want with your received data
%// this function will execute and return control to the main gui
%// when terminated (when the input buffer is all read).
%// it will be executed again each time the 'ByteAvailable' event is fired.
%//
%// if you did something with "recv" and want to save it, use setappdata again:
setappdata( hfig , 'LargeReceivedPacket' , recv ) %// store it into APPDATA