运行 在 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 回调 属性。

您可以使用 setappdatagetappdata 来存储太大而无法容纳在端口的输入缓冲区中的数组。 假设您将主图的句柄保存到名为 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