上位机和读取示例
本页对应仓库内 2026-10-27 的上位机及固件快照。原工程后来已有修改,实物操作与录屏请使用互相匹配的固件和上位机。
我们先看一下怎么把数据读到电脑上。观察波形、操作校准,可以用原图形上位机;想先看数据格式和单位,可以用独立命令行示例。这里先读直线位置,然后再换成角度数据。
不接硬件先运行
从仓库根目录执行,建议 Python 3.10 或更新版本:
python software/examples/read_sensor.py --demo --profile line --count 5
python software/examples/read_sensor.py --demo --profile encoder --count 5
直接执行 python software/examples/read_sensor.py 也会运行直线演示,不连接硬件,不需要第三方包。示例输出每行一个 JSON,含:
profile:line 或 encoder。raw_value/raw_unit:协议整数和0.01_mm或0.01_deg。display_value/display_unit:便于人看的 mm 或 deg。si_value/si_unit:便于机器人计算的 m 或 rad。adc_u1_u2_u4、amplitude_adc_counts、flags/flag_names:原码、幅度与状态。calibration_valid_flag、measurement_warnings:校准位,以及弱磁、未校准、校准中和越界提示。异常样本保留供分析,接控制器前需筛选。host_rx_unix_s、host_rx_monotonic_s:主机接收解码时间及本机单调时间。source=simulated_not_hardware:模拟数据标识。
时间字段是主机解码时刻。角度演示使用三相余弦,直线演示使用简化高斯曲线;实际信号还受磁铁、安装、噪声和温度影响,详见测量说明。
用串口读取
准备接实物时,先确认一块板的供电、RS485 接线、USB-RS485 适配器和设备配置,然后执行:
python -m pip install pyserial
python software/examples/read_sensor.py --port COM7 --id 1 --baud 115200 --count 20
将 COM7 换成实际串口。Linux 可替换为 /dev/ttyUSB0。示例先 GET_INFO,再按实际返回的测量类型轮询 GET_DATA;--profile line 只控制演示,不会给真实设备切换模式。固件出厂默认角度,使用直线 PCB 时先按实验步骤切换并校准。
示例默认 20 帧后结束,--count 0 为持续读取;Ctrl+C 停止。--interval-ms 100 表示每次成功读取后等待 100 ms,实际周期还包括请求、应答和调度延迟;所以实际采集率会低于 10 Hz。串口超时、错误应答或拔出导致的异常会结束程序并返回 2,不继续重复最后一个位置。
返回模式、周期、波特率与类型需符合当前协议,信息中的校准有效字节也需与标志一致;12 位 ADC、单圈角度和未知状态位会检查。直线值保留机械零点偏移后的有符号结果,不在主机再次限幅。解析器支持 CRC 错误和截断帧后的恢复,但持续丢包仍会触发事务超时并停止。
示例只发读取命令,不改配置,独立于原 GUI,也不需要 Qt。机器人接口扩展见机器人接入。
启动图形上位机
再看一下图形上位机。保留的原上位机位于 software/host/,依赖文件列出 pyserial、PySide6、pyqtgraph、NumPy,入口为 host/__main__.py。从仓库根目录可按以下方式建立独立环境:
python -m venv .venv
.\.venv\Scripts\python.exe -m pip install -r software/host/requirements.txt
Set-Location software
..\.venv\Scripts\python.exe -m host
若已在 software 目录且当前环境装好依赖,可直接运行 python -m host。这里提供源码启动方式,尚未连接板卡测试 GUI。
依据:依赖文件,模块入口,GUI 入口,第 931 行。
GUI 演示
- 勾选“无设备演示”,设置演示 RPM。
- 点击“开始采集”。看三路原码的相位关系,以及角度按 0–360°和连续展开的区别。
- 用“开始录制”导出 CSV,再停止录制。
GUI 的无设备演示固定为角度,与之前选的类型无关。直线演示请用前面的命令行示例。
依据:演示模式入口,第 573 行,模拟生成,第 803 行。
接板卡采集
直线板
- 刷新串口;初次单板连接通常选 ID 1、115200、类型“不限”,再点连接。
- 连接动作会读设备信息;看到“角度编码器”并不代表 PCB 已自动识别。固件默认类型是角度;点击“切换为直线位置”会写入类型并清除原零点和校准。
- 先拿开磁铁,点开始校准,保持采集一段时间后点结束校准。这里采的是零磁场基线,不是移动全行程拟合。
- 放回磁铁,保持高度与姿态,观察 U1/U2/U4 和位置。敏感宽度默认 8 mm,是模型参数;需要用已知机械位置检查误差并调整。
- 把滑台移到选定的机械参考位置,再点“当前位置设为 0 mm”。基线、宽度和机械零点是不同概念。
- 先选“主从查询”、间隔 20 ms,开始采集;核对移动方向、弱磁和超出阵列状态。
换成角度板
- 换好磁铁与角度 PCB,确认机械结构,再切换为角度编码器。切换会清除两种模式校准和零点。
- 保持磁铁安装关系,开始校准并转满至少一圈,再结束校准。
- 在明确的机械参考位置设零;观察转动方向和 359°→0°回卷。
- 按实际类型改用 deg/rad;同一
angle_cdeg字段从直线的 0.01 mm 回到角度的 0.01°。
依据:GUI 校准与切换动作,第 601 行,宽度控件,第 437 行,固件切换逻辑,第 902 行。
显示和 CSV
GUI 显示三路 ADC 原码、幅度、位置/角度和差分估算速度;角度速度为 RPM,直线速度为 mm/s。速度由主机收到的相邻位置和时间差估算,并做平滑,不是传感器直接返回的速度。连续角度展开也由主机完成,不能当成掉电保存的多圈编码器。
角度 CSV 表头为 t_s, angle_deg, amplitude, u1, u2, u4, flags, rpm;直线为 t_s, position_mm, amplitude, u1, u2, u4, flags, mm_s。CSV 的 t_s 来源是 Python time.perf_counter(),不是 Unix 时间,也不是从零开始的实验时间;分析时可减第一帧时间求相对秒数。导出的角度保持 0–360°,即使图上显示连续展开角度也一样。
依据:时间与采样解析,第 159 行,速度与展开,第 193 行,CSV 表头,第 627 行,CSV 行,第 785 行。
原 GUI 的几个问题
对照原 GUI 源码,可以看到下面几个问题,接实物时需要留意:
- 改 ID 后可能报超时,但设备其实已经改成功。 固件应答 SRC 已是新 ID,GUI 事务匹配仍要求旧 ID。只接一台板操作,超时后断开,使用新 ID 重新连接并读信息;若未连上,再检查旧 ID。由非 1 号恢复出厂也会触发同类问题,此时先检查 ID 1/115200。依据:固件设置 ID,第 650 行,GUI 事务匹配,第 372 行。
- 读取校准时,部分基线/宽度显示会错位。
GET_CAL布局含 flags,CAL_END布局不含 flags;GUI_after_cal()用同一偏移处理两者。不要把错位显示当作硬件基线异常,也不要据此回写宽度。依据:读取校准调用,第 454 行,校准解析,第 526 行,实际协议布局,第 883 行。 - 主动上报时点“停止采集”不等于让设备停止发送。
stream off只更改本机状态;后台仍收包,设备的上报模式也会保存在 Flash。需要恢复总线轮询时,选择“主从查询”并开始一次采集,让主机发SET_MODE=0,再停止。多设备接入前必须检查该配置。依据:采集模式,第 459 行,收包分发,第 410 行。 - “已连接”首先表示串口已打开。 打开后读信息失败只记录日志,并不自动证明选对了设备。轮询超时也只限频记日志;显示可能保留旧值。机器人必须另外实现超时与新鲜度判断。依据:串口连接,第 339 行,轮询与信息失败,第 421 行。
独立示例只读且遇错停止;校准操作仍需使用原工具或按协议发送命令。
继续阅读:协议字节参考 · 机器人接入和断链处理。
