首页
归档
友情链接
留言
更多
关于
动态
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
条评论
首页
栏目
分享栈
技术栈
经验栈
页面
归档
友情链接
留言
关于
动态
搜索到
8
篇与
的结果
2021-01-29
[分享栈]iview中按需引用组件List、ListItem、ListItemMeta报错
1.前言今天武小栈在用iview时遇到了一个引用错误,Module not found: Error: Can't resolve 'view-design/src/components/list-item' ,折腾了许久之后终于得以解决,其实是一个小问题。2.正文先看编译时的报错情况:提示需要安装这个包,我就想是不是用cli导入的包太老了,不包含这个组件,当我使用npm命令安装最新包的时候依然报这个错误,百度也是无果,只能看下源码了,打开工程目录node_modules\view-design\src\components\list下的index.js文件可以看到:这下恍然大悟,原来listitem已经被包含到了list组件里面。只需要这样引用即可。3.后记如果对你有帮助,别忘了收藏iview中按需引用组件List、ListItem、ListItemMeta
2021年01月29日
1,029 阅读
0 评论
0 点赞
2020-08-03
[经验栈]centos7下编译紫光展锐UIS891xDM平台固件
1、前言最近项目需要在centos系统下编译紫光展锐平台的sdk,但是频频报错,而且错误提示也很有误导性,导致一直不得其真谛,武小栈今天分析一下关于这次环境搭建的记录。2、正文编程指南里面提供了linux环境编译命令和需求,在ubuntu16.04中只需要安装python3即可实现命令编译。前提:项目工程源码在windows环境中编译通过。第一次,在centos7中安装python3,尝试编译,编译失败,提示缺少配置文件。怀疑文件读写权限导致文件读写失败,换成root用户,并给项目文件所有权限。第二次,在centos7中编译失败,提示缺少配置文件。手动复制配置文件到指定文件夹。第三次,在centos7中编译失败,提示缺少ninja。安装ninja。第四次,在centos7中编译失败,提示ninja配置文件缺失。第五次,在ubuntu16.04中编译,提示文件格式不正确,利用fromdos将shell脚本全转换一遍,编译成功。...第N次,安装gcc10.2.0,编译成功。3、centos7编译环境搭建1、安装高版本gcc,可以安装gcc10.2.0,安装方法参考链接:centos7安装gcc10.2.0。2、安装python3,不用将默认版本python2.7.5替换成python3,安装方法参考链接:centos7安装python3.8.5。3、使用root权限运行编译指令。4、后记在ubuntu16.04中的默认gcc版本为5.4.0,在centos7.6中默认gcc版本为4.8.5。这个问题一直没解决的根源仅此而已,长期开发windows平台软件,还是缺少对linux的理解,今后要加强了。参考资料UIS891xDM_Programming_Guide-1.1.pdf(来源CSDN,请自行查看,如果没有积分也可以留言)
2020年08月03日
3,853 阅读
3 评论
0 点赞
2020-07-17
[经验栈]Typecho升级(upgrade)失败Database Query Error
1前言昨天武小栈把typecho从正式版升级到开发版就遇到了Database Query Error错误,详情是SQLSTATE[HY000]: General error: 1 no such table: typecho_metas,经过查看数据库后发现是升级的时候metas表被程序删掉了,顺着这个一步一步将问题解决。2正文2.1将网站备份登陆网站后台,依次控制台--备份--开始备份,此时会下载一个扩展名为.dat的备份文件,将文件保存的本地。2.2下载升级文件下载typecho开发版,按照升级步骤操作,如果此时我们登陆后台去完成升级,此时会出现两个错误,如下图。2.3重建站点此时需要将网站目录下config.inc.php文件删除,然后登陆站点会重新引导安装,根据步骤安装即可。2.4恢复站点登陆网站后台,依次控制台--备份,然后选择右侧的选择文件,选择之前备份的.dat文件,然后点击上传并恢复,然后等待恢复成功就大功告成了。
2020年07月17日
3,182 阅读
0 评论
0 点赞
2020-07-13
[经验栈]C#中几种定时器(timer)的区别
[TOC]1、前言 不知道你是否对.NET里面的定时器产生过一些疑问,以下是武小栈个人的一些总结。2、官方介绍在.NET的框架之内定时器有四种,先看一下微软官方对他们各自特点介绍:System.Timers.Timer,它将触发事件,并定期在一个或多个事件接收器中执行代码。 类旨在用作多线程环境中基于服务器的组件或服务组件;它没有用户界面,在运行时不可见。System.Threading.Timer,它按固定的时间间隔对线程池线程执行单个回调方法。 回调方法是在实例化计时器时定义的,无法更改。 与 System.Timers.Timer 类一样,此类用作多线程环境中基于服务器的或服务组件;它没有用户界面,在运行时不可见。System.Windows.Forms.Timer (仅 .NET Framework),这是一个触发事件并定期在一个或多个事件接收器中执行代码的 Windows 窗体组件。 组件没有用户界面,旨在在单线程环境中使用;它在 UI 线程上执行。System.Web.UI.Timer (仅 .NET Framework),是一种定期执行异步或同步网页回发的 ASP.NET 组件。再看看微软对开发者的使用建议:System.Threading.Timer 是一种简单的轻型计时器,它使用回调方法,并由线程池线程提供服务。 不建议与 Windows 窗体一起使用,因为它的回调不会在用户界面线程上发生。 System.Windows.Forms.Timer 是用于 Windows 窗体的更好选择。 对于基于服务器的计时器功能,您可以考虑使用 System.Timers.Timer,这会引发事件并具有其他功能。3、个人体会System.Threading.Timer Class是一个基础类,使用起来不是太好用,各种用法较为原始,用的较少。System.Windows.Forms.Timer Class第一次接触的就是它,毕竟直接winform拖下来就行了,用的还是比较多,我通常用在运行一些刷新界面的代码,这些代码通常不会有什么逻辑运算,比如界面上需要显示一个倒计时。在这个类使用中我遇到过两个疑惑,作为分享:Q1:Tick实践会创建新线程执行吗?A1:不会创建新的线程,始终在主线程里面运行Tick事件;Q2:定时器会start()瞬间触发一次,还是等待Interval间隔后再触发?A2:等待Interval间隔后再触发。Q3:定时器start()和stop()时候Interval会累积吗?A3:不累积,每次start()重新计时。Q4:如果Tick事件内的代码未执行完成,但是下一次Tick定时已经达到会发生什么?A4:不会强行终止未完成的代码,也不会因为上一次Tick事件代码未执行完成而不再触发,而是类似于栈的形式将之前未执行完成的代码堆积,后触发的Tick事件内的代码先执行,先触发未完成的代码后执行,具体可以看下面示例。 public Form1() { InitializeComponent(); timerForm.Tick += TimerForm_Tick; } private int num = 1;//一个序号,表示当前第几次进入Tick事件 private int rowNum = 1;//一个全局的行号,记录一下总共AppendText多少次 private void TimerForm_Tick(object sender, EventArgs e) { string s = $"我是第{num++}次"; for (int i = 0; i < 5; i++) { textBox1.AppendText($"{rowNum++} {s} 序号i={i} 当前线程ID={Thread.CurrentThread.ManagedThreadId.ToString()} \r\n"); Delay(1000); } } private Timer timerForm = new Timer(){Interval = 1000}; private void button1_Click(object sender, EventArgs e) { textBox1.AppendText("button " + Thread.CurrentThread.ManagedThreadId.ToString() + "\r\n"); timerForm.Start(); } public static void Delay(int mimillisecond) { int start = Environment.TickCount; while (Math.Abs(Environment.TickCount - start) < mimillisecond) { System.Windows.Forms.Application.DoEvents(); } }System.Timers.Timer Class 是对System.Threading.Timer的一层封装,都是通过委托方法TimerCallback进行回调触发定时器事件,可以先看看System.Timers.Timer的代码实现方式: if (!value) { if (this.timer != null) { this.cookie = (object) null; this.timer.Dispose(); this.timer = (System.Threading.Timer) null; } this.enabled = value; } else { this.enabled = value; if (this.timer == null) { if (this.disposed) throw new ObjectDisposedException(this.GetType().Name); int dueTime = (int) Math.Ceiling(this.interval); this.cookie = new object(); this.timer = new System.Threading.Timer(this.callback, this.cookie, dueTime, this.autoReset ? dueTime : -1); } else this.UpdateTimer(); }不过 System.Threading.Timer的属性和方法都更加友善,我通常在使用中不设计更新界面,都会使用这个定时器类,有一点要说明的是,将SynchronizingObject属性赋值到控件后,事件中代码会在控件上委托调用,如timer.SynchronizingObject = this;可以看下System.Timers.Timer内部是如何实现的。if (elapsedEventHandler != null) { if (this.SynchronizingObject != null && this.SynchronizingObject.InvokeRequired) { this.SynchronizingObject.BeginInvoke(elapsedEventHandler, new object[] { this, elapsedEventArgs }); } else { elapsedEventHandler(this, elapsedEventArgs); } } 虽然System.Timers.Timer定时器理论上是不受单线程限制,可以短时间内触发多次,但是实际上会受到线程池的限制,先看巨硬对于此的说明:如果 nullSynchronizingObject 属性,则在 ThreadPool 线程上引发 Elapsed 事件。 如果 Elapsed 事件的处理持续时间超过 Interval,则可能会在其他 ThreadPool 线程上再次引发该事件。 在这种情况下,事件处理程序应该是可重入的。1、当SynchronizingObject不为null,将在指定的对象线程上触发事件,为单线程触发,与System.Windows.Forms.Timer执行方式相同;2、当SynchronizingObject不为null时将在线程池(ThreadPool)上引发事件,执行事件内的代码。理论上可以重复载入,但是会受到ThreadPool线程数限制,比如ThreadPool.SetMaxThreads(8, 8),那么定时器触发事件只能同时载入8次;4、后记我现在用定时器基本上都是用System.Timers.Timer,在我看来System.Timers.Timer可以用SynchronizingObject属性实现在主线程运行,也可以不设置SynchronizingObject属性,是事件在线程池里触发,作为后台线程使用,基本能满足我在开发中的使用需求。参考资料System.Timers NamespaceSystem.Windows.FormsSystem.Threading.ThreadPool Class
2020年07月13日
1,279 阅读
2 评论
0 点赞
2020-06-23
[经验栈]C#与是德科技信号发生器(Keysight RF Signal Generators)N9310A通信操作
[TOC]1、前言这次使用的仪器是是德科技(keysight)的射频信号发生器,型号为N9310A,来一张正面照。2、C#代码2.1 参考C#与泰克示波器(Tektronix oscilloscope)通信操作中C#代码;2.2 可以用是德科技提供的通信代码;环境:IO 程序库套件项目-引用-添加-程序集-Keysight.Visausing System; using Ivi.Visa; using Keysight.Visa; namespace IdnSample { class IdnSample { static void Main(string[] args) { GpibSession session = new GpibSession ("MyInstr", Ivi.Visa.AccessModes.None, 2000); try { IMessageBasedFormattedIO io = session.FormattedIO; io.PrintfAndFlush("*IDN?");//发送查询设备指令 string[] response = new string[] { "", "", "", "" }; io.Scanf("%,s", out response);//读取信息,以逗号或空格划分字符串 Console.WriteLine("Manufacturer: {0}", response[0]); Console.WriteLine("Instrument Model: {0}", response[1].TrimEnd(new char[] {'\n'})); if (response.Length > 2) { Console.WriteLine("Firmware Revision: {0}", response[2].TrimEnd(new char[] {'\n'})); } if (response.Length > 3) { Console.WriteLine("Serial Number: {0}", response[3].TrimEnd(new char[] {'\n'})); } } catch { Console.WriteLine("*IDN? query failed"); } finally { ession.Dispose(); session = null; } Console.WriteLine("Press any key to end..."); Console.ReadKey(); } } }2.3 使用Ivi.Visa.Interop类;using System; using Ivi.Visa.Interop; namespace HardwareAutomation { public class IviVisaInteropInstrumentsAPIs { FormattedIO488 instrument = new FormattedIO488(); ResourceManager rm = new ResourceManager(); public void Set(string usbAddress, int timeOut) { instrument.IO = (IMessage)rm.Open(usbAddress, AccessMode.NO_LOCK, 0, ""); instrument.IO.TerminationCharacterEnabled = true; instrument.IO.Timeout = timeOut; } public void Write(string WriteStr) { instrument.WriteString(WriteStr, true); } public string Read() { try { return instrument.ReadString(); } catch (Exception e) { //Console.WriteLine(e); //throw; return ""; } } } }3、简单指令:SYSTem:DATE? //查询日期,用于确认信号发生器是否连接正常 :FREQuency:CW 5 MHz //设置频率为5MHz :FREQuency:CW? //查询频率 :AMPLitude:CW 5 dBm //设置幅度为5dbm :RFOutput:STATe ON //打开射频输出 :AM:STATe ON //打开调幅模式 :AM:DEPTh 5 //设置调幅深度 :AM:SOURce EXT //设置调幅源为外部 :MOD:STATe ON //使能设置 :FM:STATe ON //打开调频模式 :FM:DEViation 5 KHz //设置调频偏差为5KHz :FM:SOURce EXT //设置调频源为外部 :MOD:STATe ON //使能设置 :PULM:STATe ON //打开脉冲模式 :PULM:SOURce EXT //设置脉冲源为外部 :MOD:STATe ON //使能设置参考资料N9310A User's GuideKeysight VISA.NET Help(C:\Program Files\ (x86)\Keysight\IO Libraries Suite\VisaNet.chm)
2020年06月23日
2,460 阅读
4 评论
0 点赞
1
2