范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

用C进行仪器控制系列数字万用表(4)

  此为"用C#进行仪器控制系列--数字万用表"的第4篇文章,在此之前已经编写了3篇相关文章了,可参见:
  1)用C#进行仪器控制系列——数字万用表(1):该篇文章介绍了如何从零开始创建一个控制台应用程序,实现 Keysight 数字万用表的电压测量,并将结果通过控制台展示;
  2)用C#进行仪器控制系列——数字万用表(2):该篇文章在第1篇文章的基础上,以窗体应用程序的形式重写了万用表电压测量程序,并能够自动识别仪器地址,以及能够通过按钮控制测量的开始和停止,电压的显示等。
  3)用C#进行仪器控制系列——数字万用表(3):该篇文章在第2篇文章的基础上,通过代码的简单优化,实现了不同测量类型的下拉选择,根据下拉选项执行对应类型的测量功能(电压、电流、电阻、二极管、导通、频率测试等)。
  此篇文章是在第3篇文章的基础上,添加波形图表显示功能。优化需求:添加波形图表显示功能,用以观测数据的变化趋势
  通过添加波形图表功能,将测量数据实时传递给波形图表,使其能够在界面中显示测量的历史数据,就可以观测到数据的变化趋势了。最终想要实现的效果如下图所示。
  需求实现效果优化实现过程
  1)窗体界面的优化从工具箱中找到 Visual Studio 自带的 Chart 图表控件,并将其拖拽至窗体面板中。
  Chart控件选中新添加的 Chart 控件,在其属性窗口中找到图表的"Series"属性,然后点击该属性右侧的3个小圆点组成的按钮进入"Series"属性设置页,如下图所示
  图表的"Series"属性修改数据序列的名称(Name)为"Data",修改图表类型(ChartType)为"Line",即修改图表类型为折线图显示。
  修改"Series"属性设置完图表属性后,调整窗体上相关控件的布局,调整后如下图所示。
  调整窗体布局
  2)代码优化
  主要涉及如下3块代码段的修改:在窗体的构造函数中增加曲线图样式的设置语句,包括曲线样式、曲线颜色的设置。public Form1()         {             InitializeComponent();              // 设置曲线图样式             WaveChart.Series[0].ChartType = SeriesChartType.Line;             WaveChart.Series[0].Color = System.Drawing.Color.Blue;         }在开始测试的事件响应代码段添加清除曲线代码,实现开始测试时重新绘图。if (btnStart.Text == "开始测试")                 {                     btnStart.Text = "停止测试";                      // 清空曲线图数据                     WaveChart.Series[0].Points.Clear();在测量线程代码段,增加将实时测量数据传递给波形图表的代码。// 循环读取万用表数据                 while (true)                 {                     // 发送采集命令                     messageBasedSession.WriteString(":READ?", true);                      // 读取返回值                     string response = messageBasedSession.ReadString();                      // 在控件和图表中输出结果                     this.Invoke((MethodInvoker)delegate                     {                         resultTextBox.Text = ChangeDataToD(response.Trim());                         WaveChart.Series[0].Points.AddY(double.Parse(resultTextBox.Text));                     });                 }优化效果验证
  程序优化后的运行效果如下图所示,可通过下拉选择测量类型,实现不同的测试需求,然后通过Text Box显示控件和Chart波形图表显示数据。
  运行效果
  通过验证,可以完美的实现测量需求。
  附:本文中涉及到的完整源代码using System; using System.Resources; using System.Windows.Forms; using Ivi.Visa.Interop; using System.Threading; using System.Linq.Expressions; using System.Windows.Forms.DataVisualization.Charting;  namespace WinForm_ComPorts {     public partial class Form1 : Form     {          private Ivi.Visa.Interop.ResourceManager resourceManager;         private FormattedIO488 messageBasedSession;         private Thread measurementThread;            public Form1()         {             InitializeComponent();              // 设置曲线图样式             WaveChart.Series[0].ChartType = SeriesChartType.Line;             WaveChart.Series[0].Color = System.Drawing.Color.Blue;         }           #region 端口号下拉选择框下拉事件响应代码         ///          /// 端口号下拉选择框下拉事件响应代码         ///          ///          ///          private void cboComPorts_DropDown(object sender, EventArgs e)         {             try             {                 // 清除下拉列表                 this.cboComPorts.Items.Clear();                 // 获取设备的所有串口资源                 string[] comNames = System.IO.Ports.SerialPort.GetPortNames();                 // 添加可用串口号到下拉框中                 foreach (string s in comNames)                 {                     this.cboComPorts.Items.Add(s);                 }                 // 创建VISA资源对象实例                 Ivi.Visa.Interop.ResourceManager rm = new Ivi.Visa.Interop.ResourceManager();                 // 获取设备的所有仪器资源                 string[] usbNames = rm.FindRsrc("?*INSTR");                 // 添加可用USB资源到下拉框中                 foreach (string s in usbNames)                 {                     if (s.Contains("0x"))                         this.cboComPorts.Items.Add(s);                 }             }              catch (Exception)             {                 MessageBox.Show("系统内不存在此类仪器~", "ERROR");             }         }         #endregion           #region 开始测试/停止测试按钮事件响应代码         ///          /// 开始测试/停止测试按钮事件响应代码         ///          ///          ///          private void btnStart_Click(object sender, EventArgs e)         {             try             {                 if (btnStart.Text == "开始测试")                 {                     btnStart.Text = "停止测试";                      // 清空曲线图数据                     WaveChart.Series[0].Points.Clear();                      // 创建ResourceManager和MessageBasedSession对象                     resourceManager = new Ivi.Visa.Interop.ResourceManager();                     messageBasedSession = new FormattedIO488();                      // 打开万用表连接,万用表的USB通讯地址通过端口号下拉列表的值传递过来                     messageBasedSession.IO = (IMessage)resourceManager.Open(cboComPorts.Text.ToString(), AccessMode.NO_LOCK, 5000, "");                      //获取测量类型,根据测量类型选择相应的采集指令                     string ConfigCommand = "";                     switch (cboMeasType.Text)                     {                         case "DC Voltage":                             ConfigCommand = ":CONF:VOLT:DC AUTO,DEF";                             break;                         case "AC Voltage":                             ConfigCommand = ":CONF:VOLT:AC AUTO,DEF";                             break;                         case "DC Current":                             ConfigCommand = ":CONF:CURR:DC AUTO,DEF";                             break;                         case "AC Current":                             ConfigCommand = ":CONF:CURR:AC AUTO,DEF";                             break;                         case "Resistance 2-wire":                             ConfigCommand = ":CONF:RES AUTO";                             break;                         case "Resistance 4-wire":                             ConfigCommand = ":CONF:FRES AUTO";                             break;                         case "Diode":                             ConfigCommand = ":CONF:DIOD";                             break;                         case "Continuity":                             ConfigCommand = ":CONF:CONT";                             break;                         case "Frequency":                             ConfigCommand = ":CONF:FREQ";                             break;                         default:                             ConfigCommand = ":CONF:VOLT:DC AUTO,DEF";                             break;                     }                      // 设置采集模式和测量范围                     messageBasedSession.WriteString(ConfigCommand, true);                      // 创建线程执行连续测量                     measurementThread = new Thread(new ThreadStart(MeasureThread));                     measurementThread.Start();                 }                 else                 {                     btnStart.Text = "开始测试";                      // 停止测量线程                     if (measurementThread != null && measurementThread.IsAlive)                     {                         measurementThread.Abort();                         measurementThread.Join();                     }                      // 关闭连接                     if (messageBasedSession != null)                     {                         messageBasedSession.IO.Close();                         // messageBasedSession.Dispose();                     }                      if (resourceManager != null)                     {                         // resourceManager.Dispose();                         // MessageBox.Show("资源释放");                     }                 }             }             catch (Exception ex)             {                 MessageBox.Show("发生错误:" + ex.Message);             }         }         #endregion           #region 测量线程代码         ///          /// 测量线程,读取万用表的数据,并将结果反馈至resultTextBox控件         ///          private void MeasureThread()         {             try             {                 // 循环读取万用表数据                 while (true)                 {                     // 发送采集命令                     messageBasedSession.WriteString(":READ?", true);                      // 读取返回值                     string response = messageBasedSession.ReadString();                      // 在控件和图表中输出结果                     this.Invoke((MethodInvoker)delegate                     {                         resultTextBox.Text = ChangeDataToD(response.Trim());                         WaveChart.Series[0].Points.AddY(double.Parse(resultTextBox.Text));                     });                 }             }              catch (ThreadAbortException)             {                 // 线程被中断                 // MessageBox.Show("线程被中断");                  // 查询错误                 messageBasedSession.WriteString(":SYST:ERR?");                 // 读取返回的错误信息                 string response = messageBasedSession.ReadString();                 // 若仪器返回了"-410"错误(读取万用表读数时被中断导致)或无错误,则忽略                 if (response.Contains("-410") || response.Contains("No error")) { }                 else                 {                     MessageBox.Show(response);                 }             }              catch (Exception ex)             {                 MessageBox.Show("发生错误:" + ex.Message);             }         }         #endregion           #region 数据显示格式转换代码         ///          /// 将科学计数法表示的字符串数据转换为double型数据显示格式         ///          ///          /// 返回double型数据格式的字符串         private string ChangeDataToD(string strData)         {             Double dData = 0.0;             if (strData.Contains("E"))             {                 dData = Double.Parse(strData);             }             return dData.ToString();          }         #endregion      } }

四川省21个小城市射洪远超雅安,峨眉山第14,广元位居第1四川省的整体实力位居全国前列。在2022的经济总量上,就是以56749。8亿元,位居全国6。大家在关注四川时,更多被新一线城市成都吸引,忽视了省内其它城市,尤其是四川省多达21个小数字经济城市发展百强榜单,哈尔滨排名第41,东北第三不能随意比较。虽然同为二线城市,但哈尔滨仍是副省级城市。现在虽然是瘦弱的骆驼,但是哈尔滨的GDP强于太原,说明哈尔滨的经济跟东北一起大幅下滑。正在上升,但要赶上哈尔滨并不容易。哈尔成渝城市群迎来新格局!两大城市引领,四川开始崛起在中国的版图上,陆续诞生了一个一个的城市群,这也是未来我国全面崛起的关键节点!十几年前,国家十一五规划中首次提出了把城市群作为推进城镇化的主体形态。根据最新的中国城市群地图集统计数浅谈文艺复兴时期的威尼斯特工局十六世纪的情报组织摘要与16世纪早期现代欧洲的统治者(及其对手)在不同地区建立的更基本的间谍网络相反,近代早期的威尼斯创建了一个非凡的中央组织的国家情报机构,即威尼斯特工局。它建立在严格的组织层次结李衙内背景真是硬,农民的孩子读此学校,毕业连搬砖的机会都没有昨天一整天,都被李衙内惊到了,他侵犯北京挂职女干部的事迹,瞬间传遍了大街小巷,大家在茶余饭后谈起此事后,除了对他胆大包天的事情愤怒外,还为他的行为感到百思不得其解。这么一个在国企和长辈照顾孩子千万要注意,这样做容易伤宝宝眼睛,近视眼就晚了随着电子产品的普及应用,手机平板电脑几乎是家家必备品。海量的趣味性资源无时无刻吸引人们的眼球,上至八十岁老太太下至一岁多的婴儿,都无法避免沉迷于精准推送的娱乐喜好,过度用眼成了当下孩子特别容易长龋齿,是不是忽略了这几个细节?育儿萌从长出第一颗乳牙开始,我就给她刷牙,一直到她2周岁,本着培养孩子从小独立的习惯,我开始让她尝试自己刷牙,并且也没有检查她刷的是否干净,结果大概过了3个月,她开始说牙疼,我们第多上舞台,提高孩子练琴积极性的好方法文俞倩如如何帮助孩子提高练琴积极性,似乎是所有琴童家长和教师都很关注和烦恼的问题。特别是在学琴的瓶颈期,孩子已经度过最初的新鲜劲,大多数人似乎都只是靠着日常的惯性和家长的严厉在逼迫5种疾病春季高发,中医有方帮助孩子养好气来源湖南日报湖南日报全媒体记者周倜最近,长沙市民邓女士家里的大宝小宝先后得了感冒,自己的嘴角也长了疱疹,家里真是乱成一团。打开妈妈群,发现不少人都在为自家宝宝最近容易生病这件事情烦世界上最年轻的母亲莉娜梅迪纳5岁时生下孩子1939年,在秘鲁一个偏远地区的小村庄,莉娜梅迪纳在5岁时成为历史学家认为的世界上最年轻的母亲。虽然难以相信,但医生确定,由于一种被称为性早熟的罕见病症,莉娜在身体上能够怀孕。围绕产检的时候好好的,怎么生出来是这样呢?别让无知害了孩子产检的时候都好好的,怎么生出来是这个样子?一个刚刚出生不到一天的宝宝很遗憾的被诊断了高位直肠闭锁,家长哭,医生叹息。有些畸形产检真的很难覆盖到,好在这个不算运气最差的,发现以后及时
随笔丨朱克俭边关复边关水洞沟骏马驰城摄边关复边关大西北小环游散记文朱克俭怒发冲冠凭栏处潇潇雨歇抬望眼仰天长啸壮怀激烈三十功名尘与土八千里路云和月驾长车踏破贺兰山缺记得那天朋友发来结伴邀约时,夫人问我去不去?我南平为啥搬迁建阳?给南平带了什么好处?2022年,延平的生产总值达450亿元,常年稳居南平第一,如果按照经济顺序排名,延平才是南平的老大。然而南平中心驻地,却在过去几十年间来回搬移建阳数次,如今连南平铁路,公路站点都改交广会客厅有一位美女网红,你愿意成为她的铁粉吗?元宵将至,在衡阳东站想快速换乘?看这里!,这条专业又不失趣味的铁路短视频来自一个叫做妤息的抖音账号。打开一瞧,账号已经有近四万的粉丝量,而里面除了有铁路常识的科普,还有不少业余时间东亚人为什么活得累?来自网络小说悟已往之不谏,知来者之可追。快三十岁了才意识到,我所受的教育中从来没有一条叫做尊重自己。轻生贱命,拥抱苦难通过书本,电视,生活,在几十年的时间里不断的重复给我打上难以磨输给裁判?老詹制胜一攻没有哨放任布朗加时赛吞苦果北京时间1月29日,202223赛季NBA常规赛继续进行,洛杉矶湖人客场迎来与波士顿凯尔特人的焦点大战。全场打完,湖人加时121125惜败凯尔特人,赛季遭遇对手的双杀。湖人这边,勒2023斯诺克单局限时赛沃克林夺冠五名中国球手进32强京报体育记者邓方佳北京时间1月29日凌晨,在英国莱斯特举行的2023年斯诺克单局限时赛落幕,克里斯沃克林轰出单杆119分,战胜莱克勒克夺冠,成为新科斯诺克排名赛冠军。此项赛事共有包德约30西西帕斯加冕澳网十冠,大满贯22冠追平纳达尔并列NO。1北京时间1月29日消息,2023赛季澳大利亚网球公开赛结束了男单决赛的争夺。塞尔维亚天王德约科维奇直落三盘以6376(4)76(5)击败希腊一哥西西帕斯,豪取赛会28连胜,第十次夺21!意甲领头羊狂飙86分钟绝杀罗马甩国米13分,穆帅无缘前四北京时间1月30日凌晨,意甲第20轮展开一场焦点大战,领头羊那不勒斯坐镇马拉多纳球场对阵排在第6的罗马。上半场,克瓦拉茨赫利亚助攻奥斯梅恩凌空爆射破门,金玟哉险些自摆乌龙。下半场,姆巴佩大伤!拉莫斯内马尔小伤!梅西心态炸裂!还怎么踢拜仁?姆巴佩伤缺一个月,拉莫斯内马尔正在进行伤检。最近的巴黎不知是不是风水出了问题,似乎一直在触霉头。先是煮熟的鸭子突然飞走(齐耶赫没买到),然后又是队内核心姆巴佩遭遇大伤,接着后防大将摊牌了,巴黎官宣两大坏消息!梅西很无奈,球迷又耽误球王巅峰大巴黎方面在世界杯结束之后,状态并不是很好,之前进了1平2负的低迷战绩。而且球队的伤病情况目前相当严重了,姆巴佩在上一场比赛膝盖受伤之后已经确定将会缺席三周比赛,无缘对阵拜仁的欧冠光期黑色四大矿山四季度季报简析来源光大期货研究所摘要一四大矿山四季度季报简析四季度铁矿石产量为8085。2万吨,环比减少9。9,同比减少1。下降主要由于SerraNorte的许可证延迟发放和S11D矿区尾矿废料