• 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位密码字符了。

  • 相关阅读:
    JavaScript小笔记の经典算法等....
    SEO
    幻灯片の纯CSS,NO JavaScript
    试说明采用双缓冲技术如何进行I/O操作
    常用的缓冲技术有哪几种?
    什么是缓冲,引入缓冲的原因是什么?
    什么是设备控制块,它主要包括什么内容,简述其作用?
    进程的逻辑设备如何与一个物理设备建立对应的关系?
    什么是设备独立性,引入这一概念有什么好处?
    试叙述段页式地址变换过程。
  • 原文地址:https://www.cnblogs.com/ruanbl/p/1493252.html
Copyright © 2020-2023  润新知