c# 获取串口设备的输入(unsigned char *和 char*)

简介: 因为是C#,所以平台肯定是.NET了。 之前因为一个小小的业务需要接触了下密码键盘的操作。其实就是简单的获取用户输入密码的操作,没碰到什么大的问题,但是查资料的过程中还是感觉查到的东西挺多的,是那种越查越多,但是又不是很关键的东西。

因为是C#,所以平台肯定是.NET了。

之前因为一个小小的业务需要接触了下密码键盘的操作。其实就是简单的获取用户输入密码的操作,没碰到什么大的问题,但是查资料的过程中还是感觉查到的东西挺多的,是那种越查越多,但是又不是很关键的东西。

在调用DLL中的方法的时候,我们一般要对照函数说明来把C/C++中的类型转换为.NET中相对应的类型,而且方法必须声明为静态外部函数,即加上public  extern static声明头.如果不加public ,函数默认为私有函数,调用就会出错。

[DllImport("COM DLL path/file")]
public extern static int FunctionName(byte param1, ushort param2)

 

类型对照表:

Win32 Types
CLR Type
char, INT8, SBYTE, CHAR 
System.SByte
short, short int, INT16, SHORT
System.Int16
int, long, long int, INT32, LONG32, BOOL , INT
System.Int32
__int64, INT64, LONGLONG
System.Int64
unsigned char, UINT8, UCHAR , BYTE
System.Byte
unsigned short, UINT16, USHORT, WORD, ATOM, WCHAR , __wchar_t
System.UInt16
unsigned, unsigned int, UINT32, ULONG32, DWORD32, ULONG, DWORD, UINT
System.UInt32
unsigned __int64, UINT64, DWORDLONG, ULONGLONG
System.UInt64
float, FLOAT
System.Single
double, long double, DOUBLE
System.Double
 对于普通的函数调用一般类型对应上就没什么问题了,但是对于涉及到指针操作和回调操作的就会复杂一些,当然熟悉了也就不复杂了,这里只涉及指针的操作。
如果DLL中有一个函数的传人参数是一个指针的话,如:
int __stdcall FunctionName(unsigned char *param2)这就当是DLL的一个函数说明,返回值是INT,传入参数是一个指针,类型是unsigned char。对于CHAR和STRING类型的区别本来找到个说的比较好的文章,但是回到家里后就找不到那文章了。他们的区别就是字符和字符串的区别,char 声明并赋值的时候只能是单字符的,char c = 'c';而string声明和赋值的时候可以是单字符也可以是很多个单字符连在一起组成一个串,string s = "cc";C/C++在表示字符串的时候是以字符数组来表示的,char[] c;
在调用包括指针操作的函数的时候,除了对照类型,我们还得考虑采用的处理方式。 “对于这种情况可以使用C#提供的非安全代码来进行解决,但是,毕竟是非托管代码,垃圾资源处理不好的话对应用程序是很不利的。所以还是使用C#提供的ref以及out修饰字比较好。”
非安全代码是.NET为了指针操作的需要而特别设置的功能,所以既然是针对指针而留的,那应该也是最合适的处理方法了。后面试了下ref的方式,提示实例的异常,也许是指针传的不对,找不到对象了。

使用:已密码键盘获取密码输入为例

函数说明:int __stdcall inputpassword(unsigned char *param)

.NET中使用:

声明:

[DllImport("COM DLL path/file")]
unsafe public static extern int inputpassword(byte* param);这里我们用BYTE对应char*

调用:放在哪里自己决定

byte[]  password = new byte[6];\\密码键盘输入为6位,所以长度设为6就可以了

unsafe

{

   //fixed的MSDNhttp://msdn.microsoft.com/zh-cn/library/f58wzh21(VS.80).aspx

    fixed(byte* array=password ) //这里获取的是password 的地址,并FIX,就是固定“fixed 语句禁止垃圾回收器重定位可移动的变量”

    {

        int ret_value = inputpassword(array);//这里传入的是指针,因为unsigned char *param就是一个指针。

    }

}

语句执行后的结果是输入的密码会保存在password 字节数组中,之后就是调用相应的方法把password 转换成6位密码字符了。

 

 

目录
相关文章
|
传感器 物联网 数据管理
.NETCore/C#开发IOT嵌入式设备的个人见解
.NETCore/C#开发IOT嵌入式设备的个人见解
1409 0
.NETCore/C#开发IOT嵌入式设备的个人见解
|
9月前
|
物联网 数据处理 C#
C#实现上位机开发,串口通信,读写串口数据并处理16进制数据
C#实现上位机开发,串口通信,读写串口数据并处理16进制数据。在自动化、物联网以及工业控制行业中,上位机开发是一项重要的技能。本教程主要介绍使用C#进行上位机开发,重点在于串口通信和数据处理。
1858 82
|
C# Windows
C# 串口关闭时主界面卡死原因分析
串口程序关闭导致界面卡死的原因是主线程与辅助线程间的死锁。问题出在`SerialPort.Close()`方法与`DataReceived`事件处理程序。`DataReceived`事件在`lock (stream)`块中执行,而`Close()`方法会关闭`SerialStream`并锁定自身。当辅助线程处理数据并尝试更新UI时,UI线程因调用`Close()`被阻塞,造成死锁。解决办法是让`DataReceived`事件处理程序使用`this.BeginInvoke()`异步更新界面,避免等待UI线程,从而防止死锁。
|
数据采集 存储 安全
C#手术麻醉系统源码 可对接HIS LIS PACS 医疗系统各类设备
术麻醉信息管理系统主要还是为了手术室开发提供全面帮助的系统,其主要是由监护设备数据采集子系统和麻醉临床系统两个子部分组成。包括从手术申请到手术分配,再到术前访视、术中记录及术后恢复的全过程中都可以得到全方位的保障。
219 4
C#手术麻醉系统源码 可对接HIS  LIS   PACS 医疗系统各类设备
|
存储 人工智能 编译器
learn_C_deep_5 (温故知新、sigend char a = -128的深度理解、unsigned int类型的写法规范)
learn_C_deep_5 (温故知新、sigend char a = -128的深度理解、unsigned int类型的写法规范)
187 0
|
存储 小程序 程序员
8k字详解整型(int)/字符型(char)/浮点型(float)/有符号(signed)/无符号(unsigned)数据在内存中的存储【程序员内功修炼/C语言】
8k字详解整型(int)/字符型(char)/浮点型(float)/有符号(signed)/无符号(unsigned)数据在内存中的存储【程序员内功修炼/C语言】
675 0
|
存储 C语言
C语言:char与unsigned char类型数据的范围
unsigned char 的范围是 0~255,当 i=255 时,i++变为0,从0到255无限循环,因此程序运行结果为死循环
965 0
|
监控 安全 开发工具
Baumer工业相机堡盟工业相机如何通过BGAPI SDK使用DeviceEvents“设备事件”记录相机事件的各类时间(C#)
Baumer工业相机堡盟工业相机如何通过BGAPI SDK使用DeviceEvents“设备事件”记录相机事件的各类时间(C#)
298 0
【C#】【FFmpeg】获取电脑可用音视频设备并输出到下拉列表框
【C#】【FFmpeg】获取电脑可用音视频设备并输出到下拉列表框
456 0
【C#】【FFmpeg】获取电脑可用音视频设备并输出到下拉列表框
char、signed char和unsigned char
char、signed char和unsigned char
514 0