首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从rp_remote_acquire访问数据?

如何从rp_remote_acquire访问数据?
EN

Stack Overflow用户
提问于 2019-04-08 17:35:29
回答 1查看 612关注 0票数 0

我现在有一个python程序,它通过递归调用:redpitaya_scpi.scpi(192.169.1.100).rx_txt()从Red板接收数据(非常慢)

我希望使用获得来实现更高的吞吐量。

我能够在Red (服务器)和linux机器(客户端) ./rp_remote_acquire上执行感谢堆叠溢出

每次在Red上执行以下命令时,我都会在/tmp/out中获得一些独特的内容(这意味着服务器上的程序可以访问其硬件上的数据)。

代码语言:javascript
复制
rm /tmp/out
./rp_remote_acquire -m 3
cat /tmp/out

为了将数据从Red (客户端)传输到linux机器(服务器),我使用以下参数启动./rp_remote_acquire

服务器(192.169.1.100):./rp_remote_acquire -m 2 -a 192.169.1.102 -p 14000

Client (192.169.1.102):./rp_remote_acquire -m 1 -a 192.169.1.100 -p 14000

其中:

代码语言:javascript
复制
-m  --mode <(1|client)|(2|server)|(3|file)>
        operating mode (default client)

-a  --address <ip_address>
        target address in client mode (default empty)

-p  --port <port_num>
        port number in client and server mode (default 14000)

这两台机器都能相互连接,机器也能建立一个连接。int connection_start(option_fields_t *options, struct handles *handles) at transfer.c:251返回零)。

客户端最后从transfer.c执行以下代码片段

代码语言:javascript
复制
533     while (!size || transferred < size) {
(gdb) n
534         if (pos == buf_size)
(gdb) n
539         if (pos + CHUNK <= curr) {
(gdb) n
552         memcpy(buf, mapped_base + pos, len);
(gdb) n
554         if (handles->sock >= 0) {
(gdb) n
552         memcpy(buf, mapped_base + pos, len);
(gdb) n
554         if (handles->sock >= 0) {
(gdb) n
555             if (send_buffer(handles->sock, options, buf, len) < 0) {
(gdb) n
569         pos += len;
(gdb) n
533     while (!size || transferred < size) {

客户端似乎实际上正在执行以下操作(注意,默认情况下是size = 0 ):

代码语言:javascript
复制
533     while (!size || transferred < size) {
552         memcpy(buf, mapped_base + pos, len);
552         memcpy(buf, mapped_base + pos, len);
569         pos += len;
        }

这种行为似乎是程序员的意图,因为一旦服务器停止,客户端就会停止:

代码语言:javascript
复制
554         if (handles->sock >= 0) {
(gdb) 
556                 if (!interrupted)

当我更改size使其不等于零(=>较小的数据包?)时,程序不会被困在这个循环中。

我希望能够访问从Red (服务器)发送到linux机器(客户机)的数据(希望如此),并以某种方式将这些数据提供给客户机上的python程序。

我的问题是:

  • 这里发生了什么,我如何访问这些数据?
  • 我是否需要在客户机上同步运行第二个程序,以某种方式读取rp_remote_acquire复制到客户端内存中的数据?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-08 15:14:57

解决方案非常简单。

当它在服务器模式下正常运行时,rp_remote_acquire将数据写入套接字:

代码语言:javascript
复制
/*
 * transfers samples to socket via read() call on rpad_scope
 */
static u_int64_t transfer_readwrite(struct scope_parameter *param,
                                    option_fields_t *options, struct handles *handles)

在客户端模式下,它从套接字读取数据,并使用它做一些事情。

因为我们在这里使用套接字,所以我们不需要关心rp_remote_acquire在客户端模式下做什么。我们可以使用python脚本创建自己的套接字,并接收脚本中的数据(这就是我希望获得数据的地方)。

这是来自@otobrzo的一个例子

代码语言:javascript
复制
import socket
import numpy as np
import matplotlib.pyplot as plt


client  = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

ip=socket.gethostbyname("XX.XX.XX.XX") # IP of redpitaya in server mode: 

# run cat ddrdump.bit > /dev/xdevcfg
#compiled and run on redpitay  ./rp_remote_acquire -m 2 -k 0 -c 0 -d 0


port=14000 # default port for TCP 

address=(ip,port)
client.connect(address)  

Nl = 10000

#while True:
for x in range(0, Nl):
#    print("test1")
    bytes_data = client.recv(1024) # set the amount data transferred

    if x == 0: 
        data = np.frombuffer(bytes_data, dtype=np.int16) # from 16bit data to int16 
        data = np.array(data, dtype=float)
        data_all = data
    else: 
        data = np.frombuffer(bytes_data, dtype=np.int16) # from 16bit data to int16 
        data = np.array(data, dtype=float)  
        data_all= np.hstack((data_all,data)) 

#%%
FPS = 125e6        
time = np.arange(0,np.size(data_all))/FPS

plt.plot(time,data_all)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55578845

复制
相关文章

相似问题

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