我正在尝试在SIMULINK(客户端)和PYTHON(服务器)之间建立TCP / IP连接。我尝试在循环中发送变量的值。但是我在SIMULINK中收到的值是一些随机值(如2.5e-09或其他东西),它与我发送的值无关。我试过改变SIMULINK方面的数据类型。但没有运气。
以下是PYTHON中的代码:
import socket
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serversocket.bind(('localhost',30001))
serversocket.listen(5)
(clientsocket, address) = serversocket.accept()
for i in range(0,50):
msg1='%0.1f\n' %(float(1.1+i))
clientsocket.send(msg1.encode('utf-8'))
clientsocket.close()
以下是我的simulink块和块参数设置:
有人可以帮忙吗?
答案 0 :(得分:1)
Python服务器没有发送一个看起来客户期待的大端双精度数。相反,它发送一系列新行终止字符串:1.1\n
,2.1\n
,...,50.1\n
。
您可以使用struct
模块将float格式化为big endian double,以便通过连接进行传输。
import struct
for i in range(50):
msg1 = struct.pack('>d', 1.1+i)
clientsocket.send(msg1)
不需要对数据进行UTF8编码,因为它是应该发送的二进制值。
struct.pack()
采用格式字符串和值来打包。在这种情况下,格式字符串>d
表示大端双精度。返回的值是表示打包数据的bytes对象。例如,浮点数20.1的打包值为:
>>> struct.pack('>d', 20.1)
b'@4\x19\x99\x99\x99\x99\x9a'
如您所见,double的大小为8个字节。您可能需要将其设置为客户端中的数据大小。