В настоящее время у меня есть программа на 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
копирует в память клиента?