首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在LabVIEW中读取Python数据(扁平化字符串/数据集群)

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

Stack Overflow用户
提问于 2015-10-17 15:53:35
回答 4查看 2.7K关注 0票数 1

我有一个LabVIEW应用程序,它在通过TCP/IP传输到我的python应用程序之前,会将一个双精度数组(数组)展平为一个字符串。它之所以这样做,是因为TCP/IP将只传输字符串。

问题是python将字符串作为一堆无意义的ASCII字符读取,而我似乎无法将它们读回原来的双精度数组。

如何解释LabVIEW在展平数据字符串后发送的字符串数据。在谷歌搜索了几个小时后,我唯一的有用信息是一个名为pyLFDS的PyPI条目,但后来它被删除了。

EN

回答 4

Stack Overflow用户

发布于 2015-10-18 04:01:06

here中对LabVIEW扁平化数据格式进行了较为详细的描述。该文档没有明确描述双精度浮点数(DBL类型)是如何表示的,但是更多的搜索发现了this,它澄清了它们存储在IEEE 754 format中。

但是,以标准文本格式发送数据可能更简单,将来也更有可能。LabVIEW中的内置函数和Python中的标准库模块都支持这两种格式。

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

票数 3
EN

Stack Overflow用户

发布于 2015-10-17 16:08:49

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

当LabVIEW展平数据时,它只是以连接字符串的形式发送数据,每个双精度值由8个字节表示。python将其解释为每双精度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。除非您使用的是Big Endian,否则可能需要对其进行更改。例如,上面的示例将变成[51 51 51 51 51 51 19 64]。我将我的每个替身放到一个列表中,这样就能够使用list(reversed())函数来更改字节顺序。

然后,您可以将其转换回double。python代码示例:

代码语言:javascript
复制
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的版本,那么您可能会发现struct.unpack()将失败。使用上面的示例代码替换以下代码对我有效:b = bytes(bytearray([51,51,51,51,51,51,19,64]))

票数 1
EN

Stack Overflow用户

发布于 2018-01-04 00:19:47

这段代码适用于我。UDP服务器接受扁平化的dbl数组x,将x+1返回到端口6503。根据需要修改LabView UDP客户端。

代码语言:javascript
复制
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客户端:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33184238

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档