FT-710 · 实操记录

一根 USB 线,替掉一只 dongle

把 FT4222 那条 SPI 频谱通路摸清楚之后,SCU-LAN10 这只网络盒子就可以彻底不买。CAT、瀑布图、音频,全走你本来就插着的那根线。

一根线 · 三个接口 FT4222 SPI · 4096 字节帧 不用 SCU-LAN10 已归档 2026-09-12

BG1SB  ·   ·  约 9 分钟

如果你有 FT-710,又想过远程,那你一定碰见过 SCU-LAN10:雅马哈那只把电台接上局域网的小盒子。它确实能用,但它是额外一只盒子、一套私有协议、一个关着的黑箱。这篇讲另一条路:用一根 USB 线控制 FT-710,读出真正的频谱与瀑布图,同时把音频带出来,不需要任何额外硬件。

TL;DR — 五条结论

  • 事实USB 口一次暴露三个设备。CP210x 串口管 CAT,FTDI FT4222 桥管频谱,C-Media 编解码管音频,全在你手上那根线里。
  • 事实频谱是算好的。每个接收机 850 个幅度值,装进 4096 字节的帧,大约每秒 30 帧;FFT 由电台内部的 SDR 引擎完成。
  • 事实音频是标准 UAC 设备。44.1 kHz 的采集与回放在同一根线上完成,不需要额外声卡。
  • 推断三条链路互相独立。CAT、频谱、音频各自失败、各自降级,不会一起把会话带走。
  • 事实今天跑这条路的是 MRRC Modern。单机型项目已于 2026-09-12 归档,现在它是若干后端之一。

一根线里的三张面孔

插上线,系统看到三个设备,不是一个。

插一根 USB 线,把电脑和 FT-710 连起来,操作系统会看到三个设备,不是一个:

接口USB 端点送的是什么
增强 COM 口CP210x UART38400 波特的 CAT 指令
FT4222 SPI 桥FTDI D2XX两个接收机各 850 点 FFT 频谱,约 30 fps
USB 音频编解码C-Media44.1 kHz 接收采集 + 发射回放

大多数人以为「USB 就等于 CAT」,因为只有串口是用户看得见的。FT4222 桥和 C-Media 编解码平时被前面板显示和雅马哈自己的 SCU-LAN10 内部消化掉了。用 FTDI D2XX 驱动、按描述符字符串 "FT4222 A" 打开设备,那条藏着的频谱通路就在那里。

这篇讲的是一个开源项目 MRRC FT-710 的故事,它的起点是一个大多数机主都不知道的事实:FT-710 里已经装好了高质量远程控制需要的一切。背后那只 USB 口不是一条 CAT 串口,它同时暴露三个互相独立的接口。

不做 dongle 的频谱

每个接收机 850 个幅度值,直接从 SPI 总线上下来;不用 dongle,也不用 IQ 流。

FT4222 是焊在 FT-710 主板上的一颗 FTDI USB 转 SPI 桥接芯片。我们的配置刻意保守,照抄 wfview 的 ft4222handler.cpp

SPI mode:    single I/O (SPI_IO_SINGLE)
Clock:       SYS_CLK_24 (24 MHz) ÷ CLK_DIV_64  →  375 kHz SPI clock
CPOL / CPHA: idle HIGH, data on leading edge
Slave select: 0x01
Read size:   4096 bytes per transaction

SPI 时钟分频在运行时还能通过 FT710_FT4222_CLK_DIV 环境变量调整,遇到挑线的 USB 线或者集线器时有用。每次 SPI 事务取回一帧 4096 字节的频谱数据。

这里的架构要点是:SPI 总线上下来的是已经算好的幅度数据,不是原始 IQ。FT-710 内部的 SDR 引擎做完 FFT,把每个接收机 850 个幅度值交给主机。这跟 KiwiSDR、RX888 那类流式 SDR 有本质区别:它们把原始 IQ 推给主机,让主机去算 FFT。对远程控制来说,拿到算好的频谱意味着笔记本甚至树莓派都能用很小的 CPU 开销画出瀑布图。

4096 字节里的帧

两个接收机的频谱,加一个 150 字节的元数据块,用 4 字节同步尾校验。

每一帧都是一个紧凑结构,装着两个接收机的频谱和一段密集的元数据:

偏移长度内容
0–849850 BWF1 频谱(取反;每字节按 ~b & 0xFF 修正)
850–1699850 BWF2 频谱(第二个接收机)
1700–28991200 B保留 / 附加数据
2900–3049150 B元数据块
4092–40954 B同步尾 0xFF 0x01 0xEE 0x01

那 150 字节元数据块里,电台把当前状态几乎全说了:频谱模式、前置放大与衰减器位、span、工作模式、VFO-A 频率(同时给 5 字节 BCD 和 4 字节大端两种形式)、原始 S 表值,以及频谱起始频率。帧同步靠那 4 字节同步尾校验,SPI 总线大约每秒送 30 帧。

一个值得知道的怪癖:频谱字节是反的。早期照着直读写出来的瀑布图,看起来像一张负片。修法是每个字节做一次 ~b & 0xFF

增强 COM 口上的 CAT

38400 波特的雅马哈原生 CAT,不用 Hamlib,也不用 rigctld。

控制走 CP210x 串口,用的是雅马哈原生 CAT,不经过 Hamlib,也不经过 rigctld。这个项目刻意不依赖 Hamlib,SDD 里有一条架构决策专门记了这件事(AD-002):对 FT-710 的 CAT 方言来说,直接实现更小也更快。

协议就是那套熟悉的两字母指令格式:

FA014200000;   # 把 VFO-A 设到 14.200 MHz

实际使用中要紧的几条:

  • 38400 波特、8N1,不做流控(CP210x 不支持 RTS/CTS)。
  • 连上之后服务器先发 AI0; 关掉电台的自动信息流,然后改成主动轮询。被动轮询比消化一串异步推送可预测得多。
  • 两条指令之间留 20 毫秒的写后延时,与 Hamlib 的 post_write_delay 一致;不留的话,FT-710 的 CAT 处理器就是跟不上。
  • 时间敏感的指令(PTT 的 TX1;、天调的 TX2;)走一条优先路径,会取消正在进行的轮询,所以按下发射不必排在一次轮询往返后面。

频谱输出要在 SPI 总线上显式打开,办法是连接之后立刻写扩展 CAT 寄存器:

EX040101   # 在 FT4222 SPI 上打开频谱数据输出
EX040200   # 把频谱设成 CENTER 模式(不是 FIX 模式)

没有这两条指令,FT4222 一声不响,你怎么读都读不出来。这是从零开始的人最容易踩的一个坑。

从 SPI 到浏览器

一个独立进程读,服务器广播,浏览器画。

读 SPI 总线是阻塞的,而且 FTDI D2XX 的 ctypes 调用会不可预测地卡住。所以频谱读取放在一个独立的操作系统子进程里(scope_pipe.py),跟服务器隔开。它崩了,服务器发现管道死了就重启它,网页客户端对此毫无感觉。

这条流水线有三段清晰的职责:

  1. 硬件读取:子进程在紧循环里从 FT4222 读 4096 字节帧,校验同步尾,解析元数据,把带长度前缀的帧写到标准输出。
  2. 服务器广播:FastAPI 服务器解出每一帧,把一条紧凑的二进制消息推给所有 /WSspectrum WebSocket 客户端。
  3. 浏览器渲染:客户端画一条 FFT 折线,再画一张带 120 行历史、六种可选配色的瀑布图。

WebSocket 帧格式刻意做得极小,一共 1701 字节:1 字节版本号,850 字节 WF1,850 字节 WF2。广播循环跑 5 fps(200 毫秒一次),对远程瀑布图来说够顺,也不烧带宽。

发射时发生什么

电台会把自己的频谱流搅乱,于是管道先关后开。

FT-710 在发射时会把频谱流搅乱,按下电键那一刻频谱数据就变成噪声。服务器不去跟电台较劲,而是在发射期间暂停 SPI 读取循环:往子进程的标准输入写一条 TX:1。松开 PTT 时,管道做一次完整的关设备、等待、重开,把数据流重新同步干净。

这个关开动作是有来历的。早先的版本只是试着恢复读取,结果在反复发射之后掉进 fatal: too_many_reinits 的崩溃循环。每发射一次就重开一次 FT4222 设备,最后被证明是可靠的做法。

优雅降级:退回 S 表

SPI 桥不在的时候,界面照样能用。

不是每台主机都装了 FT4222 的 D2XX 驱动,也不是每根线、每个系统都配合。SPI 桥不可用的时候,服务器会用 CAT 的 S 表读数合成一张看起来合理的频谱:在当前 span 中央放一个高斯峰,按 S 表值缩放,再补几个次峰和噪声点。

它不是真实射频数据,但整个界面都能继续用:调谐、改模式、换波段。远程体验是优雅降级,不是直接死掉。这条降级通路同样跑 5 fps,从协议这一侧看,客户端分辨不出区别。

与本家 dongle 的对照

那只盒子给了你什么,这条路没有给什么。

SCU-LAN10MRRC FT-710(USB)
硬件单独一只网络盒子无:你已经有的那根 USB 线
频谱通路以太网上的私有 UDP原始 4096 字节 SPI 帧,开源解码
客户端雅马哈软件任何现代浏览器(WebSocket)
频谱降级FT4222 缺席时用 S 表合成
可审查性关着的黑箱帧格式与 CAT 实现全部有文档

取舍是诚实的。SCU-LAN10 把电台放上局域网,于是网上任何一台机器都能连它。USB 这条路把电台绑在一台主机上,再由这台主机去共享。如果你本来就有一台常年开机的控台电脑,那这根本不是限制,反而更简单。

完整架构(组件清单、WebSocket 消息规格、七层 PTT 安全模型)写在 软件设计文档里。代码在 GitHub 上开源。

这条线的去向

已归档 2026-09-12;这条路活在 MRRC Modern 里。

2026-09-12 归档。原来那台单机型仓库(cheenle/mrrc_ft710)已设为只读,站点 301 跳转到 MRRC Modern。后者通过可插拔后端同时驱动 FT-710 与 IC-7300、IC-7300MK2。这篇留作技术记录:那条 USB 通路当初是怎么被发现的。