简介
一、摘要
1.描述
- 本文主要描述的是如何通过使用C#解析常用MCU的刷写格式文件,如Bin,S19,Hex,Mot,Serc。
- 本软编写的语言是基于C#语言,并未使用其他关联的DLL文件,所以不同的电脑之间兼容性很好,不会出现调用异常的问题。
- 郑重申明,关于实现方法,我也是从网上很多地方学习而来,大家若觉得版权问题可以联系我随时删除。
2.关键字
文件解析,C#,Bin,S19,Hex,Mot,Serc。
二、为何选择C#解析
- C#解析文件有很多好用的字符串处理函数,不过其实方式方法都一样,只要知道了解析方法,使用任何语言都是一样轻松的。
三、BIN文件解析
/*-----define---------------------------------*/
private const int BLOCK_BUFF_LEN = 83886080;
private const byte MOT_LINE_LEN = 16;
private const byte HEX_LINE_LEN = 16;
/*-----enum and struct------------------------*/
private class DataInfo_Type
{
internal int len;
internal uint startAddr;
internal uint endAddr;
internal byte[] buff;
}
/*-----variable statement---------------------*/
private readonly List<DataInfo_Type> g_DataInfos = new List<DataInfo_Type>();
/***********************************************
* Name :PushDataInfo
* Author :WangHu
* Function:***
* Version :V1.0.0
* Data :2022.5.20
***********************************************/
private void PushDataInfo(uint? startAddr, uint? endAddr, uint? minStartAddr, uint? maxEndAddr, byte[] p_buff, int len)
{
int m = 0; int n = 0;
if (minStartAddr == null) {
minStartAddr = 0; }
if (maxEndAddr == null) {
maxEndAddr = 0xFFFFFFFF; }
if ((startAddr > maxEndAddr) || (endAddr < minStartAddr)) {
return; }
if (startAddr < minStartAddr) {
m = (int)(minStartAddr - startAddr); }
if (endAddr > maxEndAddr) {
n = (int)(endAddr - maxEndAddr); }
len = len - m - n;
DataInfo_Type dataInfo = new DataInfo_Type
{
len = len,
startAddr = (uint)(startAddr + m),
endAddr = (uint)(endAddr - n),
buff = new byte[len]
};
CommonLib.Copy(dataInfo.buff, p_buff, m, len);
g_DataInfos.Add(dataInfo);
}
/***********************************************
* Name :AnalysisBinFile
* Author :WangHu
* Function:***
* Version :V1.0.0
* Data :2022.5.20
***********************************************/
private bool AnalysisBinFile(string path, uint? minStartAddr, uint? maxEndAddr)
{
try
{
FileStream file = new FileStream(path, FileMode.Open);
int lenth = (int)file.Length;
if (lenth == 0) {
return false; }
byte[] data = new byte[BLOCK_BUFF_LEN];
uint? startAddr = minStartAddr;
if (startAddr == null) {
startAddr = 0; }
uint? endAddr = (uint?)(startAddr + lenth - 1);
_ = file.Read(data, 0, lenth);
PushDataInfo(startAddr, endAddr, minStartAddr, maxEndAddr, data, lenth);
file.Close();
return true;
}
catch {
return false; }
}
四、BIN文件生成
/***********************************************
* Name :StorageBinFile
* Author :WangHu
* Function:***
* Version :V1.0.0
* Data :2022.5.20
***********************************************/
private bool StorageBinFile(string path, uint startAddr, byte[] p_buff, int len)
{
try
{
Stream file = new FileStream(path, FileMode.Create);
BinaryWriter binWriter = new BinaryWriter(file, Encoding.Unicode);
binWriter.Write(p_buff, (int)startAddr, len);
binWriter.Close();
file.Close();
return true;
}
catch {
return false; }
}
五、S19,M0T,SREC文件解析
/***********************************************
* Name :MotCheckSum
* Author :WangHu
* Function:***
* Version :V1.0.0
* Data :2022.5.20
***********************************************/
private byte MotCheckSum(byte[] buff, int len)
{
byte ret = 0x00;
for (int i = 0; i < len; i++) {
ret += buff[i]; }
return (byte)(0xFF - ret);
}
/***********************************************
* Name :AnalysisMotFile
* Author :WangHu
* Function:***
* Version :V1.0.0
* Data :2022.5.20
*********

本文详细介绍了如何使用C#语言解析和生成BIN、S19、M0T、SREC及HEX等MCU刷写格式文件。作者提供了关键代码实现,包括文件的读取、数据处理和校验等功能,适用于不同类型的文件格式转换。源码可供下载,便于学习和参考。
最低0.47元/天 解锁文章
1028

被折叠的 条评论
为什么被折叠?



