Как мне получить доступ к данным из rp_remote_acquire? - PullRequest
0 голосов
/ 08 апреля 2019

В настоящее время у меня есть программа на python, которая (очень медленно) получает данные с доски Red Pitaya путем рекурсивного вызова: redpitaya_scpi.scpi(192.169.1.100).rx_txt()

Я хотел бы использовать rp_remote_acquire для достижения более высокогопропускная способность с кольцевым буфером.

Я могу выполнить ./rp_remote_acquire на Red Pitaya (сервер) и на машине linux (клиент) благодаря stackoverflow .

Я получаю некоторый уникальный контент в /tmp/out каждый раз, когда я выполняю следующие команды на Red Pitaya (что говорит о том, что программа на сервере имеет доступ к данным со своего оборудования).

rm /tmp/out
./rp_remote_acquire -m 3
cat /tmp/out

InЧтобы передать данные с Red Pitaya (клиент) на машину linux (сервер), я запускаю ./rp_remote_acquire со следующими параметрами:

Сервер (192.169.1.100): ./rp_remote_acquire -m 2 -a 192.169.1.102 -p 14000

Клиент (192.169.1.102): ./rp_remote_acquire -m 1 -a 192.169.1.100 -p 14000

Где:

-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 возврат)ноль).

Клиент завершает выполнение tон следует фрагменту кода из Transfer.C

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 по умолчанию):

533     while (!size || transferred < size) {
552         memcpy(buf, mapped_base + pos, len);
552         memcpy(buf, mapped_base + pos, len);
569         pos += len;
        }

Такое поведение, похоже, является намерением программиста, поскольку клиент останавливается, как только сервер останавливается:

554         if (handles->sock >= 0) {
(gdb) 
556                 if (!interrupted)

программа не застревает в этом цикле, когда я изменяю size, напримерчто он не равен нулю (=> меньшие пакеты?).

Я хотел бы иметь возможность получить доступ к данным, которые (надеюсь) отправляются с Red Pitaya (сервера) на машину linux (клиент) и каким-то образом сделать эти данные доступными для программы на компьютере клиента.

Мой вопрос (ы):

  • Что здесь происходит и как я могуполучить доступ к данным?

  • Нужно ли синхронно запускать на клиенте вторую программу, которая каким-то образом считывает данные, которые rp_remote_acquire копирует в память клиента?

1 Ответ

0 голосов
/ 08 мая 2019

Решение удивительно просто.

При правильной работе в режиме сервера rp_remote_acquire записывает данные в сокет:

/*
 * 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 :

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...