在Python中读取LabVIEW TCP数据(扁平化字符串/数据集群)

2024-10-01 13:45:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个LabVIEW应用程序,它在通过TCP/IP传输到python应用程序之前,将一个由double组成的集群(数组)展平为一个字符串。它这样做是因为TCP/IP只传输字符串。在

问题是python将字符串读取为一堆无意义的ASCII字符,而我似乎无法将它们重新解读回原来的double数组。在

如何解释LabVIEW在展开数据字符串后发送的字符串数据。在谷歌上了几个小时之后,我唯一能得到的有用信息是一个名为pylpds的PyPI条目,但是它已经被删除了。在


Tags: 数据字符串ip信息应用程序ascii集群数组
3条回答

我想记录下这个问题和解决方案,这样其他人就可以避免我在谷歌上浪费时间寻找解决方案。在

当LabVIEW展平数据时,在本例中是一组double,它只将它们作为一个合并字符串发送,每个double用8个字节表示。python将其解释为每个double 8个ASCII字符,显示为nonsense in your console。在

要返回传输的双精度数,您需要依次获取每个8字节的部分,并将ASCII字符转换为它们的ASCII代码,在Python中使用ord()。 这将给你一个8字节的十进制代码(例如4.8=[64 19 51 51 51 51 51 51]

事实证明,LabVIEW做了大多数事情,包括TCP/IP传输,Big-Endian。除非你在大端工作,否则你可能需要改变一下。例如,上面的例子将变成[51 51 51 51 51 51 19 64]。我将每个double放入一个列表中,因此能够使用list(reversed())函数来更改endience。在

然后你可以把它转换回双精度。python代码示例:

import struct
b = bytearray([51,51,51,51,51,51,19,64]) #this is the number 4.8
value = struct.unpack('d', b)

print(value) #4.8

这对更有经验的程序员来说可能是显而易见的,但这让我困惑了好几天。我很抱歉使用stackoverflow作为平台,通过回答我自己的问题来分享这一点,但希望这篇文章能帮助下一个正在挣扎的人。在

编辑:注意如果您使用的是比Python2.7.5更早的版本,那么您可能会发现解包结构()将失败。使用上面的示例代码替换以下代码对我有效: b = bytes(bytearray([51,51,51,51,51,51,19,64]))

LabVIEW扁平化数据格式的详细描述here。该文档没有显式描述双精度浮点(DBL类型)是如何表示的,但是稍微搜索一下发现了this,它澄清了它们存储在IEEE 754 format中。在

不过,以标准文本格式(如XML或JSON)发送数据可能更简单,也更适合将来使用,这两种格式都由LabVIEW中的内置函数和Python中的标准库模块支持。在

不使用LabVIEW扁平化数据与其他程序交换的另一个原因是,扁平化字符串不包括将其转换回原始数据类型所需的类型描述符—您需要知道数据是什么类型,以便对其进行解码。在

这个代码对我有用。UDP服务器接受扁平dbl数组x,返回x+1到端口6503。根据需要修改LabView UDP客户端。在

import struct
import socket
import numpy as np

def get_ip():
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    try:
        # doesn't even have to be reachable
        s.connect(('10.255.255.255', 1))
        IP = s.getsockname()[0]
    except:
        IP = '127.0.0.1'
    finally:
        s.close()
    return IP

#bind_ip = get_ip()

print("\n\n[*] Current ip is %s" % (get_ip()))
bind_ip = ''
bind_port = 6502

server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server.bind((bind_ip,bind_port))  

print("[*] Ready to receive UDP on %s:%d" % (bind_ip,bind_port))

while True:
    data, address = server.recvfrom(1024)
    print('[*] Received %s bytes from %s:' % (len(data), address))

    arrLen = struct.unpack('>i', data[:4])[0]
    print('[*] Received array of %d doubles:' % (arrLen,))
    x = []
    elt = struct.iter_unpack('>d', data[4:])
    while True:
        try:
            x.append(next(elt)[0])
            print(x[-1])
        except StopIteration:
            break
    x = np.array(x)
    y = x+1 # np.sin(x)
    msg = data[:4]
    for item in y:
        msg += struct.pack('>d', item)
    print(msg)
    A = (address[0], 6503)
    server.sendto(msg, A)
    break

server.close()
print('[*] Server closed')
print('[*] Done')

LabView UDP客户端: LabView UDP client

相关问题 更多 >