TSMaster干扰仪上位机小程序开发

SKILL开发
开发 未标注权限 许可证不明确
安装这个技能

在 TSMaster 里开发干扰仪上位机小程序的专用技能。以同星 CAN/CAN FD 总线干扰仪(TH7011)为对象,覆盖 32 位 libTSDevBase.dll 动态加载与多路径查找、以太网与 USB 双接口自动回退、阻塞式采样点测量与 5ms 节拍状态机两种耗时模型、Bus-off 干扰编排、干扰位置与强度配置、错误码中文诊断、句柄泄漏与端口占用排查、clang 严格模式编译与报告回写。当用户要写干扰仪控制程序、做 Bus-off 或采样点或错误帧干扰用例、把干扰仪接进 TSMaster 小程序、排查设备连不上或返回 -18 被占用时使用。

一句话选型结论

按资料字段整理

TSMaster干扰仪上位机小程序开发是开发类的 Agent Skill,安装方式未标注,权限级别未标注,许可证不明确,有可直接复制的安装命令。技能本质是给模型读的说明书,效果取决于模型与客户端;装完先用一个小任务验证,再放进正式流程。

分类开发 安装方式未标注 权限级别未标注权限 许可证许可证不明确
累计安装 未标注 本周 未标注
GitHub 星标 未标注 仓库 未标注
下载量 未标注 技能市场下载数
权限级别 未标注权限 安装前请确认风险范围
许可证 许可证不明确 未说明

安装

未标注
在支持 Skills 的客户端里执行,装完问一句「你有哪些技能」验证
skillhub install user_af742286/tsmaster-disturber-minprogram-dev
  1. 1
    确认客户端支持

    确认你的客户端支持 Skills(Claude、Codex、Cursor 等),并升级到较新的版本。

  2. 2
    拿到技能文件

    执行上面的命令安装;也可以把仓库里的 SKILL.md 手动放进客户端的 skills 目录。

  3. 3
    刷新技能列表

    重新打开客户端,或刷新技能列表,让新放进来的技能被加载。

  4. 4
    验证是否生效

    问一句「你有哪些技能」,确认列表里出现它,再拿一个小任务试跑。

技能档案

开发
字段来自技能仓库与公开索引,中文说明由本站标注
作者 / 维护方user_af742286仓库 未标注 · 版本 未标注
宿主客户端未标注技能可被这些客户端加载
安装方式未标注安装包 community
权限级别未标注权限安装前请确认风险范围
许可证未说明许可证不明确,商用前请自行确认条款
仓库可用性available技能仓库当前是否可访问
最近核验2026-11-06上游最后核验时间 · 数据更新 2026-11-06
正文体量11.1 KBSKILL.md 原文大小,越大说明说明书写得越细

典型使用场景

3 类
按分类整理的常见用法,具体以 SKILL.md 为准
写代码与改 bug

按需求补代码、定位并修掉报错。

读仓库与生成改动

让模型读懂项目结构,再给出可落地的改动。

跑测试与排查故障

按现象排查问题,补测试用例并复跑。

选择建议

装之前先看这几条
按条目字段给出的判断,不替你决定用不用

值得选的地方

  • 有可直接复制的安装命令,不用自己翻文档找入口。

先想清楚的地方

  • 没有标注权限级别,实际能做什么要装好后确认。
  • 许可证不明确,商用或二次分发前先到仓库确认条款。
  • 没有做站内核验,内容以作者仓库为准。
  • 技能只是说明书,实际效果取决于模型与客户端,装完先用小任务试一遍。

更适合

  • 需要在开发场景里给模型补一套做法的人。
  • 愿意先读一遍 SKILL.md、确认它会让模型做什么的人。

不太适合

  • 对许可证要求很严、必须明确可商用的人。
  • 只想装完就自动变强、不打算看说明书的人。

同类对比

6 个同类
同分类里挑最接近的几条,字段以各自详情页为准
技能权限级别安装方式累计安装宿主客户端安装命令
TSMaster干扰仪上位机小程序开发当前 未标注权限 未标注 未标注 未标注 有
技能审查员 浏览器控制 ClawHub 市场 877.9 万 OpenClaw 有
Vercel React 最佳实践 浏览器控制 GitHub 仓库 849.1 万 Codex、Claude、Cursor 有
GitHub 代码协作 联网访问 ClawHub 市场 763.3 万 OpenClaw 有
网页设计指南 联网访问 GitHub 仓库 668.6 万 Codex、Claude、Cursor 有
本体论 只读 ClawHub 市场 663.7 万 OpenClaw 有

SKILL.md 全文

11.1 KB
模型实际读到的说明书原文,来自技能仓库

Skill:TSMaster 干扰仪上位机小程序开发

> 目标:在一个 TSMaster MiniProgram 里,把总线干扰仪做成「能连、能配、能干扰、能判定、能收尾」的上位机。
> 所有参数都是真机跑出来的值,不是照抄 demo;demo 与我们环境的差异见 VALIDATION.md。

0. 何时用

用户怎么说 去向
「写个干扰仪控制程序」「让小程序控制干扰仪发干扰」 §2 架构 + TEMPLATES.md §2~§4
「做个 Bus-off 用例」「干扰 ACK / EOF 字段验证恢复」 TEMPLATES.md §7、REFERENCE.md §8
「测采样点」「采样点测不出来 / 波动大 / 返回 -2」 TEMPLATES.md §5、TROUBLESHOOTING.md §3
「设备连不上」「报 -18 / -7 / -12」 TROUBLESHOOTING.md §2
「前几条用例过了,后面全 -18」 TROUBLESHOOTING.md §5(句柄泄漏)
「干扰计数一直是 0」「配了没效果」 TROUBLESHOOTING.md §4
「dll 加载失败 / 报 126 / 报 193」 TROUBLESHOOTING.md §1

1. 铁律速查表

# 铁律 违反后果
1 libTSDevBase.dll 必须 32 位,且与 TSMaster.exe 同目录 报 193(ERROR_BAD_EXE_FORMAT)加载失败
2 加载前先 SetDllDirectoryA(dll 目录),用 LoadLibraryExA(..., LOAD_WITH_ALTERED_SEARCH_PATH),用完还原 报 126,依赖 libusb-1.0_tosun.dll 找不到
3 不写死 dll 绝对路径,按 §TEMPLATES 3 的五级顺序查找,失败时打印全部尝试过的路径 换机器必崩,且现场无法排查
4 采样点测量(6~10 秒阻塞)绝不在 step 内同步调用,必须线程 + 5ms 轮询 卡住看门狗(3 秒),停止按钮失灵
5 长时程操作(干扰 10 秒、观测 60 秒)用 5ms tick 状态机推进一步,不开线程 开线程反而难中止、难观测中间状态
6 线程入口签名固定 DWORD WINAPI 名(LPVOID),必须留在全局定义区 放进自定义函数区 → 编译过但 UI 不显示 / 链接失败
7 跨线程共享只用 volatile LONG + Interlocked* 系列 结果读到半个结构体,偶发错判
8 先写结果结构体,最后才置 done = 1 主线程读到未写完的结果
9 连接成功后必须 g_th_handle = h;,否则 disconnect 空转 → 每次漏一条 TCP 控制端口耗尽,后续全部 -18
10 配置干扰前先用 times_query_t{clear_flag=1} 清计数 报告里的干扰次数带上一轮累计值
11 Frame_Field 只用 0~6,7(帧间间隔)与 8(错误字段)实测不生效 配了没反应,误判成硬件坏
12 guest_arbit_sample_pos 必须低于被测件采样点(如 78 vs 80) 填成相同的 80 会落在边界,测不出结果
13 开 MissBit_trigger 后位置超界会继续向后计数 CRC 第 17 bit 实际打到 ACK 界定符,判定全错
14 每个失败点都要记 错误码 + 阶段,worker 里不许硬写 -1 真实原因丢失,只剩「失败」两个字
15 每个函数 try { } catch (...) 兜底,catch 里记日志并 app.terminate_application() 未捕获异常直接崩宿主进程,无日志
16 空壳 / 未实现用例返回 TC_NA,绝不返回成功 报告出现「假绿」

2. 程序架构(四层 + 区块落位)

┌─ L4 编排层:自定义函数 + 用例 tc_*          ← 对 UI 暴露的入口
├─ L3 能力层:init / disturb_config / sp_test / stop / query
├─ L2 连接层:create → scan → get_info → open;ETH/USB 回退;句柄管理
└─ L1 加载层:dll 定位 + 函数指针表

区块落位(放错区块是最常见的「编译过了但 UI 里没有」):

内容 必须放在
类型定义、函数指针、全局状态、worker 线程函数 Global_Definitions
对 UI 暴露的能力函数(load / connect / sp_start / busoff_run / abort / err_text) Custom_Function,一区块一函数
用例 tc_* 用例区,登记进用例表才可勾选
跨区块调用 Global_Definitions 里加前置声明

自定义函数四条硬性要求(缺一条 UI 里就不显示):

// CODE BLOCK BEGIN Custom_Function <函数名> <base64标识>
// 自定义函数 "<函数名>"
s32 <函数名>(void) { try { // 自定义函数:
    return 0;
} catch (...) { log_nok("CRASH detected"); app.terminate_application(); return(IDX_ERR_MP_CODE_CRASH); }}
// CODE BLOCK END Custom_Function <函数名>

一个区块只能一个函数;签名必须 s32 名(void);首行标记 // 自定义函数: 要在 { try { 同一行;catch 必须返回 IDX_ERR_MP_CODE_CRASH。

参数怎么传(自定义函数不支持参数):少量标量走全局变量;指针/句柄用 s32 承载(32 位同宽,安全);字符串返回静态常量地址;线程入口不能迁。

3. 两种耗时模型(选型先看这张表)

场景 单次耗时 用哪个模型 原因
采样点测量 6~10 秒,一次调用内跑完 独立线程 + 5ms 轮询 SDK 内部循环,没有中间状态可观测
Bus-off 干扰 10 秒干扰 + 60 秒观测 5ms tick 状态机 有中间状态(干扰中/观测中)、要能中止、要能每秒打日志
单次干扰脉冲 < 1 秒 直接调用 远低于看门狗阈值,没必要异步
扫描设备 / 打开设备 1~5 秒 线程或放在连接阶段一次性做 同采样点,属于阻塞调用

模型 A:线程 + 轮询(起始 → 轮询 → 工作线程三段式)

s32 th_sp_start(void) { try {            // ① 启动后立即返回
    if (InterlockedCompareExchange(&amp;g_th_busy, 1, 0) != 0) return 0;
    InterlockedExchange(&amp;g_th_job_done, 0);
    HANDLE th = CreateThread(NULL, 0, th_sp_worker, NULL, 0, NULL);
    if (!th) { InterlockedExchange(&amp;g_th_busy, 0); return -1; }
    CloseHandle(th);
    return 1;
} catch (...) { ... } }

s32 th_sp_poll(void) { try {             // ② 主线程每 5ms 查一次
    return (s32)InterlockedCompareExchange(&amp;g_th_job_done, 1, 1);
} catch (...) { ... } }

模型 B:tick 状态机(步进式,每 tick 推进一步)

if (g_step == STEP_IDLE)    { ...初始化...; g_step = STEP_START;  return 0; }
if (g_step == STEP_START)   { ...连接+配干扰...; g_step = STEP_RUN; return 0; }
if (g_step == STEP_RUN)     { g_tick++; if (g_tick &gt;= 2000) { g_step = STEP_OBSERVE; } return 0; }  // 200 tick = 1 秒
if (g_step == STEP_OBSERVE) { ...判定...; g_step = STEP_DONE; return 1; }
return 1;   // DONE

> 5ms 一个 tick,200 tick = 1 秒。不要用 Sleep() 等,那会顶死调度器。

4. 标准流程(8 步)

1. 环境自检
   - dll 是 32 位?依赖 libusb-1.0_tosun.dll 在不在?
   - 控制端口 21840 有没有残留连接?(Get-NetTCPConnection -RemotePort 21840)
2. 加载 dll
   - 五级查找 → SetDllDirectory → LoadLibraryEx → GetProcAddress
   - 必查 4 个:create / scan / open / sp_test(缺一就报 -2 并打印缺失项)
3. 连接设备
   - create(dev_type=0, com=1 eth / 4 usb) → scan → get_info → open(uid)
   - 自动模式:ETH 失败回退 USB,保留首个错误码
4. 初始化 CAN 控制器
   - th_can_ctrl_t:仲裁/数据波特率 + 两个采样点(默认 500k/2M/80/80)
5. 选择测量方式
   - 采样点 → 线程模型;干扰 → 先清计数再配干扰
6. 编排与推进
   - 线程模型:用例里 tc_begin → start → 轮询 → 判定
   - tick 模型:用例每 step 调引擎一次,引擎自己推进内部相位
7. 判定与回写
   - 测量类:数值优先,错误码只进「诊断」栏
   - 干扰类:先查干扰次数 &gt; 0(否则总线无报文),再查通信是否恢复
8. 收尾(顺序不能错)
   - stop(停止干扰) → close → destory → 句柄置空 → 再查 21840 应为空

5. 验证清单(每次改完必跑)

[ ] 1. 编译:clang 直接编,exit 0,bin/&lt;程序名&gt;.mp 时间戳更新
[ ] 2. 定义唯一性:无重复 s32 xxx(void) { try 定义(混用脚本改与区块写的高发区)
[ ] 3. 括号平衡:{ 数量 == } 数量
[ ] 4. 跑前清场:21840 无 Established 连接
[ ] 5. 只读先验:先跑只读探针确认连接与 dll 版本,不做任何干扰
[ ] 6. 跑测试:干扰类会真的产生错误帧,确认目标是台架不是实车
[ ] 7. 看报告:PASS/FAIL/NA 计数符合预期,诊断栏有中文原因
[ ] 8. 跑后查泄漏:21840 仍应为空

第 4 步和第 8 步必须前后各查一次,才能证明「修好了」而不是「这次没报错」。

6. 排错速查

现象 最可能的原因
UI 里看不到自定义函数 区块不符合注册规范(§2 四条)
找不到标识符 跨区块调用没加前置声明
cannot jump from this goto clang 禁止 goto 跳过变量初始化
返回 -18 设备被其它程序占用(含 TSMaster 仪器设备管理器)
scan 扫到但 open 失败 同上,不是没接线
采样点全 0 且返回 0 总线无报文,或 guest_* 不低于被测件
干扰计数一直是 0 总线无报文(干扰次数依赖真实帧)
前几条过、后面全 -18 句柄没存全局,TCP 泄漏
0xC0000005 直接崩 手写结构体尺寸与 SDK 不符

详见 TROUBLESHOOTING.md。

7. 参考文件

文件 内容
REFERENCE.md 导出函数表、结构体尺寸、枚举、错误码、实测参数
TEMPLATES.md 可直接复制的 12 段骨架
TROUBLESHOOTING.md 六类现象 → 根因 → 处置 → 验证
VALIDATION.md 哪条实测、哪条继承、哪条没覆盖
ASSETS/check_env.ps1 设备环境自检:dll 位数、依赖、控制端口连接

常见问题

5 问
答案由本站依据条目字段整理
TSMaster干扰仪上位机小程序开发怎么安装?

在支持 Skills 的客户端里执行:skillhub install user_af742286/tsmaster-disturber-minprogram-dev。安装方式为未标注。装完刷新技能列表或重开客户端。

TSMaster干扰仪上位机小程序开发支持哪些客户端?

资料没有标注宿主客户端,但只要客户端支持 Skills(Claude、Codex、Cursor 等),一般都能加载。

TSMaster干扰仪上位机小程序开发权限高吗,安全吗?

权限级别为未标注权限。安装前先看它会读取或写入哪些内容。

TSMaster干扰仪上位机小程序开发收费吗?

本站不代收费用,也没有标注具体价格。是否收费取决于技能本身和所用的模型或客户端,正式使用前按作者说明确认。

TSMaster干扰仪上位机小程序开发用什么许可证?

许可证标注为 未说明(许可证不明确)。商用或二次分发前请到仓库确认条款原文。

热门专题

按场景挑技能
全部专题 →

技能内容以作者仓库为准;分类、权限级别与许可证状态的中文说明为中文整理,最近核验 2026-11-06。