# 歌曲封面显示器上位机 **Repository Path**: duyi324/song_cover_display_upper ## Basic Information - **Project Name**: 歌曲封面显示器上位机 - **Description**: TiX歌曲封面显示器上位机,需要win10/win11 64位操作系统 - **Primary Language**: Unknown - **License**: CERN-OHL-S-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 2 - **Created**: 2026-03-30 - **Last Updated**: 2026-03-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 歌曲封面显示唱片机_上位机 ![upper](./Pic/Snipaste_2025-12-22_19-13-32.png) 目录: - [歌曲封面显示唱片机\_上位机](#歌曲封面显示唱片机_上位机) - [一、项目说明](#一项目说明) - [二、开源方式及项目管理](#二开源方式及项目管理) - [三、项目简介](#三项目简介) - [四、项目原理](#四项目原理) - [五、上下位通信格式](#五上下位通信格式) - [1、上位机](#1上位机) - [2、下位机](#2下位机) - [六、可能存在的问题](#六可能存在的问题) - [七、其他](#七其他) ## 一、项目说明 本项目对于个人学习用途者免费开放,请您遵守开源协议; 对于商用行为,请联系作者获取授权,否则视作侵权,您可通过下方电子邮件地址联系作者: [realticks@qq.com](mailto:realticks@qq.com) ## 二、开源方式及项目管理 本仓库负责管理本项目的上位机代码部分,所有部分开源链接如下: * 单片机代码: * Github:[TiX233/song_cover_display](https://github.com/TiX233/song_cover_display) * Gitee:[TiX233/song_cover_display](https://gitee.com/TiX233/song_cover_display) * 上位机: * Github:[TiX233/song_cover_display_upper](https://github.com/TiX233/song_cover_display_upper) * Gitee:[TiX233/song_cover_display_upper](https://gitee.com/TiX233/song_cover_display_upper) * 原理图/PCB: * 立创开源平台:[歌曲封面显示唱片机](https://oshwhub.com/realtix/cover_display) * 外壳: * MakerWorld:[@realTiX - 电脑歌曲封面显示器唱片机](https://makerworld.com.cn/zh/models/1979900-dian-nao-ge-qu-feng-mian-xian-shi-chang-pian-ji) ## 三、项目简介 这是一个用于显示电脑当前正在播放音频的封面的唱片机风格桌面摆件。 播放状态下,唱臂会靠近唱片,且显示屏中的封面会旋转; 暂停状态下,唱臂会离开唱片,显示屏中的画面会暂停旋转。 通过手动拨动唱臂,可以控制电脑音频的播放与暂停。 ## 四、项目原理 **全局原理:** 上位机通过 windows [smtc](https://learn.microsoft.com/zh-cn/windows/uwp/audio-video-camera/integrate-with-systemmediatransportcontrols) 服务(win10 及以上)获取系统当前正在播放的音频的各种信息,通过 usb 向单片机发送封面和暂停/播放等信息来控制唱片机的状态;当手动拨动唱臂时,单片机会向上位机发送请求,上位机收到请求后会通过 smtc 来控制系统音频的播放或暂停状态,然后回传状态给单片机。上位机会每秒发送一次系统音频的播放状态给唱片机,在上位机超过一分钟没有发过来命令后,唱片机会进入休眠。 **上位机部分:** > 本上位机大部分组件由 ai 编写,稳定性不保证。使用 Visual Studio2026,WPF,.NET 8.0 开发。 本人仅擅长 c 语言开发,对于 c# 并没有经验,所以部分编码可能并不规范,请见谅。 通过获取 usb 虚拟串口的 `vid/pid` 来区分是否为目标设备,是则直接连接,唱片机会对丢包数据申请重传,但是上位机这部分还没写,因为目前还没遇到丢包情况,可能是因为上位机的发包逻辑是填一个包发一个包而不是全填好一起发送,所以留给唱片机处理的时间较为充裕。 开机自启动部分原理为创建一个快捷方式在 windows 启动文件夹,所以上位机并不会在开机后第一时间启动,可能会在进入桌面十几秒后被系统启动。 ## 五、上下位通信格式 ### 1、上位机 上位机命令以 `/` 开头,可接回车为结尾或者不接,以下为可发送的命令列表: | 命令 | 功能 | 效果 | | - | - | - | | `/1` | 要求下位机播放 | 下位机图像开始旋转,唱臂靠近胶片 | | `/0` | 要求下位机暂停 | 下位机图像暂停旋转,唱臂离开胶片 | | `/t` | 上位机将要传送图片 | 下位机做接收图像准备:图像暂停旋转,清零丢包计数,发送准备完成命令给上位机 | | `/o` | 上位机已经发送完图片的所有包 | 下位机此时开始进行丢包统计,若无丢包,则播放图像下落动画 | 上位机发送的单个图片数据包长度为 64 字节,以 `#` 开头,而后接的两个字节拼为一个 uint16 的正整数(大端)表示该包的序号,剩下 61 个字节则为图像数据 上位机需要定期发送 `/1` 或 `/0` 来避免下位机进入休眠,下位机会在 60 秒未接收到控制命令后关闭屏幕进入休眠 ### 2、下位机 下位机命令以 `/` 开头,以下为会发送给上位机的命令列表: | 命令 | 功能 | 效果 | | - | - | - | | `/q1\n` | 请求上位机播放 | 暂停时手拨唱臂靠近胶片,会每 123 ms 发送一次给上位机直到其返回 `/1` | | `/q0\n` | 请求上位机暂停 | 播放时手拨唱臂离开胶片,会每 123 ms 发送一次给上位机直到其返回 `/0` | | `/ec\n` | 报告无法驱动唱臂靠近胶片 | 上位机发送播放命令时,如果唱臂无法被驱动靠近胶片,则会每 5s 重新尝试一次,并报告,直到驱动成功或上位机发送暂停命令 | | `/el\n` | 报告无法驱动唱臂离开胶片 | 上位机发送暂停命令时,如果唱臂无法被驱动离开胶片,则会每 5s 重新尝试一次,并报告,直到驱动成功或上位机发送播放命令 | | `/k\n` | 下位机已做好接收图片准备 | 在此之后,上位机可以开始传输图片,并在发送完后发送一次 `/o` | | `/a\n` | 下位机已接收完所有包未丢失 | 在此之后,上位机可认为图片完整传递成功,但是不应立即发送 `/1` 要求其播放,因为此时唱片机正在播放图片下落动画约 100 ms,否则可能打断下落动画 | | `/r[byte2][byte3]\n` | 下位机要求重传某个包 | 在此之后,上位机需要重新发送该包序号的包并发送 `/o` | | `/x[byte2][byte3]\n` | 下位机要求重传某个包起后续所有所有包 | 在此之后,上位机需要重新发送该包序号开始的所有包并最后发送一次 `/o` | 本上位机暂时还没写重传功能和下位机接收完成检查,所以无法响应下位机的重传命令,会强制要求其使用该图片,不过目前没出现图片丢包的情况,可能是因为当前的发包逻辑为算一个包发一个包而非全算好一起发,所以下位机有足够时间处理包避免覆盖/丢包。 但是因为未对下位机接收完成进行检查,所以可能导致打断图片下落动画,另外显示屏掉初始化的原因可能来自于此,暂未深究 ## 六、可能存在的问题 * 网页 b 站切换视频时可能会下落图片两次或者新旧封面闪烁 * 特别特别快速切换封面时可能导致唱片机的显示屏掉初始化,需要重新插拔唱片机使其重新初始化 * 上位机挂后台太久时可能不会响应下位机的手动拨动唱臂的播放/暂停命令,需要点开界面"激活"一下 * 非手动点击断开连接的设备拔出断连后不会在插入后自动连接 ## 七、其他 因为使用的是 wpf 框架以及 windows smtc 服务,所以只能在 win10/win11 设备上使用,且上位机无法直接移植到 mac 电脑或其他系统上使用。如果您需要设计一个 macOS 或其他系统版本的上位机,以下是一些帮助信息: * 您需要通过其他方式获取系统音频封面 * 唱片机不需要适配 mac,您不需要修改唱片机的单片机代码,只要您的 mac 电脑有 usb cdc 虚拟串口驱动 * 可以使用一些 mac 版本的串口助手尝试连接唱片机并发送指令(如 `/0`/`/1`,代表暂停/播放)来进行通信测试 * 唱片机的 `vid/pid` 为 `2E3C/2568`,可以通过这个来实现上位机自动识别唱片机并链接 * 上下位的通信可以参考一些串口助手,因为是 usb 虚拟串口,并不需要真正的转为串口,所以配置串口通信速率并没有意义,可以不管,真实通信速度为全速 usb 的 12Mpbs * 上下位通信命令和格式可以参考 win 版本上位机的代码 * 命令以 `/` 开头;图片数据以 `#` 开头,`#` 后接的两个字节为一个 uint16 的包序号,而后为图片数据 * 受全速 usb 限制,单个数据包只有 64 字节,所以一个图片数据包除去包头以及两个字节的包序号,有用的数据只有 61 个字节。对于一张 240\*240\*2 字节的图片(rgb565),最少需要传输 1888 次