通讯中的编码问题
通讯中的编码问题这里的LIS接口通讯主要指的是串口(RS232)/网口(TCP或UDP)通讯,而串口或网口通讯中,我们经常会遇到乱码或结果解析错误的问题,那么我们应该怎样做才能避免这些问题呢? 首先我们要知道,想要开发接口特别是双工接口,首先要能读懂接口的通讯文档,而通讯文档中经常会有所使用通讯协议的介绍,流入ASTM、HL7。 而通讯协议一般都制定了编码字符集,比如ASCII、UTF-8、GBK等,虽然字符编码的概念是基础,我们都能理解,但是也不能确保顺利的开发出接口,我们还需要了解HEX、控制字符、校验等。 字符编码首先,字符编码(Character encoding)也称字集码,是把字符集中的字符编码为指定集合中某一对象(例如:比特模式、自然数序列、8位组或者电脉冲),以便文本在计算机中存储和通过通信网络的传递。 常见的例子包括将拉丁字母表编码成摩斯电码和ASCII。其中,ASCII将字母、数字和其它符号编号,并用7比特的二进制来表示这个整数。通常会额外使用一个扩充的比特,以便于以1个字节的方式存储。 ASCII码使用指定的7位或8位二进制数组合来表示128或25...
串口通讯调试与开发
工作中,LIS系统经常需要开发接口与仪器或流水线对接,串口通讯应该是最常见的几种通讯方式之一了。 至于串口是什么、串口通讯又是什么,这些基本概念就不多做介绍了。 这里就针对于我在串口开发中碰到过的一些问题,做一个简单的分享。 串口模拟无论是开发还是测试,肯定都离不开串口的模拟测试,我们不大可能直接在电脑上安装两个串口,所以模拟串口就是最优解了,从网上可以很轻松的搜索到模拟串口的软件。 这里我建议使用Virtual Serial Port Driver,大家可以搜索VSPD下载: 安装什么的就不过多解释了,安装完成后我们可以打开并添加模拟串口或者删除模拟的串口,界面如下: 如果对应的串口被使用,也可以从这里看出其串口的状态: 当然我们可以在我们的电脑中查看现有的串口,设备管理器中可以查看: 串口调试工具串口调试工具就是用于串口数据接收/发送的工具软件,比较简单易用的是“串口调试助手V2.2”。 但是使用中有几点需要注意: 偶尔会发生崩溃,这是串口调试工具的问题; 只能使用COM1-COM4这几个串口,有局限性; 与某些需要检测串口监听状态的仪器连接,虽然已经打...
如何修复损坏的SQLite数据库文件
最近处理过一个SQLite数据库因为未知原因损坏,无法进行数据操作的而导致软件无法正常使用的问题。 虽然工具软件是基于Code First开发,可以直接删除数据库来重新生成数据文件,但是因为里面存储了很多基本参数,运维人员认为重新设置这些参数比较麻烦,所以希望能够提供一个方案来修复已经损坏的数据库。 和运维沟通后将数据库文件导回,尝试跟踪问题。从网上查询到解决方案,这里简单做一个记录。 排查使用SQLite数据库管理工具SQLite Studio进行数据查询操作,访问正常,尝试直接删除某一个表的数据出现如下错误提示: 1[10:42:22] Error while executing SQL query on database 'data': database disk image is malformed 从网上查找如何排查错误,发现一个语句可以对SQLite数据库进行检测: 1PRAGMA integrity_check; 以上语句是执行整个库的完全性检查,会查看错序的记录、丢失的页,毁坏的索引等。 执行后我获得的信息是: 1234567891011...
Web下打印体验最好的打印控件LODOP
什么是LODOPLODOP是BS架构打印的解决方案,支持绝大多数浏览器,如果网站上有打印的需求,推荐使用该工具进行打印。 选择LODOP的原因不仅仅在于其对于web打印有着比原生打印更好的打印体验,主要是其还提供了丰富的API,让开发者可以访问打印任务的状态以及打印机的状态,设置打印机与打印输出的属性等等,让开发者可以通过这些实现更多的用户需求。 另外看了官网云打印,之前一直以为必须安装控件才能打印,所以应该是对于设备和系统有要求,但是目前来看也是不限制的,甚至可以使用移动端发送打印请求,但是我没有这方面的使用需求,这里仅仅讨论Windows平台下的打印使用经验。 官方网站:http://www.lodop.net/ LODOP安装使用在官网里下载中心中我们可以下载到打印控件(产品下载)与JS调用打印控件的API(技术手册),并且产品下载的内容包含测试的样例。 因为官方给的例子中已经有详细的安装以及使用说明,所以这里不做赘述,可以进入下载中心下载解压后直接查看样例,样例1就是安装以及基本的使用说明,其他的样例是一些常见的使用场景。 强烈建议加入售后群,LODOP的售后人员回答问题...
利用Jint在C#中运行JS脚本并实现简单计算器
关于JintJint是一个开源的JS脚本引擎,可以让我们在dotnet平台运行js代码,这使我们可以通过这一特性处理很多工作。 关于Jint的更多信息和用例可以参考:https://github.com/sebastienros/jint Jint的用途数学运算在日常工作中存在一个需求:用户自己定义表达式,系统根据表达式替换表达式中项目的数值,计算生成另外一个项目的结果。 例如:[GLO] = [TP] - [ALB],已知[TP]与[ALB]的结果,需要我们求出[GLO]的结果。 这个表达式初看其实很简单,但是实际业务中,可能存在多层级的嵌套甚至次幂/开根号/自然对数等的运算,这样如果通过程序来解析表达式进行运算工作量比较大。 过去程序设计是在Web端触发特定事件后通过正则替换表达式中参与运算项目为实际数值,使用eval函数执行表达式,获取结果并保存到数据库。但是随着系统不断升级,仅仅依靠前端来更新结果,在某些情况下不够人性化而且不能满足需求。 检索关于算术运算,网上普遍推荐的方案是: 使用数据库拼接SQL语句; 通过C#反射实现类似js的eval函数效果...
C#中实现简单爬虫项目
什么是爬虫爬虫即网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。 我们日常使用的搜索引擎、比价网站等都是通过爬虫技术获取数据,而后经数据提取、分析、优化后供用户使用。当然日常生活中,我们也可以使用爬虫技术,获取我们感兴趣的网站进行数据解析分析,做出来一些有意思的功能或小工具,比如新闻提醒、事项通知、资料整理等。 这方面我们需要了解的技术主要是:Http请求、XPath、正则等。以下是一个简单的例子,用于获取京东商城的数据,例子仅供学习。 抓取京东所有商品类别流程 分析京东商品类别页面 Chrome浏览器打开页面:https://www.jd.com/allsort.aspx 查看页面源代码 用XPath分析商品类别信息,包括分类ID、分类名、链接,XPath语法可参考:http://www.w3school.com.cn/xpath/xpath_syntax.asp 获取数据 使用 System.Net.WebRequ...
入手Kindle
“好读书”从小到大,自认为自己是一个不爱看书的人(网文除外),但是身为一个程序员,誓要向dalao看齐的人一直想培养一个良好的阅读习惯。 在工作的前期曾经购置了很多书,包括C#、JavaScript、Oracle的工具书还有一些名著、散文、豆瓣推荐等很多书,但是因为不方便携带,很多都在搬家的过程中遗失了,或者带回老家垫桌脚了。 从那以后,每次京东和当当有活动,都要纠结着要不要再剁手买几本,最后都忍了,因为这些书并不方便携带,而且选择困难症的我经常会纠结外出的时候带哪本书好。 “Kindle”软件Kindle其实已经流行了好多年,但是身边认识的小伙伴几乎没有上手过的,所以也只是听说,知道有个“墨水屏”的技术。 真正用Kindle,是因为之前在Telegram发现了一个群,每天都会分享一些好书。开始用一个PC版基于Python开发的阅读软件,但是体验不好,使用没多久就放弃了。后来想起来Kindle好像可以在PC或移动设备上安装,于是便下载体验了一下,不得不说——真香,在手机、平板、PC上都安装了Kindle的软件。 而在体验了一段时间,很正常的操作是,买了Kindle Unlimit...
23种设计模式与常用设计模式
设计模式设计模式设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。 目的是为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。 设计模式三大类型设计模式分为三种类型,共23类。 创建型模式:创建型模式用来处理对象的创建过程,单例模式、抽象工厂模式、建造者模式、工厂模式、原型模式。 结构型模式:结构型模式用来处理类或者对象的组合,适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。 行为型模式:行为型模式用来对类或对象怎样交互和怎样分配职责进行描述,模版方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式、访问者模式。 单例模式单例模式(Singleton Pattern)保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例。 实现方式饿汉式第一时间创建实例 123456789101112131415161718192021222324252627282930313233343536373839404142434445464...
设计模式六大原则
单一职责原则(Single Responsibility Principle 简称 :SRP) 定义:应该有且仅有一个原因引起类的变更。 接口的职责在设计时应该做到单一,降低类的复杂性,实现的职责都有明确的定义,提高了可读性、可维护性、可扩展性; 变更引起的风险降低,如果接口隔离性做的好,一个接口的修改只对相应实现类有影响,对其它接口没有影响,降低了耦合性。 单一职责提出了一个编写程序的标准,用“职责”或“变化原因”来衡量接口或类设计的是否优良,但是“职责”或“变化原因”都是不可度量的,因项目而异,因环境而异。 里氏替换原则(Liskov Substitution Principle 简称:LSP) 定义:是面向对象设计的基本原则之一,只要父类能出现的地方子类就能出现,而且替换为子类也不会产生任何错误或异常。 子类必须完全实现父类的方法 子类可以有自己的个性 覆盖或实现父类的方法时输入参数可以被放大 覆盖或实现父类的方法时输出结果可以被缩小 优点: 代码共享,减少创建类的工作量 提高代码的重用性 子类可以形似父类,但又异于父类 提高代码的可扩展性 提高产品或项目的开放性...
AOP 面向切面编程
AOP 面向切面编程与 OOP 面向对象编程的关系AOP(Aspect-Oriented Programming,面向方面编程),可以说是 OOP(Object-Oriented Programing ,面向对象编程)的补充和完善。 OOP 引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合。当我们需要为分散的对象引入公共行为的时候,OOP 则显得无能为力。也就是说, OOP 允许你定义从上到下的关系,但并不适合定义从左到右的关系。例如日志功能。日志代码往往水平地散布在所有对象层次中,而与它所散布到的对象的核心功能毫无关系。对于其他类型的代码,如安全性、异常处理和透明的持续性也是如此。这种散布在各处的无关的代码被称为横切(cross-cutting)代码,在 OOP 设计中,它导致了大量代码的重复,而不利于各个模块的重用。 而 AOP 技术则恰恰相反,它利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其名为“Aspect”,即方面。 所谓“方面”,简单地说,就是将那些与业务无关,却为...