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通信的流程主要就是:

  1. 建立端口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);
  1. 删除连接clear
clear u
  1. 需要注意的点:是否需要configureCallback的设置
  • 7
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
MatlabUDP通信是一种通过用户数据报协议(UDP)进行数据传输的通信方式。UDP是一种无连接的协议,它将数据分成较小的数据包,不保证数据传输的可靠性和顺序。UDP通信在实时性要求较高的应用中常被使用,比如实时数据采集、实时控制等。 在Matlab中,利用UDP通信可以实现两个或多个Matlab实例之间的数据传输。首先,需要创建UDP对象,并设置远程主机和端口号。然后,可以使用read和write方法来接收和发送数据。例如,可以使用fread函数来接收UDP数据,使用fwrite函数来发送UDP数据。 在实际操作中,首先需要创建一个UDP对象,指定要连接的远程主机和端口号。然后,可以通过open方法打开UDP连接。接下来,可以使用fread来接收数据。例如,可以使用如下代码实现UDP接收数据: udpObj = udp('192.168.1.100', 1234); fopen(udpObj); data = fread(udpObj); fclose(udpObj); 同样,可以使用fwrite来发送数据。例如,可以使用如下代码实现UDP发送数据: udpObj = udp('192.168.1.100', 1234); fopen(udpObj); fwrite(udpObj, data); fclose(udpObj); 需要注意的是,在进行UDP通信时,需要保证远程主机的IP地址和端口号是正确的,并且两个Matlab实例之间的UDP设置是一致的。 总而言之,MatlabUDP通信提供了一种实时数据传输的方式,可以用于各种需要实时性的应用中。通过创建UDP对象,并使用读写函数,可以实现Matlab实例之间的数据传输。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值