VC 6.0与Turbo C双平台串口通信源码实战解析
简介这份资源是龚建伟、熊光明编著的《Visual C/Turbo C串口通信编程实践第2版》配套源代码面向具备一定C/C基础、希望掌握串口通信开发技术的工程师与高校学生。内容围绕VC 6.0与Turbo C环境下的串口编程展开可帮助读者理解串口初始化、数据收发、通信协议设计等核心环节并对照书中实例动手调试。压缩包共787个文件约16.57MB以h头文件与cpp源文件为主体辅以obj、exe、pdb等编译产物以及dsw、dsp、clw等工程文件另有ico、bmp等界面资源与txt说明文档覆盖多个独立示例工程。目前已有362人学习下载适合作为串口通信课程实验、毕业设计或工业控制项目的参考素材。读者可借助完整工程结构快速还原书中案例在VC 6.0中直接编译运行观察通信流程与调试细节从而积累串口程序设计与排错经验。1. 串口通信还能这么玩一份老派但管用的 VC 6.0 与 Turbo C 双平台源码前阵子帮一个做工业控制的朋友排查设备通信问题现场一台老工控机跑着 Windows XP上位机是 VC 6.0 编译的 MFC 程序下位机单片机端还留着 Turbo C 写的测试代码。他翻出一份《Visual C/Turbo C串口通信编程实践第2版》的配套源代码问我能不能照着改。我打开一看这套代码把 Win32 API 串口操作、MFC 控件封装、MSComm 控件用法、Turbo C 下的 BIOS 中断调用全串起来了从最底层的 DCB 结构体配置到上层界面收发链路完整。它适合两类人一是还在维护 VC 6.0 遗留工控项目的开发者二是想搞懂串口通信底层原理、不想只调库的学生和嵌入式新手。虽然现在都用 Qt 或 Python 的 pyserial 了但把这份源码跑一遍串口那点事基本就通透了。2. 项目结构拆解VC 6.0 工程与 Turbo C 源码怎么组织2.1 目录布局与工程文件说明这份源码包按平台分成两大块VC 6.0 部分以.dsw和.dsp工程文件为核心Turbo C 部分则是.c和.h的松散组合。我拿到手先扫了一遍目录典型结构如下SerialComm/ ├── VC6_Projects/ │ ├── MSCommDemo/ # 基于 MSComm 控件的对话框程序 │ │ ├── MSCommDemo.dsw │ │ ├── MSCommDemo.dsp │ │ ├── MSCommDemoDlg.cpp │ │ └── ... │ ├── Win32API_Serial/ # 纯 Win32 API 实现 │ │ ├── Win32API_Serial.dsp │ │ ├── SerialPort.cpp │ │ └── SerialPort.h │ └── MFC_FileDemo/ # 用 CFile 类操作串口 │ └── ... ├── TurboC_Src/ │ ├── SERIAL.C # 主程序轮询方式收发 │ ├── SERIAL.H # 端口地址与寄存器定义 │ └── BIOSINT.C # BIOS 中断调用示例 └── DOC/ └── 说明.txtVC 6.0 的.dsp文件里记录了源文件列表、编译选项和依赖库。打开工程时如果提示找不到mscomm32.ocx说明系统没注册这个控件后面避坑章节会讲怎么处理。Turbo C 那边没有工程概念直接在 IDE 里打开SERIAL.C编译成.exe就行但要注意编译模式选 Small 或 Tiny否则内存模型对不上。2.2 两套技术路线的定位差异VC 6.0 下的三个示例代表了三种不同层次的做法。MSComm 控件最省事拖个控件到对话框上设置CommPort、Settings、PortOpen就能收发适合快速出界面。Win32 API 方式最灵活直接调CreateFile打开COM1用SetCommState配波特率ReadFile/WriteFile读写能精确控制超时和缓冲区。MFC 的CFile类算是个偏门用法把串口当文件句柄操作代码简洁但异常处理弱。Turbo C 部分走的是 DOS 下的硬件直接编程路线。SERIAL.H里定义COM1基地址0x3F8然后通过inportb/outportb读写寄存器。这种写法在 Windows 上跑不了必须进纯 DOS 或 DOSBox。我一般建议先跑通 VC 6.0 的 MSComm 示例建立信心再啃 Win32 API 版本理解底层最后看 Turbo C 代码补全硬件层认知。2.3 关键头文件与依赖关系VC 6.0 工程依赖windows.h和mmsystem.hMSComm 示例还需要afxdisp.h。Win32 API 版本的SerialPort.h里封装了一个CSerialPort类核心成员包括HANDLE m_hComm、DCB m_dcb、COMMTIMEOUTS m_Timeouts。Turbo C 的SERIAL.H则简单粗暴/* SERIAL.H - Turbo C 串口寄存器定义 */ #define COM1_BASE 0x3F8 #define COM2_BASE 0x2F8 /* 寄存器偏移 */ #define RBR 0 /* 接收缓冲寄存器读 */ #define THR 0 /* 发送保持寄存器写 */ #define IER 1 /* 中断使能寄存器 */ #define IIR 2 /* 中断识别寄存器 */ #define LCR 3 /* 线路控制寄存器 */ #define MCR 4 /* 调制解调器控制寄存器 */ #define LSR 5 /* 线路状态寄存器 */ #define MSR 6 /* 调制解调器状态寄存器 */ #define DLL 0 /* 除数锁存低字节DLAB1 */ #define DLM 1 /* 除数锁存高字节DLAB1 */这段定义是后面所有硬件操作的基础。LSR的 bit 5 是发送保持寄存器空标志bit 0 是数据就绪标志轮询收发就靠读这两个位判断。LCR的 bit 7 是 DLAB置 1 后才能写除数锁存器设置波特率。这些寄存器含义在 VC 6.0 的 Win32 API 里被DCB结构体封装了但底层逻辑一模一样。3. 跑起来再说VC 6.0 与 Turbo C 环境搭建和编译步骤3.1 VC 6.0 工程打开与 MSComm 控件注册VC 6.0 在现代 Windows 上安装本身就有兼容性问题我一般用虚拟机跑 Windows XP 或 Windows 7 32 位。装好 VC 6.0 后双击MSCommDemo.dsw如果提示“无法打开文件 mscomm32.ocx”按下面步骤注册# 以管理员身份运行 cmd进入控件所在目录 regsvr32 mscomm32.ocx # 如果提示模块加载失败检查是否 32 位版本 # 64 位系统需放到 SysWOW64 目录下注册 copy mscomm32.ocx C:\Windows\SysWOW64\ regsvr32 C:\Windows\SysWOW64\mscomm32.ocx注册成功后在 VC 6.0 对话框编辑器里右键“插入 ActiveX 控件”应该能看到 Microsoft Communications Control。如果工程里已经拖好了控件但显示为空白框删掉重新拖一个然后右键“属性”确认CommPort设为 1 或 2Settings设为9600,n,8,1。编译前检查Project - Settings - Link里是否链接了comctl32.libMSComm 控件需要它。3.2 Win32 API 版本编译与串口参数配置Win32API_Serial工程不依赖 ActiveX编译更干净。打开.dsp后直接 Build如果报cannot open file winmm.lib在Project - Settings - Link - Object/library modules里加上winmm.lib。这个库用于timeSetEvent等多媒体定时器函数串口超时处理会用到。编译通过后运行程序会弹出配置对话框。核心参数在SerialPort.cpp的OpenPort函数里bool CSerialPort::OpenPort(int nPort, int nBaud) { CString sPort; sPort.Format(_T(COM%d), nPort); // 打开串口注意用 FILE_FLAG_OVERLAPPED 支持异步 m_hComm CreateFile(sPort, GENERIC_READ | GENERIC_WRITE, 0, // 串口必须独占 NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, // 异步模式 NULL); if (m_hComm INVALID_HANDLE_VALUE) { return false; } // 获取当前配置 DCB dcb; memset(dcb, 0, sizeof(dcb)); dcb.DCBlength sizeof(dcb); GetCommState(m_hComm, dcb); // 修改波特率、数据位、停止位、校验位 dcb.BaudRate nBaud; // 如 9600 dcb.ByteSize 8; // 数据位 8 dcb.Parity NOPARITY; // 无校验 dcb.StopBits ONESTOPBIT; // 1 位停止位 // 设置读写超时避免 ReadFile 永久阻塞 COMMTIMEOUTS timeouts; timeouts.ReadIntervalTimeout 50; timeouts.ReadTotalTimeoutMultiplier 10; timeouts.ReadTotalTimeoutConstant 100; timeouts.WriteTotalTimeoutMultiplier 10; timeouts.WriteTotalTimeoutConstant 100; SetCommTimeouts(m_hComm, timeouts); return SetCommState(m_hComm, dcb) ! 0; }CreateFile的第三个参数0表示独占访问两个程序不能同时开同一个串口。FILE_FLAG_OVERLAPPED开启异步后ReadFile会立即返回需要配合WaitForSingleObject或GetOverlappedResult等待完成。超时设置很关键ReadIntervalTimeout设为 50 毫秒表示两个字节间隔超过 50 毫秒就认为一帧结束这在处理不定长协议时特别有用。如果设成MAXDWORD且后两个参数为 0ReadFile会立即返回已读到的数据适合轮询。3.3 Turbo C 源码在 DOSBox 下的编译运行Turbo C 2.0 在 64 位 Windows 上跑不起来我用 DOSBox 模拟。挂载目录后进入 Turbo C 的BIN目录运行TC.EXE打开SERIAL.C按AltF9编译CtrlF9运行。编译前确认Options - Compiler - Model选的是 Small 或 TinyOptions - Directories里的 Include 和 Lib 路径指向 Turbo C 安装目录。SERIAL.C的主循环是轮询方式/* SERIAL.C - Turbo C 轮询收发示例 */ #include dos.h #include conio.h #include serial.h void InitSerial(unsigned int base, unsigned int baud_divisor) { outportb(base LCR, 0x80); /* DLAB1准备写除数 */ outportb(base DLL, baud_divisor 0xFF); outportb(base DLM, (baud_divisor 8) 0xFF); outportb(base LCR, 0x03); /* 8 位数据无校验1 停止位 */ outportb(base IER, 0x00); /* 关中断用轮询 */ outportb(base MCR, 0x03); /* DTR1, RTS1 */ } int main(void) { unsigned int base COM1_BASE; unsigned int divisor 12; /* 9600 波特率1.8432MHz/16/9600 */ InitSerial(base, divisor); cprintf(Serial port initialized. Press any key to send, ESC to quit.\r\n); while (1) { /* 检查是否有数据到达 */ if (inportb(base LSR) 0x01) { char ch inportb(base RBR); cprintf(Received: %c\r\n, ch); } /* 检查键盘输入并发送 */ if (kbhit()) { char ch getch(); if (ch 27) break; /* ESC 退出 */ while (!(inportb(base LSR) 0x20)); /* 等发送保持寄存器空 */ outportb(base THR, ch); } } return 0; }divisor的计算公式是1843200 / (16 * 波特率)9600 波特率对应 12。LSR的 bit 0 置位表示接收缓冲有数据bit 5 置位表示发送保持寄存器空。这种轮询方式会占满 CPU实际项目里一般用中断但作为教学示例足够清晰。在 DOSBox 里运行时需要配置dosbox.conf把serial1指向一个真实的 COM 口或命名管道否则收发数据出不去。4. 核心代码逐段拆解从 DCB 配置到中断处理4.1 Win32 API 串口初始化与 DCB 结构体详解VC 6.0 的 Win32 API 版本里DCB结构体是配置串口的黑匣子字段多但常用的就那几个。上面OpenPort函数已经展示了基本用法这里补充几个容易翻车的字段// 流控设置硬件流控用 RTS/CTS dcb.fRtsControl RTS_CONTROL_ENABLE; // 启用 RTS dcb.fOutxCtsFlow TRUE; // 等待 CTS 才能发送 // 如果设备不需要流控这两个都设 FALSE否则会卡死 // 二进制模式避免特殊字符被解释 dcb.fBinary TRUE; // Win32 下必须为 TRUE // 错误处理遇到错误继续操作 dcb.fAbortOnError FALSE;fRtsControl和fOutxCtsFlow是血泪坑。很多 USB 转串口线默认不支持硬件流控如果代码里开了fOutxCtsFlow但对方不拉低 CTSWriteFile会一直阻塞。我一般先全关流控确认能通再按需开。fBinary在 Win32 下必须为 TRUE设 FALSE 会导致ReadFile行为异常。4.2 异步读写与 OVERLAPPED 结构体配合异步模式下ReadFile和WriteFile的最后一个参数是OVERLAPPED结构体指针。下面是一个带超时等待的读操作封装int CSerialPort::ReadData(char* pBuffer, int nLength, DWORD dwTimeout) { OVERLAPPED ov; memset(ov, 0, sizeof(ov)); ov.hEvent CreateEvent(NULL, TRUE, FALSE, NULL); DWORD dwRead 0; BOOL bResult ReadFile(m_hComm, pBuffer, nLength, dwRead, ov); if (!bResult) { DWORD dwError GetLastError(); if (dwError ERROR_IO_PENDING) { // 异步操作未完成等待事件 DWORD dwWait WaitForSingleObject(ov.hEvent, dwTimeout); if (dwWait WAIT_OBJECT_0) { GetOverlappedResult(m_hComm, ov, dwRead, FALSE); } else { // 超时取消操作 CancelIo(m_hComm); dwRead 0; } } } CloseHandle(ov.hEvent); return dwRead; }CreateEvent创建的事件对象必须手动关闭否则每次读都泄漏一个内核对象。WaitForSingleObject的超时时间根据协议定Modbus RTU 一般 100 到 500 毫秒。超时后调CancelIo取消未完成的 I/O不然下次读会拿到脏数据。GetOverlappedResult的最后一个参数FALSE表示不等待因为前面已经等过了。4.3 Turbo C 下的中断方式收发与 ISR 编写轮询太耗 CPU实际项目里 Turbo C 代码常用中断方式。SERIAL.H里定义了中断号COM1 对应 IRQ4中断向量是0x0C。下面是一个简化的接收中断服务程序/* 中断方式接收 - Turbo C */ #include dos.h #include serial.h #define COM1_IRQ 4 #define COM1_INT_VEC 0x0C void interrupt far SerialISR(void) { unsigned int base COM1_BASE; unsigned char iir inportb(base IIR); /* 判断中断来源bit 0 为 0 表示有中断待处理 */ while (!(iir 0x01)) { if (iir 0x04) { /* 接收数据就绪 */ char ch inportb(base RBR); /* 存入环形缓冲区主循环读取 */ PutToRingBuffer(ch); } else if (iir 0x02) { /* 发送保持寄存器空可以发下一个字节 */ if (HasMoreData()) { outportb(base THR, GetNextByte()); } } /* 读 IIR 清除中断标志 */ iir inportb(base IIR); } /* 发送 EOI 给 8259 中断控制器 */ outportb(0x20, 0x20); } void InstallISR(void) { /* 保存旧向量并安装新 ISR */ old_vector _dos_getvect(COM1_INT_VEC); _dos_setvect(COM1_INT_VEC, SerialISR); /* 打开接收中断 */ outportb(COM1_BASE IER, 0x01); /* 解除 8259 对应 IRQ 的屏蔽 */ unsigned char mask inportb(0x21); outportb(0x21, mask ~(1 COM1_IRQ)); }IIR寄存器的 bit 0 为 0 表示有未处理中断bit 1 和 bit 2 组合判断中断类型。0x04是接收数据就绪0x02是发送保持寄存器空。处理完必须发 EOI 命令outportb(0x20, 0x20)否则 8259 中断控制器不会再响应同级中断。_dos_getvect和_dos_setvect是 Turbo C 特有的中断向量操作函数换成其他编译器要改。环形缓冲区的大小建议 256 或 512 字节太小会丢数据太大浪费内存。5. 避坑与排查串口调试中最容易翻车的几个点5.1 串口被占用或无法打开现象CreateFile返回INVALID_HANDLE_VALUEGetLastError返回 5 或 32。原因是另一个程序已经打开了同一个串口或者驱动没装好。解决先用串口调试助手确认端口能打开关掉所有可能占用串口的程序。如果是 USB 转串口去设备管理器看有没有黄色感叹号换个 USB 口试试。VC 6.0 程序里可以在CreateFile前加Sleep(100)重试三次很多虚拟串口驱动需要延迟。5.2 收发数据乱码或丢包现象收到的数据和发送的不一致或者偶尔丢几个字节。原因通常是波特率不匹配、数据位/停止位/校验位设置不一致或者超时设得太短。解决两端确认9600,n,8,1完全一致。用示波器看波形最直接没有示波器就换根短一点的串口线。超时参数里ReadIntervalTimeout设 50 毫秒如果对方发送间隔大于这个值一帧会被拆成多次读需要在应用层拼包。5.3 MSComm 控件注册失败现象VC 6.0 打开工程时提示mscomm32.ocx未注册或者对话框上控件显示为空白。原因是系统没有这个控件或者注册的位数不对。解决找一份mscomm32.ocx文件32 位系统放System3264 位系统放SysWOW64用管理员权限运行regsvr32。如果还不行检查 VC 6.0 的Tools - Options - Controls里有没有把mscomm32.ocx加进去。实在搞不定就改用 Win32 API 版本不依赖 ActiveX。5.4 Turbo C 编译报内存模型错误现象编译SERIAL.C时报Segment overflow或Code segment too large。原因是编译模式选成了 Large 或 Huge但代码里用了far指针混用。解决在Options - Compiler - Model里选 Small所有指针默认 near。如果代码确实需要超过 64KB把数据放到far段但串口寄存器操作不需要。另外确认SERIAL.H里的inportb/outportb声明和 Turbo C 的dos.h兼容有些版本需要加#include conio.h。5.5 中断方式下程序死机现象Turbo C 程序运行后一收到数据就死机或重启。原因是 ISR 里做了耗时操作或者没有正确发 EOI。解决ISR 里只做最少的寄存器读写和缓冲区存取不要调printf。确认outportb(0x20, 0x20)在 ISR 末尾执行。如果用了_dos_setvect退出程序前必须用_dos_setvect恢复旧向量否则下次运行会跳到已释放的内存。DOSBox 下中断方式支持不完整建议先用轮询验证逻辑。6. 二次开发改造从示例代码到可用工具的几个实用技巧拿到这份源码后直接用于生产环境还需要几处改造。我一般按下面的顺序动手每改一步验证一步避免一次性改太多导致问题定位困难。第一处是协议解析层。示例代码只做了字节收发实际项目里需要按帧解析。我习惯在CSerialPort类外面再包一层CProtocolParser用状态机处理帧头、长度、数据和校验。比如 Modbus RTU 的帧头是地址码功能码决定后续长度CRC 校验放最后。状态机用enum定义WAIT_HEADER、WAIT_LENGTH、WAIT_DATA、WAIT_CRC四个状态每收到一个字节推进一次。这样即使一帧被拆成多次ReadFile也能正确拼起来。第二处是线程模型。VC 6.0 的 MFC 程序里串口读操作放在主线程会卡界面。我一般开一个工作线程专门读串口用PostMessage把数据发回主线程更新 UI。线程函数里循环调ReadData超时设 100 毫秒读到数据就PostMessage(WM_SERIAL_DATA, ...)。注意PostMessage传指针时要new一块内存主线程处理完delete否则跨线程访问栈变量会翻车。第三处是配置持久化。示例代码里波特率、端口号都是硬编码的实际工具需要保存到注册表或 ini 文件。VC 6.0 下用WritePrivateProfileString写 ini 最省事Turbo C 下直接fwrite一个结构体到文件。我一般把DCB里那几个关键字段抽出来存加载时先读配置再调OpenPort避免每次手动输入。第四处是日志记录。串口调试最怕出问题没痕迹我在ReadData和WriteData里各加一个回调把收发数据带时间戳写到文件。格式用[2025-01-01 12:00:00.123] TX: 01 03 00 00 00 01 84 0A这种方便事后比对。日志文件按天切分超过 10MB 自动新建避免单个文件太大打不开。验证改造效果时我习惯用两个工具对照一个是自己写的程序一个是第三方的串口调试助手。两边同时开同一个串口不行所以用虚拟串口软件建一对COM10和COM11自己程序开COM10调试助手开COM11互相收发。这样能快速判断是发送端问题还是接收端问题。虚拟串口软件在 Windows 上有很多选择装一个就行。最后说个我踩过的坑。有一次改完协议解析后程序跑几分钟就卡死查了半天发现是环形缓冲区溢出。接收中断里PutToRingBuffer没判断缓冲区满覆盖了未读数据导致状态机死循环。从那以后我每次写环形缓冲区都强制加两个判断写之前检查(write_idx 1) % SIZE read_idx满则丢弃并置错误标志读之前检查read_idx ! write_idx空则返回 -1。这个习惯帮我省了很多调试时间。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

AI分镜生成工具Story Claw实测:从脚本到分镜的完整流程评测

AI分镜生成工具Story Claw实测:从脚本到分镜的完整流程评测

最近短视频和短剧的制作需求一下子涨得特别猛,分镜这个环节成了很多团队的瓶颈。传统做法是导演或者美术手绘分镜,或者用3D软件摆场景,成本高、周期长,碰上修改意见更是折腾。所以当有人拿“分镜生成工具 Story Claw 实测”这个话…

2026/10/19 13:07:29 阅读更多 →
基于eNSP的校园网安全体系设计与课程设计全流程实践

基于eNSP的校园网安全体系设计与课程设计全流程实践

简介:一份面向网络安全课程设计的完整参考资源,以巢湖学院校园网为背景,围绕校园网安全体系的设计与实现展开。内容涵盖国内外安全现状分析、校园网结构特点、P-WPDRRC安全模型构建、防火墙与入侵检测联动、主动防御技术应用,以及…

2026/10/19 13:07:29 阅读更多 →
JavaWeb毕设实战:Servlet+JSP二手平台从零部署到微信支付

JavaWeb毕设实战:Servlet+JSP二手平台从零部署到微信支付

简介:这是一套基于JavaWeb技术开发的校园二手交易网站完整源码,面向计算机专业本科生、毕设开发者及JavaWeb初学者,旨在解决高校学生闲置物品流通难、交易缺乏可信平台的问题。系统涵盖学生端(注册登录、商品发布/浏览/下单、留言…

2026/10/19 13:07:29 阅读更多 →

最新新闻

进口阀门选型与采购实务:极端工况应用与避坑指南

进口阀门选型与采购实务:极端工况应用与避坑指南

进口阀门这些年一直是工业项目里绕不开的话题。做设备采购的、搞工艺设计的、管工厂运维的,几乎都跟它打过交道。很多人一听到“进口阀门”就想到贵、货期长、售后麻烦,但实际上它能在国内重工业场景里占据一席之地,靠的是极端工况下那份稳定…

2026/10/19 13:50:38 阅读更多 →
Flink CDC 3.0:MySQL到Doris实时同步的Binlog机制与避坑指南

Flink CDC 3.0:MySQL到Doris实时同步的Binlog机制与避坑指南

简介:由尚硅谷研究院撰写的Flink CDC 3.0学习文档,面向具备一定Flink基础的大数据处理研发人员,系统讲解如何基于变更数据捕获技术实现MySQL到Doris的实时数据同步。内容首先界定CDC概念,比较基于查询和基于Binlog两种方式的执行模…

2026/10/19 13:50:38 阅读更多 →
CLI驱动的Git原生代码审查:LLM嵌入开发流程实践

CLI驱动的Git原生代码审查:LLM嵌入开发流程实践

1. 项目概述:这不是又一个“AI写代码”玩具,而是一套嵌入开发流程的轻量级代码审查协作者“open-code-review”这个名字乍一听像某个开源项目仓库名,但拆开来看——open(开放)、code(代码)、rev…

2026/10/19 13:50:38 阅读更多 →
CP2102驱动安装与串口调试全攻略:从识别到回环测试

CP2102驱动安装与串口调试全攻略:从识别到回环测试

简介:CP2102驱动是Silicon Labs推出的USB转UART桥接器配套软件组件,面向使用开发板、模块或自定义硬件的嵌入式开发者与电子爱好者,用于让Windows系统正确识别并稳定通信CP2102芯片设备。资源包共15个文件,约3.41MB,以…

2026/10/19 13:50:38 阅读更多 →
开源CLI代码审查工作流:基于Git+LLM的本地化自动化Code Review

开源CLI代码审查工作流:基于Git+LLM的本地化自动化Code Review

1. 项目概述:这不是一个“工具”,而是一套可落地的开源代码审查工作流 “open-code-review”这个标题乍看像某个具体软件的名字,但结合它在热搜词中与 CLI、LLM、git、code review 的强关联,再叠加上近期开发者社区里反复出现的…

2026/10/19 13:50:38 阅读更多 →
MATLAB SVD实战:从矩阵分解到图像压缩与降维的完整实现

MATLAB SVD实战:从矩阵分解到图像压缩与降维的完整实现

简介:这份MATLAB SVD资源包面向学习线性代数、信号处理与图像处理的初学者及工程人员,围绕奇异值分解这一核心矩阵分解方法,提供可直接运行的代码示例与实验素材,帮助理解SVD的数学原理及其在信道估计、图像压缩去噪等场景中的落地…

2026/10/19 13:49:32 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/19 10:02:04 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →