C#调用硬件设备开发流程
项目开发中遇到了需要调用硬件设备读取卡片信息的需求
项目开发中遇到了需要调用硬件设备读取卡片信息的需求,由于是第一次接触这种设计调试硬件的开发需求,因此一路磕磕绊绊,最后总算完成了任务,在此梳理记录下完整的开发流程。
注:需要有硬件相关的开发文档与 ***.dll 动态库文件
—————————————————————————————————————————————
在代码开发前需要先学习了解清楚此硬件设备提供的动态库文件中都设计到哪些接口,每个接口的作用都是什么,具体的硬件开发流程又是怎样的。
然后再代码中通过"DllImport"将对应的动态库接口一一定义(需要using System.Runtime.InteropServices),首先需要定义系统自带 “kernel32” 库的加载库函数方法"LoadLibrary"(“LoadLibrary”方法的入参“strDllName”就是需要加载的动态库 ***.dll文件的路径加名称),然后再定义硬件动态库接口函数,以读卡设备的打开串口接口(CommOpen)为例:
/// <summary>
/// 加载库函数
/// </summary>
/// <param name="strDllName"></param>
/// <returns></returns>
[DllImport("kernel32", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Auto, SetLastError = true)]
public static extern int LoadLibrary(string strDllName);//打开串口
[DllImport("CRT_310.dll")]
public static extern UInt32 CommOpen(string port);
然后在代码对应模块先加载库函数,加载成功后再调用对应的接口即可,代码如下所示:
/// <summary>/// 就诊卡读卡/// </summary>/// <returns></returns>public VisitCardInfo CRTReader(){VisitCardInfo visitCardInfo = new VisitCardInfo();UInt32 Hdle = 0; // 门诊卡读卡器串口号字符串try{VisitCard visitCard_Data = new VisitCard();int nRet = CRT310.LoadLibrary("CRT_310.dll");if (nRet == 0){WriteLog.writeLog("CRT_310: 未找到CRT_310.dll文件!", "");visitCardInfo.msg = "CRT_310:未找到CRT_310.dll文件!";visitCardInfo.code = -1;return visitCardInfo;}else{// 1.串口初始化, 打开串口Hdle = CRT310.CommOpen("COM1");if (Hdle == 0){// 串口打开失败,直接返回错误WriteLog.writeLog("CRT_310: 串口打开失败, 串口号:", Hdle.ToString());visitCardInfo.msg = "CRT_310:串口打开失败";visitCardInfo.code = -1;return visitCardInfo;}WriteLog.writeLog("CRT_310: 串口打开成功, 串口号:", Hdle.ToString());// 初始化 1扇区 0块 RF_InitValueCmdRFInitValue(0x01, 0x00, out string msg, Hdle);if (!string.IsNullOrEmpty(msg)){// 初始化失败WriteLog.writeLog("CRT_310: 初始化失败! 错误信息为:", msg);visitCardInfo.msg = "CRT_310:" + msg;visitCardInfo.code = -1;CRT310.CommClose(Hdle);return visitCardInfo;}// 检查是否是M1卡片,int res = RF_DetectCard(Hdle);if (res == -1){WriteLog.writeLog("CRT_310: 检查是否是M1卡片失败,串口号为0!:", "");visitCardInfo.msg = "CRT_310:检查是否是M1卡片失败,串口号为0!";visitCardInfo.code = -1;CRT310.CommClose(Hdle);return visitCardInfo;}else if (res != 0){// 返回对应具体错误 (0X4E) 寻卡不成功 (0X45) 卡机内无卡 (0X57) 卡不在允许操作的位置上。if (res == 0x4e){visitCardInfo.msg = "CRT_310:寻卡不成功!";}else if (res == 0x45){visitCardInfo.msg = "CRT_310:卡机内无卡!";}else if (res == 0x57){visitCardInfo.msg = "CRT_310:卡不在允许操作的位置上!";}WriteLog.writeLog("CRT_310: 检查是否是M1卡片失败,对应的错误码为:", res.ToString());visitCardInfo.code = -1;CRT310.CommClose(Hdle);return visitCardInfo;}WriteLog.writeLog("CRT_310: 开始验证密码!", "");// 验证扇区密码int keyResult = RF_LoadSecKey(Hdle);if (keyResult != 0){// 密码验证失败,返回错误码WriteLog.writeLog("CRT_310: 密码验证失败,对应的错误码为:", keyResult.ToString());visitCardInfo.msg = "CRT_310: 验证扇区密码失败!";visitCardInfo.code = -1;CRT310.CommClose(Hdle);return visitCardInfo;}// 读取卡号 卡号存储在 01扇区 00块int resCode = RFReadBlock(1, 0, out string StrBuf,Hdle);if (resCode != 0){// 读卡失败WriteLog.writeLog("CRT_310: 读取卡号失败,错误信息为:", StrBuf);visitCardInfo.msg = "CRT_310:读取卡号失败!";visitCardInfo.code = -1;CRT310.CommClose(Hdle);return visitCardInfo;}else{// 返回卡号WriteLog.writeLog("CRT_310: 读取卡号成功,就诊卡卡号为:", StrBuf);visitCard_Data.ID = StrBuf;visitCardInfo.msg = "CRT_310:读卡成功!";visitCardInfo.code = 0;visitCardInfo.data = visitCard_Data;visitCardInfo.totalNumber = 1;CRT310.CommClose(Hdle);return visitCardInfo;}}}catch (Exception ex){WriteLog.writeLog("CRT_310: 读取卡片信息出错!错误信息为:", ex.Message.ToString());visitCardInfo.msg = "CRT_310:读取卡片信息出错!";visitCardInfo.code = -1;CRT310.CommClose(Hdle);return visitCardInfo;}}
C#调用硬件设备开发流程相关推荐
- 【Computer Organization笔记07】实验课:可编程逻辑器件介绍,硬件编程方法与原则,硬件编程流程
本次笔记内容: P13 计算机组成原理(13) P14 计算机组成原理(14) 本节课对应幻灯片: 组成原理52 verilogHDL 组成原理53 fpgahardware 本节课内容为" ...
- C语言设备管理器作业,你知道到吗,C语言竟是如何调用硬件的?
原标题:你知道到吗,C语言竟是如何调用硬件的? 大家都知道我们可以使用C语言写一段程序来控制硬件工作,但你知道其工作原理吗? 网友北极 c语言在实际运行中,都是以汇编指令的方式运行的,由编译器把C语言 ...
- Pulseaudio调用alsalib open()流程(十五)
一.pulseaudio调用alsalib open()流程 1.pulseaudio/src/modules/alsa/module-alsa-card.c <1>.int pa__in ...
- 电子设计之硬件开发流程和前辈的指导
硬件开发流程: 图1:硬件开发流程 图2:硬件开发流程简图 开发流程经验: 图2 硬件开发流程框图2 基本思想是使每一步流程具有严密的逻辑:每一步流程可操作:每一步流程的输入.操作及输出受控. 1.硬 ...
- 给硬件工程师的入门课-硬件开发流程
矩不正,不可为方:规不正,不可为圆.--淮南子 成功开发一款电子产品,最重要的是什么?为什么华为涉足哪个领域,(计算.光伏.汽车.手机.手表等),都能做的很强呢? 我认为重要的一点是流程.华为很早就向 ...
- Flutter开发(十二):Flutter调用硬件,插件,第三方服务和平台通知
1.调用硬件和第三方服务 Flutter 中调用硬件和第三方服务都通过集成插件来完成 别人总结的插件库: https://blog.csdn.net/qq_38875767/article/detai ...
- OP-TEE中TA与CA调用的完整流程----系统各层面关系
1.软件架构 最近在需要设计一个CA,虽然学习了一些相关的方面.但是做设计的时候,对于调用关系还是因为缺乏宏观的架构认识,做的时候就还是很不顺畅.这里先来瞅瞅. 要使用OP-TEE来实现特定的安全功能 ...
- SylixOS中MTD调用底层接口流程分析
1. MTD设备与底层驱动的关系 MTD设备是一种特殊的抽象设备,它用于简化驱动开发.它是底层硬件和上层软件的桥梁,无论对Nand Flash或是Nor Flash,它都提供了统一的框架供上层文件 ...
- 淘宝获取单笔订单信息服务端调用API及流程
淘宝获取单笔交易接口(文档地址):https://open.taobao.com/api.htm?docId=54&docType=2 调用接口所需依赖(文档地址):https://devel ...
最新文章
- document.body.offsetWidth 网页可见区域高宽,offset、client、scroll使用方法详解,页面位置距离
- Java虚拟机详解02----JVM内存结构
- linux apt-get 安装 根目录,技术|apt-get 和 apt-cache 命令实例展示
- 免费体验,阿里云智能LOGO帮你解决设计难题
- 华为服务器装系统怎么选pxe,华为TaiShan服务器PXE操作系统
- SHL笔试全攻略(转)
- c语言程序设计马秀丽课后题答案,c语言程序设计课后题答案马秀丽
- transact sql
- 软件测试之第一章 软件测试和测试环境
- 花花世界迷人眼,没有实力别赛脸,做Python实力派(万字精华,初学者,收藏必备!!!)
- 我的开源: UnInstaller for Windows(VBScript)
- x86嵌入式主板定制版型选购标准
- jq jqprint 设置页脚_jQuery 插件 jqprint 实现浏览器页面打印和设置页眉页脚
- 360搜索“触链”聚焦版权领域,“图刻”是噱头还是不忘安全初心?
- 史上最简单的mybatis-plus快速入门
- Java日期格式2019-11-05T00:00:00转换标准日期
- 怎么把html文档转换成doc,Word文档如何把docx格式转换成doc格式
- C/C++重要知识点
- Git extensions配置
- 云服务器BBC销售渠道,云服务器bbc什么意思