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-debugモードで永久に待機し、呼び出しが戻るのを待つことができます。また、例外はスローされません。

私を助けることができるkernel32.dll-mastersはありますか?

4

2 に答える 2

2

その使用可能なプロジェクトを紹介してくれたPapaMufflonに感謝します。私はそれを自分で導き出し、そこから非常に単純なオープンソースプロジェクトを作成しました。https://github.com/ebraminio/PInvokeSerialPorthttps: //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 に答える