使用Simulink进行UDP通讯

本文转载自:祥的博客
1:http://blog.csdn.net/humanking7/article/details/50709771

2:http://blog.csdn.net/humanking7/article/details/50710108

使用 Matlab 的 Simulink 进行 UDP通讯 需要注意 数据的打包和解包

使用Simulink进行UDP发送
下图所示使用 Simulink 模块搭建的 UDP发送端
在这里插入图片描述

原理介绍
就是将4个信号【4个数据】用UDP模块发送到10.13.68.220:9090

模块介绍

模块1.数据打包 Pack

其中的 数据打包模块 Pack 用来将要发送的多个数据打包成为一个uint8数据流 【当作unsigned char型数组看待】。

Help文档的Description:

The Pack block is used to convert one or more Simulink signals of varying data types to a single vector of uint8 as required by the Send block.
在这里插入图片描述
如上图所示,这个模块有两个参数

1、Input port data types
2、Byte alignment
第一个参数 Input port data types 是得到输入参数的数据类型【用来确定如何转换为unsigned char型数组】

第二个参数 Byte alignment 是用于数据对齐的,具体用法会在下面详细介绍到。

模块2.UDP发送 UDP Send

UDP发送模块用来将打包好的数据,发送到指定的IP的端口中
在这里插入图片描述
其中有3类参数

1、Remote address 和 Port 指定要发送到的IP地址和端口
2、Local Port 是 本机的发送端口
3、Byte order 是用来指定数据发送的大小端问题

模块3.数据类型转换 Data Type Conversion

这个模块是用来将一个数据类型转换成另一个数据类型
在这里插入图片描述
我的这个Simulink模型中,信号源1和信号源4用了此模块,这是因为模块前的信号是double【Constant发出的信号是double类型的,虽然是65和97两个整数】,而模块后的所需要的数据类型是uint8【Pack模块中设置的是”uint8,double,double,uint8”】。

所以需要数据类型转换。

接收情况
当 Byte alignment = 2 时,接收到的数据如下【多组数据,1列一组】:

    41 00 00 00 00 00 00 00 00 00 7B 14 AE 47 E1 7A 94 3F 61 00
    41 00 39 13 17 36 BB 67 07 40 7B 14 AE 47 E1 7A 94 3F 61 00
    41 00 12 B4 0F 9A 1E 5C 16 40 7B 14 AE 47 E1 7A 94 3F 61 00
    41 00 36 80 8D 0C 0E 05 1F 40 7B 14 AE 47 E1 7A 94 3F 61 00
    41 00 11 E5 19 D9 51 74 22 40 7B 14 AE 47 E1 7A 94 3F 61 00
    41 00 95 B0 36 43 1A C0 23 40 7B 14 AE 47 E1 7A 94 3F 61 00
    41 00 2D FF AC 26 3D 48 23 40 7B 14 AE 47 E1 7A 94 3F 61 00
    41 00 BF 48 F3 85 6F 17 21 40 7B 14 AE 47 E1 7A 94 3F 61 00
    41 00 CA B9 88 56 93 BF 1A 40 7B 14 AE 47 E1 7A 94 3F 61 00
    41 00 90 7A C3 34 9B EC 10 40 7B 14 AE 47 E1 7A 94 3F 61 00

在这里插入图片描述
接下来将会分析打包模块Pack 的参数 Byte alignmen 对数据发送的影响。

关于数据打包时的数据对齐问题
在这里插入图片描述如上图所示,在对这个4个数据进行打包的时候可以发现 uint8【即unsigned char】是占1个字节,而double是占用8个字节。

即,对应的有效数据:

数据1 uint8类型 占1个字节
数据2 double类型 占8个字节
数据3 double类型 占8个字节
数据4 uint8类型 占1个字节
在Simulink中的Pack和UnPack模块里面有“Byte alignment”参数,这个参数使用来对齐发送(接收)数据的大小,左对齐后位补齐所要的字节,补”0”
在这里插入图片描述
[8 字节]对齐
当 Byte alignment = 8 时,也就是把这个 uint8 对齐为 8个字节

得到的数据如下(多组数据,1列一组):

    41 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 7B 14 AE 47 E1 7A 94 3F 61 00 00 00 00 00 00 00
    41 00 00 00 00 00 00 00 9A 99 4D 85 3F A9 20 40 7B 14 AE 47 E1 7A 94 3F 61 00 00 00 00 00 00 00
    41 00 00 00 00 00 00 00 C0 74 C5 07 79 5A F6 3F 7B 14 AE 47 E1 7A 94 3F 61 00 00 00 00 00 00 00
    41 00 00 00 00 00 00 00 F8 65 C0 35 29 F8 1D C0 7B 14 AE 47 E1 7A 94 3F 61 00 00 00 00 00 00 00
    41 00 00 00 00 00 00 00 FE 91 BC 69 98 FC 22 C0 7B 14 AE 47 E1 7A 94 3F 61 00 00 00 00 00 00 00
    41 00 00 00 00 00 00 00 EE 62 07 82 34 21 06 C0 7B 14 AE 47 E1 7A 94 3F 61 00 00 00 00 00 00 00
    41 00 00 00 00 00 00 00 D8 22 9A 70 44 04 1A 40 7B 14 AE 47 E1 7A 94 3F 61 00 00 00 00 00 00 00

分析其中一列,可知

    41 00 00 00 00 00 00 00 
    58 F4 E4 FA 0B 01 22 40 
    7B 14 AE 47 E1 7A 94 3F 
    61 00 00 00 00 00 00 00

当参数“Byte alignment”为“8”的时候,也就是把这个uint8对齐为8个字节(uint8本来只占1个字节,而double占8个字节)

不管你的数据类型是什么,都会将这个数据类型的大小扩展为8个字节,不够的后面补0

[2 字节]对齐
当 Byte alignment = 2 时,也就是把这个 uint8 对齐为 2个字节

得到的数据如下(多组数据,1列一组):

    41 00 00 00 00 00 00 00 00 00 7B 14 AE 47 E1 7A 94 3F 61 00
    41 00 39 13 17 36 BB 67 07 40 7B 14 AE 47 E1 7A 94 3F 61 00
    41 00 12 B4 0F 9A 1E 5C 16 40 7B 14 AE 47 E1 7A 94 3F 61 00
    41 00 36 80 8D 0C 0E 05 1F 40 7B 14 AE 47 E1 7A 94 3F 61 00
    41 00 11 E5 19 D9 51 74 22 40 7B 14 AE 47 E1 7A 94 3F 61 00
    41 00 95 B0 36 43 1A C0 23 40 7B 14 AE 47 E1 7A 94 3F 61 00
    41 00 2D FF AC 26 3D 48 23 40 7B 14 AE 47 E1 7A 94 3F 61 00
    41 00 BF 48 F3 85 6F 17 21 40 7B 14 AE 47 E1 7A 94 3F 61 00
    41 00 CA B9 88 56 93 BF 1A 40 7B 14 AE 47 E1 7A 94 3F 61 00
    41 00 90 7A C3 34 9B EC 10 40 7B 14 AE 47 E1 7A 94 3F 61 00

分析其中一列,可知

    41 00 
    39 13 17 36 BB 67 07 40 
    7B 14 AE 47 E1 7A 94 3F 
    61 00

当参数“Byte alignment”为“2”的时候,也就是把这个uint8对齐为2个字节(uint8本来只占1个字节,而double占8个字节)

[1 字节]对齐
当 Byte alignment = 1 时,也就是把这个 uint8 对齐为 1个字节

得到的数据如下(多组数据,1列一组):

    41 00 00 00 00 00 00 00 00 7B 14 AE 47 E1 7A 94 3F 61
    41 39 13 17 36 BB 67 07 40 7B 14 AE 47 E1 7A 94 3F 61
    41 12 B4 0F 9A 1E 5C 16 40 7B 14 AE 47 E1 7A 94 3F 61
    41 36 80 8D 0C 0E 05 1F 40 7B 14 AE 47 E1 7A 94 3F 61
    41 11 E5 19 D9 51 74 22 40 7B 14 AE 47 E1 7A 94 3F 61
    41 95 B0 36 43 1A C0 23 40 7B 14 AE 47 E1 7A 94 3F 61
    41 2D FF AC 26 3D 48 23 40 7B 14 AE 47 E1 7A 94 3F 61
    41 BF 48 F3 85 6F 17 21 40 7B 14 AE 47 E1 7A 94 3F 61
    41 CA B9 88 56 93 BF 1A 40 7B 14 AE 47 E1 7A 94 3F 61
    41 90 7A C3 34 9B EC 10 40 7B 14 AE 47 E1 7A 94 3F 61
    41 D4 74 C5 07 79 5A F6 3F 7B 14 AE 47 E1 7A 94 3F 61

分析其中一列,可知

    41 
    39 13 17 36 BB 67 07 40 
    7B 14 AE 47 E1 7A 94 3F 
    61

当参数“Byte alignment”为“1”的时候,也就是把这个uint8对齐为1个字节(uint8本来只占1个字节,而double占8个字节)

总结
一般没有特殊要求时还是将“Byte alignment”设为“1”比较容易理解和操作,尤其是Matlab与非Matlab环境进行UDP通讯更要注意这个参数。

  • 6
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Simulink中,使用UDP进行数据收发的模块主要包括UDP send和UDP receive。这两个模块需要配合使用,并且使用Byte Packing和Byte Unpacking进行参数配置。在Matlab2017b版本中,可以使用这些功能进行数据的传输和接收。 为了方便验证UDP收发模块,可以将UDP send和UDP receive放在同一个.slx文件中进行调试配置。例如,可以使用UDP send发送6个double类型的数据。 在Simulink中,为了将不同数据类型的信号转换为Send block所需的uint8类型的向量,可以使用Pack block。这个模块有两个参数,可以根据需要进行配置。 综上所述,在Simulink使用UDP进行数据收发,可以通过配置UDP send和UDP receive模块,配合使用Byte Packing和Byte Unpacking进行参数配置。使用Pack block可以将不同数据类型的信号转换为uint8类型的向量。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [基于simulinkUDP通信](https://blog.csdn.net/weixin_42660579/article/details/118418376)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [使用Simulink进行UDP通讯](https://blog.csdn.net/loverobot_159/article/details/105076504)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值