为TCP / IP通信数据包输入块缓冲区

17日视图(30天)
你好,
我使用 数据包输入 块的 万博1manbetx桌面实时仿真软件 [SLDRT]图书馆仿真软件模型在外部模式下万博1manbetx运行。 https://de.mathworks.com/help/sldrt/ref/packetinput.html
在我的设置,我接收和发送串行二进制消息通过TCP / IP在frquency 500 hz。我的问题是,有5个不同长度的消息最初真正的通信开始前和消息成为不变的长度。
使用一些子系统和多个启用 包输出 块我能够处理不同的发送消息,但我不知道如何使用 数据包输入 块不同长度的接收消息。
输入块的功能包
它提供了一个槽的接收消息长度在某种程度上看起来像一个缓冲区,但表现得有点奇怪。
在下面的图片中你看到的结果初始信息。我把包uint8输入块100字节。在黑色,有消息1(最古老的)绿色有消息2和蓝色是最新的消息。我预计总共115字节,但块只是充满了数组和切断就100字节。
当我设置块比它将得到更多的字节,字节数组没有显示。
结论 :这段等待一定数量的字节被捕获并将它们存储在一个数组。如果数组填充,它再次等待相同数量的字节,然后覆盖前面的数组。
问题: 有一些方法可以接收消息的长度不同,当我知道,每条消息的前两个字节确定消息的长度? ?
我将收到的消息有以下字节长度:4,19岁,27岁,65年,3,然后不断104(至少现在)

接受的答案

Jan Houska
Jan Houska 2021年6月28日
编辑:Jan Houska 2021年6月28日
嗨Maxmilian,
你理解的功能包输入块几乎是正确的。唯一的区别是,阻塞不等待(你不能等待一个实时模型),但信号的新数据的可用性的数据准备好端口。如果数据准备好是假的,块输出相同的数据与前面的时间步。当数据准备变得真实,它意味着一个新消息在这个时间步已经收到。你也是正确的,块只返回新消息时完成。也就是说,如果你将消息长度设置为100,不设置数据块准备好直到收到100个字节。
上面的建议如何处理适应的消息。你需要几包输入端口。首先,你读一两字节消息包含大小。根据大小读,你读剩下的消息被其他包输入块设置适当读的字节数。,只因为你想读消息如果有新来的,你使用数据端口驱动实现子系统,只有实现消息阅读如果有一个新的准备。
请参阅附件为例。
祝你好运,简
1评论
马克西米利安•贝克
马克西米利安•贝克 2021年6月30日
嗨,简,
非常感谢你伟大的帮助!
首先,我喜欢你的解释,因为我现在知道,我至少明白了正确的块。我只是不清楚“等待包”部分自当然没有在实时。
其次,谢谢你分享你的方法,甚至提交一个简短的例子。很有帮助,因为我试图实现的想法使用多个读取块没有工作(我最终在代数循环使用状态表和子启用系统),但是你的方法阅读一条消息通过两个街区和传递到一个切换实例块就是聪明。
祝你有美好的一天,再见!
最好的问候,
马克斯

登录置评。

更多的答案(0)

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!

翻译的