//打开串口
CreateFile("\\\\?\\" + FCommName, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, 0); //调用ReadFile时,程序阻塞,当有数据到达时,触发事件去读取
if (ReadFile(FCommHandle, FInputBuffer, FReadLength, ref FReadNumber, ref FOverlappedRead))
            {
                SetEvent(FOverlappedRead.hEvent);
                result = true;
                return;
            }//读取过程
 if (GetOverlappedResult(FCommHandle, FOverlappedRead, ref FReadNumber, false))
            {
                Buf = new byte[FReadNumber];                for (int I = 0; I <= FReadNumber - 1; I++)
                {
                    Buf[I] = FInputBuffer[I];                    
                }                Len = FReadNumber;
                //调用ReadFile,重新阻塞 
                SetupReadEvent();
                return result; 
            }//发送数据
WriteFile(FCommHandle, bArr, iLen, ref BytesWritten, ref FOverlappedWrite);现在的问题时,调用GetOverlappedResult时,提示读写受保护的内存。发送数据时,执行WriteFile时阻塞。有谁用过,谢谢。

解决方案 »

  1.   

    FReadNumber 这个参数貌似应该用IntPtr
      

  2.   

    这是我用的
    [DllImport("Kernel32.dll")]        private static extern bool ReadFile(            IntPtr hFile,            byte[] lpBuffer,            uint nNumberOfBytesToRead,            ref uint lpNumberOfBytesRead,            IntPtr lpOverlapped
                );
      

  3.   

    GetOverlappedResult 这个方法声明的时候第二个参数也要加上 ref 修饰,原函数这位置是结构指针