[Matlab]使用Simulink进行UDP通讯2

原文链接:http://blog.csdn.net/humanking7/article/details/50710108


关于数据打包时的数据对齐问题

pic1

接上文 (Matlab使用Simulink进行UDP通讯1),如上图所示,在对这个4个数据进行打包的时候可以发现 uint8【即unsigned char】是占1个字节,而double是占用8个字节。

即,对应的有效数据:

  1. 数据1 uint8类型 占1个字节
  2. 数据2 double类型 占8个字节
  3. 数据3 double类型 占8个字节
  4. 数据4 uint8类型 占1个字节

在Simulink中的Pack和UnPack模块里面有“Byte alignment”参数,这个参数使用来对齐发送(接收)数据的大小,左对齐后位补齐所要的字节,补”0”

pic2



[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通讯更要注意这个参数。

你可能感兴趣的:(matlab)