VC DLL接口的声明里有Query(HANDLE hComm,int nUnitNo)其中第一个参数 就是串口句柄
请教如何把C#里面的serport控件的句柄传过去
C#里面定义 handle 应该就是指 intptr。serialport如何转成intptr??
我查了一下,发现serialport控件没有句柄这一说,网上很多人说用creatfile的方法实现
但是软件结构已经生成,无法改成creatfile!!
希望各位知道解决问题的大侠给予帮助,在线等待
路过的帮忙顶一下,不胜感激!

解决方案 »

  1.   

    老外的代码给你参考
    var serialPort = new SerialPort();
    object stream = typeof(SerialPort).GetField("internalSerialStream", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(serialPort);
    var handle = (SafeFileHandle)stream.GetType().GetField("_handle", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(stream);
    IntPtr phandle = handle.DangerousGetHandle();http://stackoverflow.com/questions/6414043/can-i-get-the-device-handle-for-a-serial-port-that-i-am-accessing-using-the-net未测试
      

  2.   

    那你再用win32 api的CreateFile试试看吧
      

  3.   

    因为整个工程是用serialport类实现了,现在改creatfile太麻烦了,整个工程都得改
      

  4.   

    问题尚未搞定,请教各位大侠,在线等待
     var sp = new SerialPort();
                sp.PortName = "COM4";
                sp.StopBits = StopBits.One;
                sp.Parity = Parity.None;
                sp.DataBits = 8;
                sp.BaudRate = 9600;
                sp.Open();
    object stream = typeof(SerialPort).GetField("internalSerialStream", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(sp);
                var handle = (SafeFileHandle)stream.GetType().GetField("_handle", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(stream);
                IntPtr phandle = handle.DangerousGetHandle();部分代码,但是获得的句柄传输给VC dll 的时候,无法送串口输出数据,可能这个获得的句柄无用
      

  5.   

    你确定是这么做的?
    在我想来:你的VC Dll中一定有打开串口的函数,
    比如:OpenCom之类的函数,使用这个函数应该会返回一个串口的句柄,
    你要使用的是这个句柄。
      

  6.   

    我觉得你要打开串口才能获得句柄吧,c#调用VC DLL打开串口,成功就应该得到一个串口句柄了
      

  7.   

    我用上面的方法,已经获得串口句柄了,把这个句柄传给VC dll的接口,VC dll的接口根据串口句柄,就可以往硬件发送数据了
    现在的问题是,这个获得的串口句柄可能不正确,请假正确的获得串口句柄的方法