首页
归档
友情链接
留言
更多
关于
动态
Search
1
[分享栈]centos7安装gcc10.2.0
7,077 阅读
2
[技术栈]CRC校验原理及C#代码实现CRC16、CRC32计算FCS校验码
6,701 阅读
3
[技术栈]C#利用Luhn算法(模10算法)对IMEI校验
6,314 阅读
4
[分享栈]esxi6.7虚拟机安装omv(openmediavault)教程
5,765 阅读
5
[分享栈]centos7安装python3.8.5
4,830 阅读
分享栈
技术栈
经验栈
登录
Search
标签搜索
C#
centos
winform
仪器
IPV4
IPV6
测速
crc
crc16
crc32
fcs
luhn
模10
算法
sql
gcc
python
紫光展锐
omv
openmediavault
武小栈
累计撰写
21
篇文章
累计收到
37
条评论
首页
栏目
分享栈
技术栈
经验栈
页面
归档
友情链接
留言
关于
动态
搜索到
2
篇与
的结果
2020-06-22
[经验栈]C#与泰克示波器(Tektronix oscilloscope)MSO64通信操作
1、前言此次需要用到工具操作示波器动态配置和检验数据,下面为此次开发的一些总结记录。按理说这里应该用泰克(tektronix)提供的示波器(oscilloscope)驱动和API,但是我没有找到泰克提供的.NET版本的API,我又不是特别熟悉C封装到C#的开发,所以干脆使用了NI-VISA .NET,可能是没有使用到特殊驱动部分,使用并没有出现异常。2、安装环境1、NI-VISA3、C#代码using System; using System.Collections.Generic; using Ivi.Visa; using NationalInstruments.Visa; namespace VisaInstruments { public class NiVisaInstrumentsAPIs { private MessageBasedSession mbSession; private IVisaAsyncResult asyncHandle = null; public void FindResources(string filter) { using (var rm = new ResourceManager()) { try { IEnumerable<string> resources = rm.Find(filter); foreach (string s in resources) { //可以根据ParseResult查询出硬件类型,如Custom,Gpib,Serial,Usb等 //ParseResult parseResult = rm.Parse(s); //HardwareInterfaceType hardwareType = parseResult.InterfaceType; } } catch (Exception ex) { //处理错误 } } } public bool OpenInstrument(string address) { try { using (var rmSession = new ResourceManager()) { mbSession = (MessageBasedSession)rmSession.Open(address); //mbSession.SynchronizeCallbacks = true;使用异步方法需设SynchronizeCallbacks为true return true; } } catch (Exception exp) { return false; } } public void Write(string s) { mbSession.RawIO.Write(ReplaceCommonEscapeSequences(s)); } public string Read() { return InsertCommonEscapeSequences(mbSession.RawIO.ReadString()); } public void WriteAsync(string s) { try { string textToWrite = ReplaceCommonEscapeSequences(s); asyncHandle = mbSession.RawIO.BeginWrite( textToWrite, new VisaAsyncCallback(OnWriteComplete), (object)textToWrite.Length); } catch (Exception exp) { } } private void OnWriteComplete(IVisaAsyncResult result) { try { mbSession.RawIO.EndWrite(result); // "Success"; } catch (Exception exp) { } } public void ReadAsync() { try { asyncHandle = mbSession.RawIO.BeginRead( 1024, new VisaAsyncCallback(OnReadComplete), null); } catch (Exception exp) { } } private void OnReadComplete(IVisaAsyncResult result) { try { string responseString = mbSession.RawIO.EndReadString(result); string info = InsertCommonEscapeSequences(responseString); } catch (Exception exp) { } } public void AbortRW() { try { mbSession.RawIO.AbortAsyncOperation(asyncHandle); } catch (Exception exp) { } } private string ReplaceCommonEscapeSequences(string s) { return (s != null) ? s.Replace("\\n", "\n").Replace("\\r", "\r") : s; } private string InsertCommonEscapeSequences(string s) { return (s != null) ? s.Replace("\n", "\\n").Replace("\r", "\\r") : s; } } }4、实体按钮对应指令重新设置参数 --- *RST 前面板Autoset按钮 ---- AUTOSet EXECute 前面板通道1,2,3,4按钮 --- DISplay:GLObal:CH1:STATE on ACQUIRE:STOPAFTER RUNSTOP 前面板Single/Seq按钮 --- ACQUIRE:STOPAFTER SEQuence 前面板放大镜按钮 --- DISplay:WAVEView1:ZOOM:ZOOM1:STATe ON 前面板Default setup按钮 --- FACtory 需要先执行此条命令解锁命令操作旋钮 HORIZONTAL:DELAY:MODE ON 前面板HORizontal区域position旋钮 -- HORizontal:DELay:TIME 0.3 前面板HORizontal区域scale旋钮 HORIZONTAL:MODE:SCALE 0.5e-3 HORIZONTAL:MODE:SCALE? 前面板vertical区域scale旋钮 CH1:SCAle 100E-2 前面板vertical区域position旋钮 CH2:POSition -2.0 前面板touch off按钮 --- TOUCHSCReen:STATe OFF 前面板trigger区域force按钮 --- TRIGGER FORCE 前面板trigger区域mode按钮 --- TRIGger:A:MODe {AUTO|NORMal} 前面板A,B旋钮 --- TRIGger:{A|B|B:RESET}5、简单测量参数指令//设定读取通道和参数 MEASUREMENT:MEAS1:TYPE AMPLITUDE MEASUREMENT:MEAS1:SOURCE CH1 //读取信息 MEASUREMENT:MEAS1:RESUlts:CURRentacq:MEAN? //删除测试信息 MEASUREMENT:DELETE "MEAS1" //截屏 SAVE:IMAGE "C:/Dut12–tests.png" //可测参数列表 MEASUrement:MEAS<x>:TYPe {ACCOMMONMODE|ACRMS|AMPlITUDE|AREA|BASE|BITAMPLITUDE|BITHIGH|BITLOW|BURSTWIDTH|COMMONMODE|DATARATE|DCD|DDJ|DDRAOS|DDRAOSPERTCK|DDRAOSPERUI|DDRAUS|DDRAUSPERTCK|DDRAUSPERUI|DDRHOLDDIFF|DDRSETUPDIFF|DDRTCHABS|DDRTCHAVERAGE|DDRTCKAVERAGE|DDRTCLABS|DDRTCLAVERAGE|DDRTERRMN|DDRTERRN|DDRTJITCC|DDRTJITDUTY|DDRTJITPER|DDRTPST|DDRTRPRE|DDRTWPRE|DDRVIXAC|DDRTDQSCK|DELAY|DJ|DJDIRAC|DPMOVERSHOOT|DPMUNDERSHOOT|DPMRIPPLE|DPMTURNOFFTIME|DPMTURNONTIME|EYEHIGH|EYELOW|FALLSLEWRATE|FAHIGH|HEIGHT|HEIGHTBER|HIGHTIME|HOLD|JITTERSUMMARY|J2|J9|LOW|LOWTIME|MAXIMUM|MEAN|MINIMUM|NDUtY|NPERIOD|NPJ|NOVERSHOOT|NWIDTH|PDUTTY|PERIOD|PHASE|PHASENOISE|PJ|PK2Pk|POVERSHOOT|PWIDTH|QFACTOR|RISESLEWRATE|RISETIME|RJ|RJDIRAC|RMS|SRJ|SSCFREQDEV|SSCMODRATE|SETUP|SKEW|TIE|TIMEOUTSIDELEVEL|TJBER|TNTRATIO|TOP|UNITINTERVAL|VDIFFXOVR|WIDTH|WIDTHBER|}6、简单的GPIO测试用例//设置垂直刻度为300mv CH1:SCAle 300E-3 //位置为-3div CH1:POSition -3.0 //耦合为DC CH1:COUPLING DC //设置水平刻度为20ms HORIZONTAL:MODE:SCALE 20e-3 //打开采集 ACQUIRE:STATE ON //测量最大电压 MEASUREMENT:MEAS1:TYPE MAXIMUM MEASUREMENT:MEAS1:SOURCE CH1 //测量最小电压 MEASUREMENT:MEAS2:TYPE MINIMUM MEASUREMENT:MEAS2:SOURCE CH1 //测量高值 MEASUREMENT:MEAS3:TYPE TOP MEASUREMENT:MEAS3:SOURCE CH1 //测量低值 MEASUREMENT:MEAS4:TYPE BASE MEASUREMENT:MEAS4:SOURCE CH1 //停止采集 ACQUIRE:STATE OFF //设置标签 CH1:LABEL:NAME "GPIO1HIGH" //截屏 SAVE:IMAGE "G:/GPIO1HIGH.png"参考资料4, 5, 6 Series MSO (MSO44, MSO46, MSO54, MSO56, MSO58, MSO58LP, MSO64, LPD64) Programmer ManualTEKVISA Connectivity Software - V4.2.0
2020年06月22日
1,631 阅读
2 评论
0 点赞
2020-06-18
[经验栈]C#监测IPv4v6网速及流量
1、前言 最近做项目需要用到监测网速及流量,我经过百度和墙内谷歌都没能快速发现监测IPV6流量和网速的用例;也经过自己的一番查询和调试,浪费了不少时间,现在作为经验分享出来希望大家指正。2、C#代码using System.Net.NetworkInformation; using System.Timers; namespace Monitor { public class MonitorNetwork { public string UpSpeed { get; set; } public string DownSpeed { get; set; } public string AllTraffic { get; set; } private string NetCardDescription { get; set; } //建立连接时上传的数据量 private long BaseTraffic { get; set; } private long OldUp { get; set; } private long OldDown { get; set; } private NetworkInterface networkInterface { get; set; } private Timer timer = new Timer() { Interval = 1000 }; public void Close() { timer.Stop(); } public MonitorNetwork(string netCardDescription) { timer.Elapsed += Timer_Elapsed; NetCardDescription = netCardDescription; timer.Interval = 1000; } public bool Start() { networkInterface = null; NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces(); foreach (var var in nics) { if (var.Description.Contains(NetCardDescription)) { networkInterface = var; break; } } if (networkInterface == null) { return false; } else { BaseTraffic = (networkInterface.GetIPStatistics().BytesSent + networkInterface.GetIPStatistics().BytesReceived); OldUp = networkInterface.GetIPStatistics().BytesSent; OldDown = networkInterface.GetIPStatistics().BytesReceived; timer.Start(); return true; } } private string[] units = new string[] {"KB/s","MB/s","GB/s" }; private void CalcUpSpeed() { long nowValue = networkInterface.GetIPStatistics().BytesSent; int num = 0; double value = (nowValue - OldUp) / 1024.0; while (value > 1023) { value = (value / 1024.0); num++; } UpSpeed = value.ToString("0.0") + units[num]; OldUp = nowValue; } private void CalcDownSpeed() { long nowValue = networkInterface.GetIPStatistics().BytesReceived; int num = 0; double value = (nowValue - OldDown) / 1024.0; while (value > 1023) { value = (value / 1024.0); num++; } DownSpeed = value.ToString("0.0") + units[num]; OldDown = nowValue; } private string[] unitAlls = new string[] { "KB", "MB", "GB" ,"TB"}; private void CalcAllTraffic() { long nowValue = OldDown+OldUp; int num = 0; double value = (nowValue- BaseTraffic) / 1024.0; while (value > 1023) { value = (value / 1024.0); num++; } AllTraffic = value.ToString("0.0") + unitAlls[num]; } private void Timer_Elapsed(object sender, ElapsedEventArgs e) { CalcUpSpeed(); CalcDownSpeed(); CalcAllTraffic(); } } } 3、胡说八道 虽然没能直接快速地百度到方法,但是实现这个需求的时候,心里是有个谱,Windows系统能监测到这个网速和流量,没理由实现不了,只需要一个方法将这个信息读取出来就好。最后实现这个需求是利用了System.Net.NetworkInformation这个程序集,但是这个程序集没有只接提供网速监测的方法,而是提供了接收和发送数据量的属性,需要自己计算出即使网速,所以这个网速不是特别的准确。 这个程序集其实一开始就看到了,前辈方法中使用的是IPv4InterfaceStatistics类中的BytesReceived属性和BytesSent属性实现的,但是在这个程序集里没有对应的IPv6类,恍恍惚惚。 然后呢,我就下意识以为这个程序集比较老旧,不支持IPv6统计信息读取,然后也是各种搜索无果,之后呢不死心想再来研究研究,东点点西瞅瞅,然后在NetworkInterface 类中发现了一个GetIPStatistics()方法,它的描述是“获取此 NetworkInterface 实例的 IP 统计信息。”。 然后就顺理成章的事了,根据GetIPStatistics()返回的IPInterfaceStatistics实例中的BytesReceived属性和BytesSent属性就能获取到收发的数据总量,然后根据这个信息就能计算出大约的网速。 经测试,利用IPInterfaceStatistics实例是能读取到IPv4和IPv6的总数据量的,因为这次的需求就是监测总量,如果需要单独监测IPv6的可以用总量减去IPv4部分。4、后记 老师以前喊我认真念书,我心想有百度还不够吗,再念能有百度聪明,有百度懂得多,后来渐渐明白,百度懂得多都是前辈的搬砖添瓦来的,共勉。参考资料 System.Net.NetworkInformation 命名空间
2020年06月18日
2,290 阅读
2 评论
0 点赞