I2C文件传输原理以及生成代码
完整实现方案WinForm C#适配你手上的I2C时序日志txt一、整体需求梳理1. 原始日志格式txt每行逗号分割示例行66,1328180800.00,Data write: 80字段规则行号,时间戳,时序指令2. I2C完整写时序固定流程一条完整寄存器写入固定时序顺序Start→Address write: 从机地址→Write→ACK→Data write: 寄存器地址→Write→ACK→Data write: 写入数据→Write→ACK→Stop3. 转换输出格式要求提取时序里从机地址、寄存器地址、写入字节输出【写】从机0xAC 寄存器0x80 写入:0x004. 界面功能需求按钮「选择并解析I2C日志txt」弹窗选择本地txt文件逐行读取、按时序分组匹配完整I2C写帧自动生成格式化解析文本展示/可复制保存二、I2C日志解析核心逻辑1. 存储临时时序缓存遍历每一行把时序指令按顺序存入临时列表遇到Stop代表一整段I2C传输结束开始解析这一组。2. 单组完整写时序提取规则一组有效写帧必须包含StartAddress write: XX → 提取从机地址十六进制字符串转数字ACK地址应答Data write: REG → 提取寄存器地址ACK寄存器应答Data write: VAL → 提取要写入的数据ACK数据应答Stop遇到NACK直接丢弃本组判定通信失败不生成解析文本。3. 字符串提取工具时序字符串拆分示例Address write: AC→ 截取冒号后内容AC→0xACData write: 80→ 截取冒后80→0x80四、运行效果示例原始txt时序片段58,1327970600.00,Address write: AC 59,1328044200.00,Write 60,1328054600.00,NACK 61,1328072200.00,Stop 62,1328079000.00,Start 63,1328086200.00,Address write: A0 64,1328159800.00,Write 65,1328170200.00,ACK 66,1328180800.00,Data write: 80 67,1328264800.00,ACK 68,1328275400.00,Data write: 00 69,1328359400.00,ACK 70,132837700.00,Stop程序解析输出自动过滤NACK失败帧【写】从机0xA0 寄存器0x80 写入:0x00五、拓展优化按需添加新增导出按钮增加保存解析结果按钮将rtb里全部文本输出到新txt区分读/写帧新增Address read:判断增加【读】格式输出多字节写入支持当前仅支持单字节写入若一条时序多个Data write可循环拼接多组数据异常日志把NACK通信失败帧单独列出方便调试硬件通信故障路径记忆记录上次选择的txt文件夹不用重复浏览。六、操作步骤给上级汇报话术简洁版使用VS新建WinForm C#项目粘贴上述代码界面放置解析按钮结果文本框点击按钮弹窗选择I2C时序txt日志程序自动按Start~Stop分割每条I2C传输帧提取从机、寄存器、写入数据过滤NACK通信失败记录生成统一规范的【写】格式化文本可直接复制/导出文件。结论这条I2C传输写入失败一、逐行拆解这段时序完整流程57,1327963400.00,Start // 发起I2C起始信号准备通信 58,1327970600.00,Address write: AC // 主机发送从机地址0xAC写指令 59,1328044200.00,Write // 主机持续拉低SDA传输地址字节 60,1328054600.00,NACK // 关键从机0xAC没有回复应答 61,1328072200.00,Stop // 主机检测到无应答直接终止本次传输二、I2C基础规则说明正常通信逻辑主机发完从机地址后从机必须拉低SDA发出ACK应答代表「我在线、收到地址可以继续接收寄存器/数据」。NACK无应答代表几种故障总线上不存在0xAC这个从机芯片芯片供电/硬件损坏无法响应I2C总线SDA/SCL短路、接触不良芯片被锁定、未上电拒绝通信。三、对你解析程序的影响这段时序在代码里会被直接丢弃不会生成【写】格式化输出因为缺少ACK应答没有后续寄存器地址、写入数据的传输动作整条帧判定为无效失败帧。补充对比成功的写时序参考成功帧一定会在Address write: XX后紧跟ACK之后才会发送寄存器、写入数据Start Address write: A0 Write ACK // 从机正常应答 Data write: 80 ACK Data write: 00 ACK Stop超详细分步教程零基础VS WinForm C# I2C日志解析工具最终界面布局左侧文本框显示选中的TXT文件完整路径【选择日志文件】按钮弹出窗口挑选i2c日志txt【开始解析并导出结果】按钮解析自动生成解析txt保存到同目录I2C_解析结果文件夹右侧大文本框实时预览解析后的内容一、前期准备安装 Visual Studio打开VS安装程序勾选.NET Framework Windows 窗体应用(.NET Framework)安装完成后启动VS选择【创建新项目】步骤1新建Windows窗体应用项目首页点击【创建新项目】搜索Windows 窗体应用 (.NET Framework)选中下一步项目名称自定义I2CLogAnalyzer选择存放文件夹点击创建等待自动生成默认Form1窗口步骤2拖拽界面控件直接照着拖打开左侧【工具箱】把下面控件拖到Form1窗体调整位置控件类型控件名称(Name)显示文本(Text)作用TextBoxtxtFilePath空左侧展示选中文件路径ButtonbtnSelectFile选择I2C日志txt打开文件选择框ButtonbtnParseExport解析并导出结果执行解析生成txtRichTextBoxrtbResult空右侧预览解析内容布局简单参考[txtFilePath文本框] [btnSelectFile按钮] [btnParseExport按钮] [ rtbResult 大预览框 占下方大面积 ]步骤3替换窗体完整代码双击窗体空白处自动进入Form1_Load代码页面全选系统自动生成的所有代码全部删除复制下面整套完整代码粘贴进去usingSystem;usingSystem.Collections.Generic;usingSystem.IO;usingSystem.Windows.Forms;namespaceI2CLogAnalyzer{publicpartialclassForm1:Form{publicForm1(){InitializeComponent();}// 【选择日志文件】按钮点击事件privatevoidbtnSelectFile_Click(objectsender,EventArgse){OpenFileDialogopenDialognewOpenFileDialog();openDialog.Filter文本文件(*.txt)|*.txt|所有文件(*.*)|*.*;openDialog.Title选择I2C时序日志txt文件;if(openDialog.ShowDialog()DialogResult.OK){// 将选中文件路径填入左侧文本框txtFilePath.TextopenDialog.FileName;rtbResult.Clear();// 清空上次预览内容}}// 【解析并导出结果】按钮点击事件privatevoidbtnParseExport_Click(objectsender,EventArgse){stringsourceTxtPathtxtFilePath.Text.Trim();// 判断是否选择了文件if(string.IsNullOrEmpty(sourceTxtPath)||!File.Exists(sourceTxtPath)){MessageBox.Show(请先选择有效的I2C日志txt文件,提示,MessageBoxButtons.OK,MessageBoxIcon.Warning);return;}// 1. 读取原始日志全部行string[]allLinesFile.ReadAllLines(sourceTxtPath);ListstringsingleFrameBuffernewListstring();// 缓存单段Start~Stop时序ListstringoutputListnewListstring();// 存储最终解析文本foreach(stringlineinallLines){stringtrimLineline.Trim();if(string.IsNullOrWhiteSpace(trimLine))continue;// 按逗号分割行号,时间戳,时序指令string[]splitDatatrimLine.Split(,);if(splitData.Length3)continue;stringcmdTextsplitData[2].Trim();singleFrameBuffer.Add(cmdText);// 遇到Stop代表一整段I2C传输结束开始解析if(cmdTextStop){stringparseResultParseI2CFrame(singleFrameBuffer);if(!string.IsNullOrEmpty(parseResult)){outputList.Add(parseResult);}singleFrameBuffer.Clear();// 清空缓存接收下一段时序}}// 2. 预览解析内容到右侧文本框rtbResult.Clear();foreach(variteminoutputList){rtbResult.AppendText(itemEnvironment.NewLine);}// 3. 自动创建导出文件夹原文件同目录下 I2C_Analysis_OutputstringsourceDirPath.GetDirectoryName(sourceTxtPath);stringsaveFolderPath.Combine(sourceDir,I2C_Analysis_Output);if(!Directory.Exists(saveFolder)){Directory.CreateDirectory(saveFolder);}// 拼接导出文件名称stringsourceFileNamePath.GetFileNameWithoutExtension(sourceTxtPath);stringexportFileName${sourceFileName}_analysis_result.txt;stringfullExportPathPath.Combine(saveFolder,exportFileName);// 写入txt文件File.WriteAllLines(fullExportPath,outputList);MessageBox.Show($解析完成\n文件已导出至\n{fullExportPath},导出成功,MessageBoxButtons.OK,MessageBoxIcon.Information);}/// summary/// 解析单段Start~Stop时序区分读/写成功返回格式化文本失败返回空/// /summaryprivatestringParseI2CFrame(ListstringframeCmds){stringslaveAddrnull;// I2C从机地址stringregAddrnull;// 寄存器地址stringdataValnull;// 读出/写入的数据boolisReadOpfalse;// true读操作 false写操作boolhasNackfalse;foreach(stringcmdinframeCmds){// 出现NACK本次传输直接失效if(cmd.Contains(NACK)){hasNacktrue;break;}// 区分 读地址 / 写地址if(cmd.StartsWith(Address write:)){stringaddrStrcmd.Split(:)[1].Trim();slaveAddraddrStr;isReadOpfalse;}elseif(cmd.StartsWith(Address read:)){stringaddrStrcmd.Split(:)[1].Trim();slaveAddraddrStr;isReadOptrue;}// 处理写数据 Data writeelseif(cmd.StartsWith(Data write:)){stringdataStrcmd.Split(:)[1].Trim();// 第一条Data write 寄存器地址if(regAddrnull)regAddrdataStr;elsedataValdataStr;}// 处理读数据 Data readelseif(cmd.StartsWith(Data read:)){stringdataStrcmd.Split(:)[1].Trim();dataValdataStr;}}// 存在NACK / 关键信息缺失 → 无效帧不输出if(hasNack||slaveAddrnull||regAddrnull||dataValnull)returnnull;// 区分读、写输出格式if(isReadOp){return$【读】从机0x{slaveAddr}寄存器0x{regAddr}读出:0x{dataVal};}else{return$【写】从机0x{slaveAddr}寄存器0x{regAddr}写入:0x{dataVal};}}}}步骤4绑定按钮点击事件必须做否则点击无反应返回窗体设计界面顶部标签Form1[设计]双击【选择I2C日志txt】按钮自动生成绑定代码再双击【解析并导出结果】按钮自动绑定第二个事件现在可以点顶部【启动调试】绿色▶按钮运行程序测试步骤5程序使用操作流程运行程序点击左侧【选择I2C日志txt】找到你的I2C时序日志txt选中打开 → 左侧文本框显示文件路径点击【解析并导出结果】右侧大框实时展示所有成功写入的记录带NACK失败帧自动过滤自动在原txt同一文件夹新建文件夹I2C_解析结果生成原文件名_解析输出.txt弹窗提示导出完成直接打开文件夹就能拿到结果文件测试样例验证测试时序失败帧NACK会被过滤57,1327963400.00,Start 58,1327970600.00,Address write: AC 59,1328044200.00,Write 60,1328054600.00,NACK 61,1328072200.00,Stop程序不会生成这条记录。测试时序成功帧正常输出62,132807900.00,Start 63,1328086200.00,Address write: A0 64,1328159800.00,Write 65,1328170200.00,ACK 66,1328180800.00,Data write: 80 67,1328264800.00,ACK 68,1328275400.00,Data write: 00 69,1328359400.00,ACK 70,132837700.00,Stop导出txt内输出【写】从机0xA0 寄存器0x80 写入:0x00补充打包成独立exe发给同事使用VS顶部菜单栏【生成】→【发布I2C日志解析工具】发布目标选择【文件夹】下一步配置选择【独立】无需对方安装.NET框架完成发布输出文件夹内exe就是独立程序直接双击打开使用。

相关新闻

新零售行业WMS系统推荐:2026年主流仓库管理系统盘点与选型指南

新零售行业WMS系统推荐:2026年主流仓库管理系统盘点与选型指南

一、 行业背景与需求变化2026年,随着全渠道零售、跨境电商、即时零售以及柔性制造的深入发展,企业供应链正面临前所未有的复杂性与不确定性。消费者对履约时效的要求不断提升,促使企业仓储从静态存储向动态流转中心转变。在这一背景下&#x…

2026/10/18 17:31:21 阅读更多 →
【ROS】ros学习笔记(11)——通讯实操04_参数服务器

【ROS】ros学习笔记(11)——通讯实操04_参数服务器

ros学习笔记(11)——通讯实操04_参数服务器1.参数名获取2.功能实现2.1 写cpp文件2.2 修改CMake3.运行4.其他设置方法4.1 命令行实现4.2 启动节点时,直接设置参数4.3 通过launch文件传参需求描述: 修改turtlesim乌龟显示节点窗体的背景色&…

2026/10/16 15:32:03 阅读更多 →
TMS320F2807x McBSP寄存器配置精解:从数据流到多通道实战

TMS320F2807x McBSP寄存器配置精解:从数据流到多通道实战

1. McBSP寄存器全景概览与核心设计思路 在嵌入式DSP开发中,尤其是使用TI的C2000系列进行实时控制或音频处理时,多通道缓冲串行端口(McBSP)是一个绕不开的核心外设。它远不止一个简单的串口,而是一个高度可配置、支持复…

2026/10/19 6:35:32 阅读更多 →

最新新闻

反向传播中的dX:梯度信号的传递逻辑与工程实践

反向传播中的dX:梯度信号的传递逻辑与工程实践

1. 反向传播里回传的那个“梯度信号”,到底是个什么东西我最早接触反向传播时,最迷惑的就是那一堆名字像孪生兄弟一样的变量:dW、db、dX。W是权重,b是偏置,这两个是参数,算它们的梯度去更新参数&#xff0c…

2026/10/19 13:28:17 阅读更多 →
基于CNN卷积神经网络的盆栽识别Web应用设计与部署全攻略

基于CNN卷积神经网络的盆栽识别Web应用设计与部署全攻略

做毕业设计最难的不是把代码跑通,而是选一个“看起来有难度、实际能完成、最后还能当众演示”的题目。基于CNN卷积神经网络的盆栽识别Web应用,恰好是这么一类题目:它把深度学习图像分类、数据集处理、Web网页开发三条线串在一起,最…

2026/10/19 13:28:17 阅读更多 →
基于Claude Agent SDK构建智能财务分析Agent的实战指南

基于Claude Agent SDK构建智能财务分析Agent的实战指南

前段时间接到一个很典型的财务分析需求:业务部门天天在问“这个月毛利为什么掉了”“华东区回款天数怎么又变长了”,IT这边每次都要走提数、写SQL、做透视表、写说明的流程,一个需求少说半天起。当时正好在研究 Claude Agent SDK,…

2026/10/19 13:28:17 阅读更多 →
自建CRM系统实战:从数据模型到部署上线的完整指南

自建CRM系统实战:从数据模型到部署上线的完整指南

DeskcommCRM 这个名字,最初只是我给自己写的一个内部工具随手起的代号。起因很直接——团队换了好几款在线客户管理工具,最后都卡在同一个地方:数据导不出来、字段怎么调都不顺手、销售跟进的过程跟黑盒一样。后来我干脆自己动手写了一个&…

2026/10/19 13:28:17 阅读更多 →
AI写作总被识别?九个维度实战术让文本带上个人指纹

AI写作总被识别?九个维度实战术让文本带上个人指纹

把初稿交给导师,三分钟不到就被反问了一句:“这段是你用AI写的吧?”这种场景在专科生群体里太常见了。尤其是毕业设计说明书、实训报告、课程论文这类偏实践性的文本,很多同学确实用了AI辅助,结果交上去要么被检测系统…

2026/10/19 13:28:17 阅读更多 →
2025届毕业生AI辅助论文写作:五大实用方案与避坑指南

2025届毕业生AI辅助论文写作:五大实用方案与避坑指南

打开朋友圈,2025届的师弟师妹们已经开始晒毕业照了。但我知道,还有相当一批人正在为毕业论文的收尾工作熬着夜。今年带了几位本科生的毕业设计,又参与了硕士论文的预答辩评审,最大的感触是:AI辅助写作已经从“新鲜事物…

2026/10/19 13:27:17 阅读更多 →

日新闻

频率跟踪型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 阅读更多 →