GNURadio如何处理发送给ben的数据包

2024-10-01 17:41:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在写一个GNU无线电模块来实现无线电SOC的协议。这个SOC的工作方式是,你给它一堆字节,然后让它发送这些字节,然后它将信号输出到天线。SOC执行一些帧和特殊编码,然后使用GFSK进行调制

我想把它分成两部分。一个GFSK调制块(刚从标准GNU无线电中获取)和一个实际执行成帧和编码的块

然而,我无法找出正确的方法来制作这个块。我的第一个想法是让这个块成为一个“源”,它接受消息、对消息进行帧处理并将消息放入队列。然后work函数只输出队列中的任何内容,或者如果没有输出0

然而,这有一些奇怪的调度工件,并且似乎不是GNU无线电中移动数据包的预期方式。相反,根据我所读到的,我应该使用标记流。我的问题是:如何处理“如果没有数据包,就不要发送任何数据”的行为

我觉得我对GNU收音机的工作原理有一个基本的误解。我认为我认为流中的样本应该以固定间隔发送的假设是错误的。然而,最末端的SDR接收器并不期望以固定间隔进行采样。 或者,我的第一个想法是使用消息,这是正确的方法,但尝试这一点感觉很恶心

下面是我基于消息的块的一个简单模型。 另一个缺点是,在GFSK之后,这将传输一个常数0,而不是静默。虽然我可以用标签来解决这个问题,只要在不发送数据包的情况下减弱信号

class frame_and_encode(gr.source_block):

    def __init__(self):

        self.message_port_register_int(pmt.intern("incomming_packets"))
        self.set_msg_handler(pmt.intern("incomming_packets"), self.handle_new_packet)

        self.chip_queue = deque()

    def handle_new_packet(self, msg):
        packet = np.array(pmt.to_python(msg), dtype=np.byte)
        # Returns a list of 'bytes' which should be GFSK modulated
        chipped = self.packet_to_chips(packet)
        self.chip_queue.extend(chipped)

    def work(self, input_items, output_items):
        out = output_items[0]
        bytes_requested = len(out)

        bytes_in_queue = len(self.chip_queue)
        for idx1 in range(min(bytes_requested, bytes_in_queue)):
            out[idx1] = self.chip_queue.popleft()
        # Idx gets saved at the end of this loop, re-used in the next loop
        for idx2 in range(idx1+1, bytes_requested):
            out[idx2] = 0

        return len(output_items[0])


Tags: ingnuself消息bytesqueuepacketdef

热门问题