0

我正在尝试使用 EscapeCommFunction 创建文件方法,写入串行端口 com 1: (to atmega8 MCU)

    DCB dcb = new DCB();

    [DllImport("kernel32.dll")]
    static extern bool SetCommState(IntPtr hFile, [In] ref DCB lpDCB);

    [DllImport("kernel32.dll", SetLastError = true)]
    public static extern bool CloseHandle(IntPtr handle);


    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern bool EscapeCommFunction(IntPtr hFile, int dwFunc);

    IntPtr portHandle;
    int SETRTS = 3;
    [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
    private static extern IntPtr CreateFile(string lpFileName, System.UInt32 dwDesiredAccess, System.UInt32 dwShareMode, IntPtr pSecurityAttributes, System.UInt32 dwCreationDisposition, System.UInt32 dwFlagsAndAttributes, IntPtr hTemplateFile);

    [DllImport("kernel32.dll")]
    static extern bool WriteFile(IntPtr hFile, byte[] lpBuffer, uint nNumberOfBytesToWrite, out uint lpNumberOfBytesWritten, [In] ref NativeOverlapped lpOverlapped);

    [StructLayout(LayoutKind.Sequential, Pack = 8)]
    public struct NativeOverlapped
    {
        private IntPtr InternalLow;
        private IntPtr InternalHigh;
        public long Offset;
        public IntPtr EventHandle;
    }

    NativeOverlapped OverLap = new NativeOverlapped();

主窗体负载:

    private void MainForm_Load(object sender, EventArgs e)
    {
        try
        {
            portHandle = CreateFile("COM1", 0x80000000 | 0x40000000, 0x00000000, IntPtr.Zero, 4, 0x40000000, IntPtr.Zero);
            dcb.BaudRate = 9600;
            dcb.Parity = 0;
            dcb.ByteSize = 8;
            dcb.StopBits = 1;
            SetCommState(portHandle, ref dcb);
            MessageBox.Show(EscapeCommFunction(portHandle, 3).ToString());
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

我正在尝试发送数据

    private void btnSend_Click(object sender, EventArgs e)
    {
        lpNumberOfBytesWritten = 0;
        bytesLen = 0;
        byte[] message = new byte[11];
        //creating message
        bytesLen = (uint)message.Length;
        MessageBox.Show(WriteFile(portHandle, message, bytesLen, out lpNumberOfBytesWritten, ref OverLap).ToString());
    }

EscapeCommFunction 返回 true,Writefile 返回 false。怎么了?

4

0 回答 0