4

我正在尝试通过 P/Invoke 将数据写入串行端口(明确不使用 SerialPort 类)。这是我到目前为止所拥有的:

[DllImport("kernel32", SetLastError = true)]
static extern IntPtr CreateFile(string filename,       // file name
                                uint desiredAccess,    // read? write?
                                uint shareMode,        // sharing
                                uint attributes,       // SecurityAttributes pointer
                                uint creationDisposition,
                                uint flagsAndAttributes,
                                uint templateFile);

[DllImport("kernel32", SetLastError = true)]
static extern bool WriteFile(IntPtr hFile,               // handle to file
                             byte[] lpBuffer,            // data buffer
                             uint nBytesToWrite,         // number of bytes to write
                             out uint nBytesWritten,     // number of bytes written
                             [In] ref NativeOverlapped overlapped); // overlapped buffer

const uint OPEN_EXISTING = 3;

_portHandle = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
uint bytesWritten;
var buffer = Encoding.ASCII.GetBytes("foo\r");
var overlapped = new NativeOverlapped();
WriteFile(_portHandle, buffer, (uint)buffer.Length, out bytesWritten, ref overlapped);

我得到一个 _portHandle != -1 并且可以调用 WriteFile。但是在调用之后,它什么也没做。我可以在 VS 调试模式下永远等待并等待调用返回。此外,不会抛出异常。

有任何 kernel32.dll-masters 可以帮助我吗?

4

2 回答 2

2

感谢 Papa Mufflon 介绍了那个可用的项目,我为自己派生了它并从中制作了非常简单的开源项目https://github.com/ebraminio/PInvokeSerialPort你也可以从https://nuget.org/packages下载它/PInvokeSerialPort

当然,这个项目并不完整,所以任何关于它的功能要求的任何建议对我来说都很有价值:)

于 2012-03-03T18:11:47.863 回答
0

从 John Hind (http://msdn.microsoft.com/en-us/magazine/cc301786.aspx) 获取串行通信,而不是开发我自己的 :)

效果很好!

于 2010-12-04T13:32:01.337 回答