On 2022-04-27 13:52, Caffrey, Michael Paul via USRP-users wrote:

Hi all,

I am trying to use two e320’s to collect data at the same time derived from some examples. I would like to perform this repeatedly, however it only succeeds on the  1^st attempt, subsequently I get mysterious ‘LL…” and no data with an ERROR_CODE_LATE_COMMAND. The modified example is below the output. Any suggestions are appreciated! -Mike

[INFO] [UHD] linux; GNU C++ version 9.4.0; Boost_107100; UHD_4.1.0.5-0-g6bd0be9c

[INFO] [MPMD] Initializing 2 device(s) in parallel with args: mgmt_addr0=192.168.50.201,type0=e3xx,product0=e320,serial0=31DFBB8,fpga0=1G,claimed0=False,mgmt_addr1=192.168.50.202,type1=e3xx,product1=e320,serial1=31DE2CC,fpga1=1G,claimed1=False,addr0=192.168.50.201,addr1=192.168.50.202

[WARNING] [MPM.RPCServer] A timeout event occured!

[WARNING] [MPM.RPCServer] A timeout event occured!

[INFO] [MPM.PeriphManager] init() called with device args `fpga=1G,mgmt_addr=192.168.50.201,product=e320'.

[INFO] [MPM.PeriphManager] init() called with device args `fpga=1G,mgmt_addr=192.168.50.202,product=e320'.

[INFO] [0/Radio#0] Performing CODEC loopback test on channel 0 ...

[INFO] [0/Radio#0] CODEC loopback test passed

[INFO] [0/Radio#0] Performing CODEC loopback test on channel 1 ...

[INFO] [0/Radio#0] CODEC loopback test passed

[INFO] [0/DmaFIFO#0] BIST passed (Estimated Minimum Throughput: 1361 MB/s)

[INFO] [0/DmaFIFO#0] BIST passed (Estimated Minimum Throughput: 1361 MB/s)

[INFO] [1/Radio#0] Performing CODEC loopback test on channel 0 ...

[INFO] [1/Radio#0] CODEC loopback test passed

[INFO] [1/Radio#0] Performing CODEC loopback test on channel 1 ...

[INFO] [1/Radio#0] CODEC loopback test passed

[INFO] [1/DmaFIFO#0] BIST passed (Estimated Minimum Throughput: 1361 MB/s)

[INFO] [1/DmaFIFO#0] BIST passed (Estimated Minimum Throughput: 1361 MB/s)

[WARNING] [0/Radio#0] Attempting to set tick rate to 0. Skipping.

[WARNING] [1/Radio#0] Attempting to set tick rate to 0. Skipping.

Has timespec: No        Time of first sample: 0

Fragmented: No  Fragmentation offset: 0

Start of burst: No      End of burst: No

Error Code: ERROR_CODE_TIMEOUT  Out of sequence: No

500000

Backend TkAgg is interactive backend. Turning interactive mode on.

LLHas timespec: No      Time of first sample: 0

Fragmented: No  Fragmentation offset: 0

Start of burst: No      End of burst: No

Error Code: ERROR_CODE_LATE_COMMAND     Out of sequence: No

0

Done!

---------------------------------------------------------------------- code

#!/usr/bin/env python3

#

# Copyright 2017-2018 Ettus Research, a National Instruments Company

#

# SPDX-License-Identifier: GPL-3.0-or-later

#

"""

RX samples to file using Python API

"""

import argparse

from xml.etree.ElementTree import tostring

import numpy as np

import uhd

import matplotlib.pyplot as plt

import time

#./rx_to_file.py -f 80.0e6 -o ./test1.dat -d 1.0 -r 1.0e6 -a addr=192.168.50.201

def parse_args():

    """Parse the command line arguments"""

    parser = argparse.ArgumentParser()

    parser.add_argument("-a", "--args", default="addr=192.168.50.201", type=str)

    parser.add_argument("-o", "--output-file", default="./test.bin",type=str, required=False)

    parser.add_argument("-f", "--freq", default=80e6, type=float, required=False)

    parser.add_argument("-r", "--rate", default=5e5, type=float)

    parser.add_argument("-d", "--duration", default=1.0, type=float)

    parser.add_argument("-c", "--channels", default=0, nargs="+", type=int)

    parser.add_argument("-g", "--gain", type=int, default=1) # range is int supposedly 0 - 76db range,

    parser.add_argument("-n", "--numpy", default=False, action="store_true",

                        help="Save output file in NumPy format (default: No)")

    return parser.parse_args()

timeStep = 10.0

class multiRcvr:

    def __init__(self, addr, args) :

        self.usrp = uhd.usrp.MultiUSRP(addr)

self.usrp.set_clock_source("gpsdo",0)

self.usrp.set_time_source("gpsdo",0)

self.usrp.set_clock_source("gpsdo",1)

self.usrp.set_time_source("gpsdo",1)

        for mboard in range(2):

            t0 = time.time()

            while self.usrp.get_mboard_sensor("gps_locked",mboard).value == 'false':

                time.sleep(1.0)

                if time.time() - t0 > 30.0:

                    print("COULD NOT GET GPS LOCK on " + str(mboard) + " ********************************")

                    break

        # https://kb.ettus.com/Synchronizing_USRP_Events_Using_Timed_Commands_in_UHD

        # https://files.ettus.com/manual/page_sync.html

        self.num_samps = int(np.ceil(args.duration*args.rate))

        if not isinstance(args.channels, list):

            args.channels = [args.channels]

        self.channels = [0, 1]

        # time_at_last_pps = usrp.get_time_last_pps().get_real_secs()

        # print(time_at_last_pps)

        # usrp.set_time_next_pps(uhd.libpyuhd.types.time_spec(0.0))

       # time.sleep(1)

        # To = usrp.get_time_now()

        # print( To.get_real_secs() )

        # https://files.ettus.com/manual/page_multiple.html#multiple_setup

self.usrp.set_rx_subdev_spec(uhd.usrp.SubdevSpec("A:0"),0) # disable other channels on 1st usrp

self.usrp.set_rx_subdev_spec(uhd.usrp.SubdevSpec("A:0"),1) # disable other channels on 2nd usrp

        # https://pysdr.org/content/usrp.html

        # second arg is channel (int); if not present channels defaults to 0

        # gain can vary 0 - 76

        self.usrp.set_rx_rate(args.rate,0)

self.usrp.set_rx_freq(uhd.libpyuhd.types.tune_request(args.freq),0)

        self.usrp.set_rx_gain(10,0)

        self.usrp.set_rx_rate(args.rate,1)

self.usrp.set_rx_freq(uhd.libpyuhd.types.tune_request(args.freq), 1)

        self.usrp.set_rx_gain(args.gain, 1)

        # Set up the stream and receive buffer

        self.st_args = uhd.usrp.StreamArgs("fc32", "sc16")

        self.st_args.channels = self.channels

        self.metadata = uhd.types.RXMetadata()

        self.recv_buffer = np.zeros((len(self.channels), 1000), dtype=np.complex64)

        self.stream_cmd = uhd.types.StreamCMD(uhd.types.StreamMode.num_more) # num_done

        self.stream_cmd.num_samps = self.num_samps

        self.stream_cmd.stream_now = False

        self.stream_cmd.time_spec = uhd.libpyuhd.types.time_spec(timeStep) # set start time (try tweaking this)

        self.streamer = self.usrp.get_rx_stream(self.st_args)

    def printMultiUsrpInfo(self):

        print('rx channels in multi usrp : ' + str(self.usrp.get_rx_num_channels()))

        for chan in self.channels:

            mboard = chan

            print('clock_source ' + str(mboard) + ' : ' + self.usrp.get_clock_source(mboard)) # really mboard

            print('time_source ' + str(mboard) + ' : ' + self.usrp.get_time_source(mboard)) # this isn't really channel , it is mboard

            print('rx_info ' + str(chan) + ' : ' + str(self.usrp.get_usrp_rx_info(chan)))

            rxfiltername = self.usrp.get_rx_filter_names(chan)

            print('rxfiltername ' + str(chan) + ' : '  + str(rxfiltername)) # why doesn't this work?

#print(self.usrp.get_rx_filter(rxfiltername,chan))

            print('rx_gain_range ' + str(chan) + ' : ' + str(self.usrp.get_rx_gain_range(chan)))

            print('rx_gain ' + str(chan) + ' : ' + str(self.usrp.get_rx_gain(chan)))

            print('rx_freq ' + str(chan) + ' : ' + str(self.usrp.get_rx_freq(chan)))

            rx_sensors = self.usrp.get_rx_sensor_names(chan)

            for rx_sensor in rx_sensors:

                print("\t" + rx_sensor + " : " + self.usrp.get_rx_sensor(rx_sensor,mboard).value)

            mboard_sensors = self.usrp.get_mboard_sensor_names(mboard)

            for mboard_sensor in mboard_sensors:

                print("\t" + mboard_sensor + " : " + self.usrp.get_mboard_sensor(mboard_sensor,mboard).value)

    def wait4pps(self):

        # Wait for 1 PPS to happen, then set the time at next PPS to 0.0

        time_at_last_pps = self.usrp.get_time_last_pps().get_real_secs()

        while time_at_last_pps == self.usrp.get_time_last_pps().get_real_secs():

            time.sleep(0.05) # keep waiting till it happens- if this while loop never finishes then the PPS signal isn't there

        time.sleep(.01) # make sure all devices are into the next second

self.usrp.set_time_next_pps(uhd.libpyuhd.types.time_spec(0.0)) # defaults to all devices

        # Schedule Rx of num_samps samples exactly N seconds from last PPS

self.streamer.issue_stream_cmd(self.stream_cmd)

    def capture(self):

        # Receive Samples.  recv() will return zeros, then our samples, then more zeros, letting us know it's done

        waiting_to_start = True # keep track of where we are in the cycle (see above comment)

        nsamps = 0

        i = 0

        # re-initialize samples every time so we don't see old data

        self.samples = np.zeros([len(self.channels),self.num_samps], dtype=np.complex64)

        #while nsamps != 0 or waiting_to_start:

        t0 = time.time()

        metadataLast = uhd.types.RXMetadata()

        while i < self.num_samps:

            nsamps = self.streamer.recv(self.recv_buffer, self.metadata, timeout=timeStep)

            if self.metadata != metadataLast:

                print(self.metadata)

                metadataLast = self.metadata

            # if nsamps and waiting_to_start:

            #     waiting_to_start = False

            # elif nsamps:

            if nsamps:

                self.samples[:,i:i+nsamps] = self.recv_buffer[:,0:nsamps]

            i += nsamps

            if time.time() - t0 > 16.0:

                break

        print(i)

def main():

    """RX samples and write to file"""

    args = parse_args()

    usrp = multiRcvr ("addr0=192.168.50.201,addr1=192.168.50.202",args)

    for _ in range(2):

        usrp.wait4pps()

        usrp.capture()

        timeIdx = np.arange(usrp.num_samps)/args.rate

        fig, ax = plt.subplots()

        l1 = ax.plot(usrp.samples[0,:].real,label='201 R')

        l2 = ax.plot(usrp.samples[0,:].imag,label='201 I')

        l3 = ax.plot(usrp.samples[1,:].real,label='202 R')

        l4 = ax.plot(usrp.samples[1,:].imag,label='202 I')

        ax.legend( loc='upper right', shadow=True)

        ax.grid()

        plt.show(block=False)

        time.sleep(10.0)

    print('Done!')

    # with open(args.output_file, 'wb') as out_file:

    #     if args.numpy:

    #         np.save(out_file, samps, allow_pickle=False, fix_imports=False)

    #     else:

    #         samps.tofile(out_file)

if __name__ == "__main__":

    main()


_______________________________________________
USRP-users mailing list [email protected]
To unsubscribe send an email [email protected]
If you just wait "a while" does it succeed again, or do you have to reset the E320?

_______________________________________________
USRP-users mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to