dat 文件怎么打开(示波器bin文件)

2024-02-11 10:04 星期日 96点热度 0人点赞

之前的文章中对示波器波形文件进行了解析,见参考链接示波器波形数据文件(trc,dat文件)解析。其实,我们对trc或者dat文件的解析主要是通过上位机,对数据进行我们想要的处理,因此,本文我们将一下用C#实现文件的解析。
之前的文章中,我们知道,trc文件可以用十六进制的格式打开,然后进行每个Byte的解析。dat文件可以通过文件流的形式打开,即ASCII的形式打开。因此,对于trc文件我们主要使用BinaryReader来实现解析,dat文件通过StreamReader打开即可。
//打开trc文件
FileStream bin_stream = newFileStream(file_name,FileMode.Open);
BinaryReader bin_reader =new BinaryReader(bin_stream);
//打开dat文件StreamReader read_file =new StreamReader(file_name);
对于十六进制文件格式的操作,可以具体参考我之前的文章。C#学习随笔—操作BIN文件(读,写,替代),注意:BIN文件的操作实质上也是十六进制码的操作。我这里大概列一下简单的读操作:
bin_reader.ReadBytes(346)//读取346个bytes
对于文本文件格式的操作,基本如下:
read_file.ReadLine();//读取一行String字符串
上面是比较基本的文件操作方法,我们本文不做过多叙述,只说我们会用到的。
然后在解析文件过程中,会用到byte[]转换为float型,byte[]转换为word(int16),byte[]转换为ASCII string,byte转换为ASCII。
BitConverter.ToUInt32(数组名,数组的开始的index);//byte[]转换为Uint32
BitConverter.ToInt16(数组名,数组的开始的index);//byte[]转换为Int16
BitConverter.ToSingle(数组名,数组开始的index);//byte[]转换为Float
Encoding.ASCII.GetString(数组名,数组开始的index,长度);//Byte[]转换为ASCII String字符
(char);//Byte转换为ASCII码,直接强制数据类型转换
然后我们要将数据类型显示到Winform的Chart图表中。
Chart图标的操作,我在这儿不做详细叙述,我这里也只是对数据的初步显示,不做炫酷的操作。效果图如下所示:
直接上源码:
usingSystem;using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
namespace Cellwise_Debug_Tool
{
public partial class SoftwareToolWindows : Form
{
//TRC 文件各个数据类型占用字节数
public const int LONG_LENGTH = 4;
public const int WORD_LENGTH = 2;
public const int FLOAT_LENGTH = 4;
public const intDOUBLE_LENGTH =8;
public const int BYTE_LENGTH = 1;
//Chart控件中显示的最大数据点数
public const int MAX_SHOW_LENGTH = 100000;
//trc文件的数据解析,具体可以参考上一篇文章
public enum trc_file_offset
{
KEY_WORD_OFFSET = 0x000B,
TEMPLETE_VERSION_OFFSET =0x001B,
DATA_TYPE_OFFSET= 0x002B,
DATA_HIGH_LOW_OFFSET = 0x002D,
WAVEDESC_LENGTH_OFFSET =0x002F,
USERTEXT_LENGTH_OFFSET = 0x0033,
TRIGTIME_LENGTH_OFFSET = 0x003B,
RISTIME_LENGTH_OFFSET =0x003F,
DATA_ARRAY_1_OFFSET = 0x0047,
DATA_ARRAY_2_OFFSET = 0x004B,
INSTRUMENT_NAME_OFFSET =0x0057,
INSTRUMENT_NUM_OFFSET = 0x0067,
CHANNEL_LABEL_OFFSET = 0x006B,
DATA_ARRAY_1_POINT_LENGTH_OFFSET =0x007F,
OSC_DISPLAY_POINT_LENGTH_OFFSET = 0x0083,
FIRST_VALID_INDEX_OFFSET =0x0087,
LAST_VALID_INDEX_OFFSET = 0x008B,
VERTICAL_GAIN_OFFSET = 0x00A7,
VERTICAL_OFFSET_OFFSET =0x00AB,
HORIZ_INTERVAL_OFFSET = 0x00BB,
VERTICAL_UNIT_OFFSET = 0x00CF,
HORIZ_UNIT_OFFSET =0x00FF,
TIMEBASE_OFFSET = 0x014F,
PROBE_RES_SETTING_OFFSET = 0x0151,
VERTICAL_DIV_OFFSET =0x0157,
BANDLIMIT_ENABLE_OFFSET = 0x0159,
CHANNEL_NUM_OFFSET = 0x0163,
MAX_WAVEDESC_OFFSET =0x164,
};
public enummessage_info
{
FORMAT_ERROR,
STRING_OUT,
}public struct software_status_t
{
public byte[] header_byte;
public byte point_type;//00-->Byte,01-->Word
public UInt32 user_text_length;
public UInt32 trig_time_length;
public UInt32 ris_time_length;
public UInt32 point_length;
public float horiz_interval;
public byte horiz_unit;
public byte vertical_unit;
public float vertical_gain;
public float vertical_offset;
publicDataTable data_value;
}
software_status_t software_status;public SoftwareToolWindows()
{
InitializeComponent();
app_init();
}
//用户配置初始化
private void app_init()
{
software_status.header_byte = new byte[512];
ChartInit();
}
//Chart控件初始化
private void ChartInit()
{
#region SetChartPropertyWaveform.BackColor = Color.White;
Waveform.BackGradientStyle = System.Windows.Forms.DataVisualization.Charting.GradientStyle.None;
Waveform.BorderlineColor = Color.Black;
Waveform.BorderlineDashStyle = System.Windows.Forms.DataVisualization.Charting.ChartDashStyle.Solid;
Waveform.BorderlineWidth =1;
Waveform.BorderSkin.SkinStyle = System.Windows.Forms.DataVisualization.Charting.BorderSkinStyle.None;#endregion
#regionSetTitleProperty
System.Windows.Forms.DataVisualization.Charting.Title title = newSystem.Windows.Forms.DataVisualization.Charting.Title();
title.Text ="Waveform";
title.Font = new Font("Times New Roman",10, FontStyle.Regular);
title.Alignment = ContentAlignment.TopCenter;
title.TextStyle = System.Windows.Forms.DataVisualization.Charting.TextStyle.Default;
Waveform.Titles.Add(title);#endregion
#region SetChartAreaProperty
//handle in the Form
#endregion
#region SetLegandProperty
//handle in the Form
#endregion
}
//Trc Dat File 对话框处理函数
private void FileBrowse_Click(object sender, EventArgs e){
OpenFileDialog open_file =new OpenFileDialog();
open_file.Filter = "波形文件|*.trc|数据文件|*.dat";//只需要trc文件或者dat文件
if (open_file.ShowDialog() == DialogResult.OK)
{
FilePath.Text = open_file.FileName;
if (open_file.FilterIndex == 1)//波形数据文件 .trc文件{
trc_file_convert_to_data(open_file.FileName,Waveform);
}else if(open_file.FilterIndex == 2)//波形数据文件 .dat{
dat_file_convert_to_data(open_file.FileName, Waveform);
}
}
}//trc文件解析函数
//file_name trc文件路径
//Chart Chart控件,trc文件数据输出至Chart控件
private void trc_file_convert_to_data(stringfile_name,System.Windows.Forms.DataVisualization.Charting.Chart dataChart)
{
FileStream bin_stream = newFileStream(file_name,FileMode.Open);
BinaryReader bin_reader =new BinaryReader(bin_stream);
try{
software_status.header_byte = bin_reader.ReadBytes((int)trc_file_offset.MAX_WAVEDESC_OFFSET+1);
stringtrc_file_log = System.Text.Encoding.ASCII.GetString(software_status.header_byte,(int)trc_file_offset.KEY_WORD_OFFSET,8);
if (trc_file_log == "WAVEDESC")
{
message_info_output(false, message_info.STRING_OUT, "FILE LOG: WAVEDESC");
stringtrc_file_version = System.Text.Encoding.ASCII.GetString(software_status.header_byte, (int)trc_file_offset.TEMPLETE_VERSION_OFFSET,10);
if (trc_file_version == "LECROY_2_3")
{
message_info_output(false, message_info.STRING_OUT,"FILE Version: Lecroy_2_3");
message_info_output(false, message_info.STRING_OUT,"INSTRUMENT NAME: "+Encoding.ASCII.GetString(software_status.header_byte, (int)trc_file_offset.INSTRUMENT_NAME_OFFSET,14));
message_info_output(false, message_info.STRING_OUT, "INSTRUMENT NUMBER: " + (BitConverter.ToUInt32(software_status.header_byte,(int)trc_file_offset.INSTRUMENT_NUM_OFFSET)).ToString());
software_status.point_length = BitConverter.ToUInt32(software_status.header_byte, (int)trc_file_offset.DATA_ARRAY_1_POINT_LENGTH_OFFSET);
software_status.horiz_interval = BitConverter.ToSingle(software_status.header_byte, (int)trc_file_offset.HORIZ_INTERVAL_OFFSET);
software_status.horiz_unit = software_status.header_byte[(int)trc_file_offset.HORIZ_UNIT_OFFSET];
software_status.vertical_unit = software_status.header_byte[(int)trc_file_offset.VERTICAL_OFFSET_OFFSET];
software_status.vertical_gain = BitConverter.ToSingle(software_status.header_byte, (int)trc_file_offset.VERTICAL_GAIN_OFFSET);
software_status.vertical_offset = BitConverter.ToSingle(software_status.header_byte, (int)trc_file_offset.VERTICAL_OFFSET_OFFSET);
message_info_output(false, message_info.STRING_OUT,"DATA POINT LENGTH: "+ software_status.point_length.ToString());
message_info_output(false, message_info.STRING_OUT, "HORIZ INTERVAL: "+ software_status.horiz_interval.ToString("F15")+((char)software_status.horiz_unit).ToString());
software_status.user_text_length = BitConverter.ToUInt32(software_status.header_byte, (int)trc_file_offset.USERTEXT_LENGTH_OFFSET);
software_status.trig_time_length = BitConverter.ToUInt32(software_status.header_byte, (int)trc_file_offset.TRIGTIME_LENGTH_OFFSET);
software_status.ris_time_length = BitConverter.ToUInt32(software_status.header_byte, (int)trc_file_offset.RISTIME_LENGTH_OFFSET);
if(software_status.user_text_length >0)
{
bin_reader.ReadBytes((int)software_status.user_text_length);
}
else{
message_info_output(false, message_info.STRING_OUT, "USER_TEXT AREA is Empty!");
}
if(software_status.trig_time_length >0)
{
bin_reader.ReadBytes((int)software_status.trig_time_length);
}
else{
message_info_output(false, message_info.STRING_OUT, "TRIG_TIME AREA is Empty!");
}
if(software_status.ris_time_length >0)
{
bin_reader.ReadBytes((int)software_status.ris_time_length);
}else
{
message_info_output(false, message_info.STRING_OUT, "RIS_TIME AREA is Empty!");
}
software_status.point_type = software_status.header_byte[(int)trc_file_offset.DATA_TYPE_OFFSET];
software_status.data_value =new DataTable();
software_status.data_value.Columns.Add("Times", typeof(float));
software_status.data_value.Columns.Add("Value", typeof(float));
DataRow row_value;int y_value=0;
byte[] y_value_byte = new byte[2];
float finial_value;
for (int temp = 0; (temp < MAX_SHOW_LENGTH)&&(temp

相关推荐

我们经常会遇到这样的问题,从网页或文档中复制文字时,背景色也一并被复制了下来,使得粘贴后的文字难以阅读。那么,如何去掉复制粘贴文字的背景色,让文字更清晰、更易读呢?本文将为你详细解答。 复制粘贴文字的…

当年玩《暗黑破坏神2》最绝望的事是什么呢? 和BOSS拼命之前忘记放回城卷,结果被打死之后还要跑步去捡尸体,一个运气不好被路边一个杂兵又给干死了; 多死了几次之后脑袋一热退出游戏,这下好了,剩下一个没…

我的双胞胎宝宝去年3月出生,妹妹出生后第四天护理阿姨发现妹妹的尿不湿上面有些许血丝,告知护士医生后,妹妹就住进了新生儿科,直到第六天我和哥哥出院,妹妹都还不能出院。 出院后几天,医院打电话来让送母乳,…

爱他美奇迹系列在2020年面世,分别有澳洲版绿罐,以及香港版蓝罐、白罐,奇迹系列走的是高端路线,不少人来后台留言问:爱他美奇迹系列怎么样?有什么区别?哪个更值得买?下面,各位看完我的解读分析就会有答案…

点击右上角“关注”,每天获取职场经验、企业管理知识!轻课CEO,坚持无干货,不分享! 以前中国人称呼生意人的称呼很简单,就是老板。改革开放后,外国公司进入中国后,不但带来了新的经营理念,还带来了全新的…

俗话说“数量重于质量”。但 Dieline 奖 2023 年度最佳工作室得主每年都证明,事实上,您可以同时拥有精心设计的包装和众多奖项。年度最佳工作室颁发给在竞赛中所有类别中获得最多总体胜利的工作室、…

《指鹿为洋》番茄小说甜宠结局he,暗恋 mx 总裁在左手无名指上纹了字母sz 时常盯着发呆,他的朋友调侃着询问道“是女朋友吗?” 语气生成的回答道“不是女朋友,我还没有把她追到手。” 得知女孩要来自己…

【 爱情麻辣烫 】 导演: 张扬 编剧: 刘奋斗 / 刁亦男 / 蔡尚君 / 张扬 / 皮特·洛尔 主演: 高圆圆 / 徐静蕾 / 邵兵 / 濮存昕 / 吕丽萍 / 更多... 类型: 剧情 / 爱情…

马上4月份了,给大家推荐6个值得去的地方,希望你们能喜欢 一、云南.西双版-浪漫的边陲小城 这座边陲小城特别适合情侣闺蜜旅行,穿傣服,做傣妹,万人齐聚泼水狂欢 西双版纳旅游推荐景点 般若寺 很漂亮,最…

自用的TP-Link路由器好几年了,最近三天二头重启才能正常连接。正好手头上有台Buffalo WZR-HP-G450H无线路由器,正好可以替换掉老的TP-Link。 我的教程适合电脑小白和11、12…

《英雄联盟》S5赛季的季前赛如期来临,不少撸友闷头扎进了这场声势浩大的季前赛大军中。每年的LOL季前赛总会有很多的朋友疑惑季前赛的相关问题,比如为什么会有季前赛?我在季前赛中所打的所有比赛对我之后的正…

自从有了内置GPS(全球定位系统)的智能手机,普通人在城市,荒野穿行时不再迷路,如果您认为GPS的功能仅限于此,那就大错特错了。 GPS工作原理图 GPS系统由一组卫星组成,这些卫星将信号发送到地球表…

丹麦王国(丹麦语:Kongeriget Danmark;英语:The Kingdom of Denmark),简称丹麦(Denmark),北欧五国之一,是一个君主立宪国,拥有两个自治领地,法罗群岛和格…

在夸张版的 SmackDown 中,凯文欧文斯被揭露为 Team Brawling Brutes 的第五名成员,这让 The Bloodline 非常懊恼。 此外,Ricochet 和 Butch 获…

一旦宝宝发烧,很多父母都会担心宝宝“烧坏脑子”、“烧出肺炎”,但其实只要宝宝精神状态良好,温度在38.5℃以下,父母可不用过于担心,也不必急于吃药。 一般情况下,如果宝宝发烧不超过38.5℃,父母可以…

阳光,海岸,香车,美人…… 与敞篷跑车联系在一起的词汇总让人浮想联翩。 在普通人的印象里,敞篷跑车总是给人一种昂贵,且遥不可及的感觉。但事实真的如此吗? 根据权威媒体的测评,我们为你介绍四个类别的最佳…

最近,《权力的游戏》中“龙妈”的扮演者在社交平台发布自拍,竟然被一些网友骂又老又丑,年纪大了,全然没了年轻时的美貌。 互联网上因此展开了一场激烈的骂战,有人恶毒评价她的外貌,也有人维护她,双方你来我往…

"啊,我的电脑系统怎么又出故障了!!!"一听到这些长叹,韩博士就知道肯定是这位小伙伴的电脑出现故障问题了。对于这种经常性出现故障问题的小伙伴来说,重装系统应该已经算得上是家常便饭了。不过如果是第一次碰…

在日常生活中,我们经常需要将一些文件在不同设备上进行互传。今天我们主要来讲述两台电脑之间怎么互传文件,小编总结了3点,一起来看看吧! 第一、U盘/硬盘 U盘和硬盘是我们日常使用最多的外接储存设备,也是…

最新一期由佰草集冠名的《出发吧爱情》一向以高战斗值而突出的吴京谢楠夫妇,居然在花前月下上演了一场星月般的浪漫约会。身为武术冠军的吴京不如别的丈夫那般会弹着吉他唱歌送玫瑰,紧张得不能自已。遵循着做自己就…