matlab使用udpport实现udp通信
为了实现程序间udp通信,可以使用matlab的udpport函数建立本地udp端口,监听及发送数据。
主要可以参考matlab官网给出的文档:udpport函数的使用
以下是我的整理。
1. 建立端口
u = udpport('IPV4', ...
'LocalHost','127.0.0.1', ...
'LocalPort',8000);
这段可以直接用,表明建立了一个端口号为8000的udp端口,可以负责监听和发送数据。
2. 属性设置
建立好udp后,会出现一个udpport实例,打开会发现其中有很多属性可以设置,我选择了几个比较常用的、可能需要自己设定的属性详细说一下。
2.1 Timeout
设置可以进行端口监听或数据发送的操作时长,单位是秒,类似于这个端口可以工作的时长。
例如:
u.Timeout=100;
那么udpport建立后的100s内,都可以进行监听。
2.2 OutputDatagramSize
发送一次数据到该udpport后,最大可以被读入的字节数,可以设置为1到 65507。
有时候会发现读入的数据不完整,很可能是因为这个值设置的太小了,因为默认只有512。
举例:
u.OutputDatagramSize = 65500;
2.3 LocalPort和LocalHost
这两个属性我在上面创建udpport的代码中已经设定了,就不再赘述。
2.4 NumBytesAvailable
这是可以读的字节数
比如在读取数据的时候,可能不知道有多少数传过来了,就可以:
data = read(u,u.NumBytesAvailable,'string');
另外,每次读取某个长度的数据后,NumBytesAvailable会自动减去这个长度。
关于read函数参考下文。
2.5⭐BytesAvailableFcn、BytesAvailableFcnCount、BytesAvailableFcnMode
这个是放在一起设置的,通过这三个参数,就可以达到这样的效果:当目前udpport缓存的BytesAvailableFcnMode数为BytesAvailableFcnCount时,就可以唤起BytesAvailableFcnCount函数。
举例:
% 当有5个数据包可获得时,调用函数myCallbackFcn
configureCallback(u,"datagram",5,@myCallbackFcn);
% 当有5个字节可获得时,调用函数myCallbackFcn
configureCallback(u,"byte",50,@myCallbackFcn);
这里比较特别的是,需要使用configureCallback这个函数进行设置,关于这个函数也参考下文。
3. 相关函数
3.1 read函数
可参考官网:read函数
这个函数是用来实现从udpport中读取已收到的数据,例如:
data = read(u,5,'string');
就是读取5个字节,并指定了返回类型是string。
如果是在监听端口的过程中,调用这个函数来获取收到的数据,那么执行完毕之后程序会停止,不再继续监听了。
所以说,用matlab进行应用间通信时,如果是只需要传输一次数据,比较适合用read函数,如果是多次不定时地传输,最好用configureCallback设定事件触发。
3.2 write函数
可参考官网:write函数
这个函数是用来实现从udpport向某个端口发送数据,例如:
%格式:write(u,data,datatype,destinationAddress,destinationPort)
write(u, 1:5, "uint8", "192.1.5.15", 20);
这就是向端口20发送uint8格式的数据1到5
3.3 configureCallback函数
这个函数就可以实现在设定的timeout时间内监听发送到当前端口的数据,很实用。
可参考官网:configureCallback函数
举例:
configureCallback(u,"terminator",@myCallbackFcn)
configureCallback(u,"byte",5,@myCallbackFcn)
configureCallback(u,"datagram",5,@myCallbackFcn)
configureCallback(u,"off")
其中,@myCallbackFcn就是自己设定好的一个函数的句柄,条件实现时,就会发起回调。
这里还有一个要注意的点是关于回调函数的构造,参考官网:关于回调函数,就是说自己设定的函数myCallbackFcn必须有两个输入参数:
% 得是这样的结构
function mycallback(obj,event)
end
因为我还遇到过这样的一个报错:
警告: 执行为类
asyncio.InputStream 定义的
事件 DataWritten 的侦听程序回
调时出现错误:
错误使用 myCallbackFcn
输入参数太多。
原因就是因为我设置的myCallbackFcn输入参数个数不对、、大家写的时候可以注意一下。
如果需要更多的输入参数,可以参考:如何在回调参数设置多个输入参数
关于回调和句柄这部分我不是很熟悉,如果以上说错了请指正。
3.4 flush函数
这个函数用于清除udpport中的数据,可以选择清除input或output或两者都。一般当前数据发送完毕之后可以flush一下。
flush(u)
flush(u,"input")
flush(u,"output")
3.5 用于读取字节bytes的其他函数
readline
writeline
可以用于读取和发送一整行的数据
怎么定义一行的结束呢?可以用configureterminator函数
这个我用的比较少,不太了解。
4. 一个完整的udp matlab端代码
向matlab的这个udp端口发送数据的代码段我就不放了,大家可能使用的语言、用于通信的应用不一样,我主要放两个matlab端的代码例子。
4.1 读取数据
%MATLAB端,进行接收的一段简单代码
u = udpport('IPV4', ...
'LocalHost','127.0.0.1', ...
'LocalPort',8000);
%设置可发送数据长度为一个较大的值
u.OutputDatagramSize = 65500;
%超时时间
u.Timeout=50;
data = read(u,5,'string');
fprintf("current receive: %s\n",data);
效果:
程序首先处于运行态:
接收到数据后:
这种情况下,只能接收一次数据,matlab接收到start之后,另一方再发送的话,matlab就收不到了。
4.2 持续读取
clc
clear
%MATLAB端,进行接收的一段简单代码
u = udpport('IPV4', ...
'LocalHost','127.0.0.1', ...
'LocalPort',8000);
%设置可发送数据长度为一个较大的值
u.OutputDatagramSize = 65500;
u.Timeout=100;
configureCallback(u,"byte",5,@myCallbackFcn);
fprintf("current receive: %s\n",data);
function myCallbackFcn(u, event)
data = read(u,5,'string');
fprintf("current:%s\n",data);
end
效果:
这种情况下,就可以随着另一方的发送一直接收,直到超时。
更正:我测试的时候发现,使用这种方法,即使建立udpport的时间超过了设置的timeout,也能继续监听。
5. 总结
使用matlab进行udp通信的流程主要就是:
- 建立端口
udpport
u = udpport('IPV4', ...
'LocalHost','127.0.0.1', ...
'LocalPort',8000);
2.read
/write
数据
data = read(u,5,'string')
write(u, 1:5, "uint8", "192.1.5.15", 20);
- 删除连接
clear
clear u
- 需要注意的点:是否需要
configureCallback
的设置