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

因为是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位密码字符了。

 

 

时间: 2024-09-21 06:39:11

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

js/jquery获取文本框输入焦点的方法

 本篇文章主要是对js/jquery获取文本框输入焦点的方法进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助 方法一.    代码如下:  function CheckForm() {              if(document.form1.trainingName.value==""){                      alert("培训班名称不能为空!");                      document.form1.trai

sql 变量-利用js获取页面用户输入字符串,作为变量进行CQL语句查询

问题描述 利用js获取页面用户输入字符串,作为变量进行CQL语句查询 我用js编写了一个,从页面获取了用户输入的两个字符串,一个作为键,一个作为值,想在js中利用CQL语句进行select * from 表名 where [键名]=值,这样的查询.查询出所有符合条件的查询结果.但是,变量怎样写都不对,换成固定的属性和值,语句就可以运行,求各位大神帮忙!!!! 解决方案 注意变量拼接,不要放到sql语句里面 var field="abc",value="xx" var

text-如何获取 TextView 中输入行的最大数?

问题描述 如何获取 TextView 中输入行的最大数? 如何获取 TextView 中输入行的最大数? DisplayMetrics metrics = new DisplayMetrics (); getWindowManager (). getDefaultDisplay (). getMetrics (metrics); float width = metrics.widthPixels; float height = metrics.heightPixels; int lines =

关于VISUA C++对话框获取不到输入的问题

问题描述 关于VISUA C++对话框获取不到输入的问题 VISUAL 对话框程序用Domodal()显示对话框,为什么得不到成员变量的值?是不是必须用指针啊? 解决方案 http://www.cnblogs.com/xiangshancuizhu/archive/2011/11/21/2257426.html 不用指针 你看看是不是UpdateData(TRUE);没调用 解决方案二: 获取框架窗口句柄,然后用GetWindowText来获取 解决方案三: 是什么情况,要看你设计获取变量的思路

android4 4-android4.4 获取software input输入事件

问题描述 android4.4 获取software input输入事件 4.1之前的代码中,可以使用onKeyListener或者onKeyDown/onKeyUp等方法来获取软件盘的输入事件,今天调试4.4的代码貌似这些方法都不行了,看google文档介绍,以及自己亲自测试,貌似这些方法只能监听硬件盘的事件.从google文档中找到KeyboardView.OnKeyboardActionListener这个接口,在activity中实现后貌似还是不行,求大神赐教啊.

mysql 数据库-mysql如何获取contentEditable中输入的内容并存储

问题描述 mysql如何获取contentEditable中输入的内容并存储 如题,mysql如何获取contentEditable区域输入的内容?谢谢了 解决方案 contentEditable是标签修饰内容,意思内容可编辑而mysql是个数据库,你的问题就好比,一个商店如何得到篮球一样纠结把问题理清晰,这样来做1得到数据2把数据存入mysql 1: <div id=""test"" contentEditable=true>this is a tes

char * a, char ** a, char * a[], char a[][], char * a[][], char ** a[][], char * a [][][], and so on in memory

本文测试环境 :  X86-64 bit 架构的服务器 CentOS x64 5.x gcc version 4.1.2 20080704 指针和数组是C的比较难搞懂的知识点, 需要结合内存来学习, 非常感谢各位兄弟为我指点迷津. 下面总结一下 :  首先说明一下C程序在运行时, 不同的内容或变量分别存储在什么地方? 分了几块区域分别是, code, constants, global, heap, stack; (内存地址从低到高) 其中constants存储常量(常量值不允许修改), glo

c语言-编写一个函数,void fun(char *str, char *substr1, char *subtr2 , …)

问题描述 编写一个函数,void fun(char *str, char *substr1, char *subtr2 , -) 编写一个函数,void fun(char *str, char *substr1, char *subtr2 , -)实现将字符串str中的子串substr1替换为子串substr2,并同时统计替换后str字符串长度,要求:接口定义中已有部分不许修改,但允许在-处自由添加参数.替换举例:如将字符串"abcedfrbcxybc"中的字串1"bc&qu

C语言中char*和char[]用法区别分析_C 语言

本文实例分析了C语言中char* 和 char []的区别.分享给大家供大家参考之用.具体分析如下: 一般来说,很多人会觉得这两个定义效果一样,其实差别很大.以下是个人的一些看法,有不正确的地方望指正. 本质上来说,char *s定义了一个char型的指针,它只知道所指向的内存单元,并不知道这个内存单元有多大,所以: 当char *s = "hello";后,不能使用s[0]='a':语句进行赋值.这是将提示内存不能为"written". 当用char s[]=&q