You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用C++通过UDP向GnuRadio的Signal Source模块传递频率参数?

实现方案:UDP传递频率值给GnuRadio Signal Source

你的思路是对的——Signal Source的频率参数支持通过消息端口动态更新,核心就是把UDP收到的字节数组转换成GnuRadio可识别的消息,再传递给对应端口。以下是具体实现步骤:

1. 搭建GnuRadio流图

  • 添加UDP Source模块:配置与C代码一致的IP、端口,注意字节序(比如跨平台时选Network字节序,对应C发送的网络字节序)。
  • 添加Byte Stream to Message模块:设置packet length为8(对应double类型的字节长度),将UDP收到的字节流打包成完整消息。
  • 启用Signal Source的消息端口:右键Signal Source → 选择Message Ports,勾选set_freq输入端口;部分新版本GR可直接在模块参数里将Frequency设为消息驱动模式。
  • 连接端口:把Byte Stream to Message的msg输出,直接连到Signal Source的set_freq输入。

2. C++端发送逻辑

确保发送的是双精度浮点数(double)的字节形式,字节序与GR配置匹配。示例代码片段:

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <cstring>

int main() {
    int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    struct sockaddr_in servaddr{};
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(12345); // 与GR UDP Source端口一致
    inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr);

    double target_freq = 915e6; // 要设置的频率值
    // 转成网络字节序(对应GR的Network字节序设置)
    uint64_t net_freq = htobe64(*reinterpret_cast<uint64_t*>(&target_freq));
    sendto(sockfd, &net_freq, sizeof(net_freq), 0, (struct sockaddr*)&servaddr, sizeof(servaddr));

    close(sockfd);
    return 0;
}

3. 调试与验证

  • 可选添加Message Debug模块,连接Byte Stream to Message的输出,查看消息内容是否符合预期。
  • 用QT GUI Frequency Sink观察Signal Source的输出频率,确认是否随UDP发送的值动态更新。

旧版本GR兼容方案

如果你的GnuRadio版本没有Signal Source的消息端口,可自定义Python块处理:

import numpy as np
from gnuradio import gr

class freq_updater(gr.sync_block):
    def __init__(self, signal_source):
        gr.sync_block.__init__(self,
            name="freq_updater",
            in_sig=[np.uint8],
            out_sig=None)
        self.signal_source = signal_source
        self.byte_buf = bytearray()

    def work(self, input_items, output_items):
        self.byte_buf.extend(input_items[0])
        # 攒够8字节就解析更新频率
        while len(self.byte_buf) >= 8:
            freq_bytes = self.byte_buf[:8]
            self.byte_buf = self.byte_buf[8:]
            freq = np.frombuffer(freq_bytes, dtype=np.double)[0]
            self.signal_source.set_frequency(freq)
        return len(input_items[0])

流图中把UDP Source的输出连到这个自定义块,同时将Signal Source的实例传入该块初始化参数即可。

内容的提问来源于stack exchange,提问作者raff5184

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 03:22:46