- 博客(228)
- 资源 (1)
- 收藏
- 关注
原创 【C#】winform代码编程中,锁和标志位的细分区别
摘要:标志位(guard flag)与锁(lock)的核心区别在于,标志位仅作为业务门禁,不阻塞线程且无原子性保证,适合UI线程防连击;而锁会阻塞线程并确保临界区互斥访问。在UI事件中应避免使用锁,因其可能导致界面卡死。推荐采用原子操作(如Interlocked)实现非阻塞式门禁,既能严格防重入又不会阻塞UI线程。标志位适用于单线程防重入场景,锁则适用于多线程资源保护。
2026-01-21 15:45:43
390
原创 【Servo】工程版角度扫频的共振点
摘要: 共振点是扫频测试中系统响应异常增大的频率点,表现为输入激励不变时输出幅值显著增加或在Bode图上出现幅值尖峰与相位突变。其本质类似弹簧-质量系统的固有频率响应,在电机伺服系统中常源于机械结构、惯量耦合或控制参数问题。共振点会引发不稳定、振动和噪音,需通过避开、陷波滤波或重新设计来抑制。识别特征为幅频曲线的陡峭峰值及相位快速变化,工程上需重点处理这些"易被激发"的频率点。(149字)
2026-01-19 14:45:12
405
原创 【Servo】cnt在电机里的核心含义
在电机/伺服系统中,cnt通常指编码器计数值(Encoder Count),表示电机轴位置对应的累计脉冲数。例如,当编码器为17位时,1圈对应131072个计数,53596表示电机转到了约0.409圈。在扫频测试中,若所有采样点均为53596,说明电机在该频段未发生有效位移(变化量小于1个计数单位),导致DFT分析结果为0。这种量化误差是使用整数计数信号的固有缺陷,工程上建议改用模拟量反馈(如速度或浮点位置)或对计数进行物理量转换(如弧度)以提高分辨率。此外,可设置阈值直接剔除无响应频点,但需注意区分真实共
2026-01-19 14:37:13
391
原创 【C++】VS 里 “看不到 std::cout”,最常见几类原因
摘要:在VS中无法看到std::cout输出的常见原因及解决方案:1)查看控制台窗口而非VS输出窗口;2)项目为Windows子系统缺少控制台,需修改为Console子系统或手动创建;3)未换行或flush导致缓冲区未刷新;4)如需在VS输出窗口显示,应使用OutputDebugStringA;5)代码可能未执行到输出位置。最常见情况是GUI项目缺少控制台或未刷新缓冲区。
2026-01-13 13:43:33
173
原创 【C++】计组相关--32位浮点型和32位整型的计算
当解析字节序列 06 FF FF FF 时,不同数据类型会得到不同结果: int32:按补码解析为 -250(有效值) float32:因指数位全1且尾数非0,按IEEE754标准解析为 NaN 这表明: 该字段可能本应是int32而非float32 或下位机用特殊值表示无效数据 日志中出现的 isfinite(v0)==false 正是由于浮点解析触发了NaN,而非解析错误。类似 00 00 00 00 则正常解析为0/0.0。需检查数据协议定义或下位机编码逻辑。
2026-01-07 14:41:57
276
原创 【C#】为什么同样继承 XtraUserControl, 一个有 Designer 一个没有?
本文解释了两种创建用户控件的不同方式及其适用场景。方式A通过设计器创建,会生成Designer.cs文件,适合需要可视化布局的场景;方式B纯代码创建,不生成Designer文件,适合需要最小依赖和更高可控性的内置工具。文章指出两种方式可相互转换,若要让纯代码控件支持拖拽设计,需改为Designer模式并完成相应代码迁移。实际选择取决于项目需求:平台工具适合纯代码,而需要可视化布局的功能则应采用设计器模式。
2025-12-26 10:46:54
259
原创 【C#】软件设计,华为的IPD学习之需求开发心得
华为IPD需求管理体系将需求分为RR、IR、SR、AR四个层级,从原始需求逐步细化到可落地的分配需求。AR(分配需求)是落实到具体开发组的最小单元,需进一步拆分为设计、开发、自测和开发主流程时间四个执行维度:设计阶段完成技术方案和接口设计;开发阶段实现编码和联调;自测确保核心功能可用;开发主流程时间则管控关键路径进度。这种分层拆解方法确保了需求从概念到实现的可控性。
2025-12-24 10:27:01
879
原创 【C#】ScottPlot的Refresh()
摘要: ScottPlot 4.x 的 WinForms FormsPlot.Refresh() 源码核心逻辑仅包含三步:调用 Application.DoEvents() 处理消息队列、标记手动渲染标志位,并触发 Backend.Render() 执行实际绘图。该方法耗时波动主要受后端渲染复杂度(如轴计算、GC抖动)和 DoEvents() 的可重入风险影响。参数 skipIfCurrentlyRendering 能缓解消息队列积压,而 lowQuality 可提升交互帧率。源码表明,高频调用时需注意 D
2025-12-18 16:01:00
761
原创 【C#】画图控件的FormsPlot中的Refresh功能调用消耗时间不一致缘由
mFormsPlotDynamic是一个基于ScottPlot的WinForms画图控件,用于显示动态曲线数据。调用Refresh()方法会强制控件立即重绘,包括重新计算坐标轴、绘制曲线和更新显示。重绘时间通常在8ms到40ms之间波动,主要受三个因素影响:绘制内容复杂度(如坐标轴调整、元素数量)、UI线程繁忙程度,以及偶发的GC内存回收。8ms表示流畅绘制,40ms则可能导致25帧/秒的卡顿。该机制类似于即时打印图表,其速度取决于当前绘图任务量和系统状态。
2025-12-16 14:01:10
381
原创 【Servo】伺服驱动器的黑匣子功能
工业设备黑匣子是一种环形缓冲记录系统,可实时采集关键运行参数(如位置、电流、电压等8-16个通道,采样率1-2kHz),通过预设触发条件(报警/阈值/I/O等)自动冻结并存储故障前后数据(通常记录2秒,含1.5秒预触发)。相比传统示波器,它能离线捕获偶发故障的完整波形和状态信息,有效解决"故障复现难"问题。典型应用场景包括过流、过压、跟随误差等故障诊断,使用时需注意采样率与记录时长的平衡,并建议触发后立即导出数据避免覆盖。该工具显著提升了现场故障分析的效率和准确性。
2025-11-24 14:05:52
84
原创 【Servo】y=Asin(ωx+φ)
摘要:正弦函数 ( y = A\sin(\omega x + \varphi) ) 的参数解析: 幅值 ( A ) 决定振幅,负值时图像上下翻转; 角频率 ( \omega ) 控制周期 ( T = 2\pi/|\omega| ) 和频率 ( f = |\omega|/2\pi ); 相位 ( \varphi ) 确定水平位移 ( -\varphi/\omega )。图像对称性、零点和极值点位置可精确计算,导数与积分结果直接关联参数。扩展形式包括直流偏置和复指数表示,工程中广泛应用。核心记忆点:幅值定纵向范
2025-11-11 10:26:45
945
原创 【C#】WinForms 控件句柄与 UI 刷新时机
摘要:WinForms 控件必须具有句柄(Handle)才能更新UI,否则操作会被跳过。典型现象是后台线程产生的日志/数据在控件句柄创建前丢失。解决方案包括:1)消息缓冲-创建句柄后补刷;2)预热句柄-提前创建并保持;3)数据视图解耦。关键检查点:IsHandleCreated状态、UI更新条件判断、启动顺序。适用于所有"后台持续产出+界面延迟创建"场景。核心原则:先确保句柄存在再更新UI,或通过缓存/预热保证数据不丢失。(149字)
2025-11-03 16:24:45
850
原创 【C#】XtraMessageBox(DevExpress)与MessageBox(WinForms 标准库)的区别
摘要:XtraMessageBox(DevExpress)与WinForms标准MessageBox功能对比: 类型:均为静态调用,但XtraMessageBox明确为静态类,而MessageBox限制实例化。 特性:XtraMessageBox支持DevExpress皮肤、HTML富文本、自定义按钮等高级功能;MessageBox仅提供基础文本与固定按钮。 适用场景:已有DevExpress项目推荐XtraMessageBox以保持UI一致;轻量级工具或无依赖需求时选择标准MessageBox更简便。两者
2025-10-30 11:30:56
466
原创 【C#】await Task.Delay(100)与Thread.Sleep(100)?
本文对比了await Task.Delay(100)和Thread.Sleep(100)的差异。前者是异步等待,不阻塞UI线程,适合UI程序和异步方法;后者会同步阻塞当前线程,导致UI卡顿,仅适用于后台线程或控制台程序。文章建议在UI逻辑中使用Task.Delay,后台线程可用Thread.Sleep,并强调主线程绝对不能使用Sleep,同时给出了正确和错误用法的代码示例。最后用口诀总结了使用场景:"UI用Task.Delay,后台用Thread.Sleep,主线程绝不Sleep"。
2025-10-13 13:52:33
530
原创 【C#/Cpp】CLR项目搭建的内联和托管两选项
C++/CLI项目中"内敛"和"托管"选项的选择指南:内敛选项适用于优化频繁调用的小函数性能,通过内联函数实现;托管选项决定代码是否与.NET框架交互,勾选后可与C#等语言互通。选择时需权衡性能需求与.NET集成需求:纯C++项目可不选托管,需要与.NET交互则必须勾选托管;针对性能关键的小函数可启用内敛优化。两者组合适用于需要同时满足.NET互操作和性能优化的场景。
2025-08-28 16:42:52
808
原创 【C++】懒加载、单例初始化、全局资源注册的运用
C++11中的std::once_flag和std::call_once提供了一种线程安全的一次性初始化机制。它们确保在多线程环境中,初始化代码只会执行一次,且具有内存可见性保证。这些原语属于并发编程中的同步工具,常用于懒加载、单例模式和全局资源初始化等场景。相比手动实现的双重检查锁定模式,这种方法更简单可靠。使用时需要注意异常处理(异常会导致初始化重试)和对象生命周期管理(once_flag不可重置)。典型应用包括网络库初始化、配置加载和单例实现等。
2025-08-28 16:38:05
1007
原创 【Servo】FFT 中的归一化
FFT归一化概述 在频谱分析中,归一化是对FFT结果进行缩放,使其幅度或能量与输入信号物理量一致。不同软件库处理方式不同:未归一化时幅度约为N倍(N为采样点数);部分归一化在正变换时除以N;完全归一化则正/逆变换各除√N以保持能量守恒。 归一化的必要性在于:确保频谱幅度反映真实信号幅值,便于不同长度FFT结果比较,并满足能量守恒(Parseval定理)。若不归一化,会导致幅度失真、不同点数结果不可比,以及能量计算误差。 例如,1Hz正弦波(幅值1)经1024点FFT后,未归一化主峰约512,归一化后主峰约0
2025-08-27 13:43:42
880
原创 【C#】观察者模式 + UI 线程调度、委托讲解
摘要: 本文解析“观察者模式+UI线程调度”的典型实现,以ScopeFrame数据传输为例。核心包括:1)观察者模式解耦发布者(DemoDeviceService)与订阅者(UI);2)通过.NET事件机制实现多播委托;3)用BeginInvoke保证跨线程UI操作安全;4)数据帧封装(如ScopeFrame)统一交互契约。提供了复用模板:定义数据类→声明事件→触发事件→UI线程安全处理,并举例心率监控应用。该设计实现松耦合、线程安全与扩展性,适用于需要后台数据实时推送至前端的场景。
2025-08-22 18:07:59
1153
原创 【git】更改dafault和protect属性
本文介绍了如何将GitLab项目的默认分支设置为main并对其进行保护。操作步骤包括:1)确认main分支存在;2)在项目设置中将main设为默认分支;3)配置分支保护策略(如限制推送/合并权限);4)可选处理旧分支;5)同步本地仓库。需要Maintainer/Owner权限,操作后被拒通常因权限或保护规则导致。完成后main将成为受保护的默认分支。
2025-08-19 11:18:29
582
原创 【git】改 GitLab 远程分支名;
摘要:要修改GitLab远程分支名,需将旧分支推为新名并删除旧分支。默认分支还需在GitLab设置中更改指向。通用命令包括本地重命名、推送新分支、删除旧分支。修改默认分支需额外在仓库设置中更新,并同步保护规则。若使用TortoiseGit,可通过图形界面完成相同操作。常见问题包括受保护分支权限不足、CI/MR目标分支需同步更新等,需相应调整权限或由Maintainer操作。(150字)
2025-08-19 11:11:45
1864
原创 【C#】 GridControl与GridView、容器和视图
本文介绍了DevExpress中GridControl与GridView的区别及正确使用方法。GridControl是数据容器,负责绑定数据源和承载视图;GridView负责表格呈现,处理列、排序、过滤等显示功能。文章提供了两种配置方法:A)删除重建并重命名控件;B)通过Smart Tag手动添加和配置视图。同时给出了代码示例,包括数据绑定、视图设置、列格式化和行着色等常见操作。强调GridControl用于数据绑定,GridView负责显示设置,两者需配合使用且命名要规范。
2025-08-15 17:41:24
438
原创 【C++】自研基 2 Cooley–Tukey
本文介绍了基2 Cooley-Tukey快速傅里叶变换(FFT)算法的实现要点。该算法要求输入长度N为2的幂次,通过三层关键操作实现高效计算:首先进行倒位序重排(将输入序列按索引二进制位反转顺序排列);然后进行M=log₂N级蝶形运算,每级将数据分组进行2点蝶形计算并乘以旋转因子;最后输出存储在输入数组中。文章还说明了该算法在具体实现中的变量对应关系、与上下游系统的交互流程,以及需要注意的归一化处理和输入长度要求。该算法将DFT复杂度从O(N²)降至O(Nlog₂N)。
2025-08-15 16:04:47
989
原创 【C】环境搭建与运行说明--模板
环境搭建与运行摘要(IAR + VS Code,STM32H723) 本文档提供STM32H723开发环境搭建指南,包含以下核心内容: 工具链配置:IAR EWARM + VS Code + STM32CubeProgrammer 硬件要求:ST-LINK调试器、目标板及SWD连接 软件安装清单:IAR 9.x.x、设备包、CLI工具等 开发流程: IAR GUI编译下载验证 命令行构建与烧录 VS Code任务集成 验证标准:串口输出/LED心跳等运行证明 常见问题排查:时钟配置、链接脚本等 文档包含详细
2025-08-15 11:36:43
1137
原创 【C#】DevExpress.XtraEditors.MemoEdit memoEditLog控件讲解
本文介绍了 DevExpress.XtraEditors.MemoEdit 控件的特性与用途。作为 DevExpress UI 组件库中的多行文本编辑框,它类似于标准 .NET 的 TextBox(Multiline),但提供了更多样式和属性。MemoEdit 适合显示大段文本或日志,支持滚动条和只读模式,但不支持富文本格式。如需多色文本显示,建议改用 RichTextBox 或 DevExpress 的 RichEditControl。该控件适用于单一颜色的日志显示场景,但无法单独设置每行颜色。
2025-07-30 17:04:26
307
原创 【git】在 GitLab 上如何把 A 分支(如 feature/xxx)合并到 B 分支(如 trunk)
GitLab 分支合并与删除操作指南 选择分支: Source branch(源分支):选择要合并的分支A(如 feature/xxx)。 Target branch(目标分支):选择合并目标分支B(如 trunk)。 提交合并请求: 通过 Compare branches and continue 创建 Merge Request(MR)。 审核通过后,合并代码到目标分支。 删除源分支: 合并时勾选 “Delete source branch” 自动删除分支A。 未勾选可后续手动删除。 示例:将 feat
2025-07-30 11:13:52
884
原创 【C++】去均值,扫频(Bode分析)、DFT/FFT前的预处理非常重要
去均值是信号预处理的关键步骤,主要作用是消除直流偏置对频域分析的影响。时域信号中的非零均值会导致DFT/FFT分析时主频点的幅值和相位失真,降低信噪比。通过去除直流分量,可以确保频域分析结果准确反映系统真实响应。在代码实现上,通常先计算信号均值再减去。输出信号(如反馈信号)必须去均值,输入信号(如激励信号)也建议处理。这一操作能有效提升扫频和频谱分析的可靠性。
2025-07-24 13:34:53
361
原创 【Servo】传递函数,工程例子,伺服系统bode
传递函数:控制系统的数学核心 传递函数是描述系统输入输出关系的频域数学模型,公式为G(s)=Y(s)/U(s)。它揭示了系统的动态特性(如惯性、延迟),能预测任何输入对应的输出响应。 典型实例: 水箱系统:输入流量与输出水位的关系呈现一阶特性G(s)=1/(As) 伺服驱动器:速度环传递函数G(s)=K/(Ts+1),K为增益,T为时间常数,反映系统响应速度 工程应用: 通过伯德图分析频率响应 用于系统整定和性能评估 通过-3dB点(对应ω=1/T)确定系统带宽 传递函数将复杂物理系统转化为可计算的数学模型
2025-07-21 17:15:02
1954
原创 【Servo】常见的信号频谱分析方法,csd 和 welch 是什么
信号频谱分析方法:welch与csd简介 welch和csd是两种常见的信号频谱分析方法,分别用于不同的频谱估计目的。welch方法用于估计信号的自功率谱密度(PSD),反映信号自身的频谱能量分布,适用于噪声分析和频谱特性提取。csd方法则用于估计两个信号的互功率谱密度(CSD),分析信号间的频域相关性,常用于系统辨识和频率响应分析。在频响函数(FRF)计算中,通过csd与welch的比值($H(f) = \frac{S_{yu}(f)}{S_{uu}(f)}$)可得到系统的传递特性。这两种方法在工程信号处
2025-07-21 15:04:15
787
原创 【Servo】伺服驱动器扫频功能方案文档
本文档介绍了伺服驱动器扫频功能的设计方案,包含需求背景、验收标准、实现方案和UI界面设计。该功能通过频率响应分析(Bode图)诊断系统特性,优化伺服参数。方案采用上位机+下位机协作模式,支持参数配置、自动数据采集与分析、伯德图可视化及报告导出。UI界面分为参数设置区、实时进度监控区和伯德图展示区,提供一键操作、曲线缩放对比和异常提示功能,满足工业自动化场景下的伺服系统调优需求。
2025-07-17 16:00:26
793
原创 【C】为什么要有基准时钟、为什么要再分频
摘要:采样系统需要基准时钟(如8kHz的SYSTEM_FREQ)并通过分频系数(SAMPLING_RATE_DIV_COEFF)调整采样率。分频机制允许灵活降低采样频率(如8kHz/2=4kHz),无需修改硬件时钟。这类似于利用钟表滴答声的频率,通过间隔计数来降低操作频率。分频系数确保了采样率与基准时钟保持整数倍关系,实现稳定触发和便捷调整。
2025-07-10 11:21:07
289
原创 【C#】PanelControl与Panel
DevExpress的PanelControl和.NET自带的Panel控件各有特点。PanelControl支持丰富的主题样式和外观定制,适合已使用DevExpress皮肤的项目;而标准Panel控件轻量高效,适合不需要第三方依赖的简单场景。选择时需考虑项目是否已采用DevExpress皮肤以及对外观定制的需求程度。
2025-07-09 16:46:15
590
原创 【Servo】伺服驱动器里的“超程”,是工业自动化、运动控制领域的常用术语
伺服超程解析 超程指伺服系统运动超出预设机械极限(正向/负向),常见于滑台越位、电机过转等情况。系统通过物理限位开关或软限位检测超程,触发报警并强制停机,保护设备及人员安全。故障需检查实际越限、限位设置或参数错误。核心作用在于防止机械损坏与安全事故。
2025-07-09 16:41:53
336
原创 【Servo】伺服驱动器里的“超程”,是工业自动化、运动控制领域的常用术语
伺服超程解析 超程指伺服系统运动超出预设机械极限(正向/负向),常见于滑台越位、电机过转等情况。系统通过物理限位开关或软限位检测超程,触发报警并强制停机,保护设备及人员安全。故障需检查实际越限、限位设置或参数错误。核心作用在于防止机械损坏与安全事故。
2025-07-07 14:34:07
759
原创 【C】陷波滤波器
陷波滤波器是一种选择性衰减特定频率信号的滤波器,在伺服系统中主要用于抑制机械共振。它能精准滤除导致电机异响、抖动的共振频率点(如42Hz),从而提升系统稳定性。实际应用中可用于消除振动噪音、提高系统带宽,甚至多级并联处理多频点共振。调试时需精确测定共振频率并合理设置带宽,避免过度影响正常控制。作为伺服调试的关键工具,陷波滤波器有效解决了机械共振引发的抖动、过流等问题。
2025-06-28 16:08:05
1242
原创 【C#】`ComboBox` 和 `ComboBoxEdit`的区别
WinForms中ComboBox与ComboBoxEdit的区别 ComboBox是WinForms原生下拉框控件(System.Windows.Forms),满足基本选择输入需求,轻量易用但功能有限。ComboBoxEdit(如DevExpress的XtraEditors)是第三方增强控件,支持主题美化、自动补全等高级功能,需引用DLL。 如何选择? 普通场景:用原生ComboBox 复杂UI需求:选用第三方ComboBoxEdit (注:后者需配合控件库使用) 两者核心差异在于功能扩展性与自定义程度。
2025-06-28 09:35:13
636
原创 【C#】WinForms C# 控件布局常用方式
WinForms C#控件布局常用方式包括:绝对定位(简单但不推荐)、Anchor锚定(半自适应)、Dock停靠(大块分区推荐)、布局容器控件(如TableLayoutPanel和FlowLayoutPanel)及嵌套布局。合理使用Panel分区结合Dock和TableLayoutPanel可实现复杂响应式布局。VS中WinForms设计快捷键包括Ctrl+箭头键微调位置/大小、对齐操作(如Ctrl+Shift+方向键)、等间距分布及Tab顺序设置等。实用建议:避免控件重叠,优先使用Panel+Dock组合
2025-06-27 17:10:30
2051
c-cpp-properties.json、launch.json 和 tasks.json三者文件
2024-10-16
使用Python语言 ,实现批量删除C/C++类型注释
2024-08-02
C++实战练手-通讯录管理系统-源码
2024-01-26
QSerialport多线程方法
2024-01-08
关于整合SSM的思维导图
2022-01-29
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅