串列通訊之.NET SerialPort非同步寫資料

來源:互聯網
上載者:User

標籤:intern   winapi   狀態   turn   alt   ntp   ges   目錄   sch   

目錄

第1章說明    2

1 為什麼需要非同步寫資料?    2

2 非同步寫資料的代碼    2

3 原始碼    4

 

 

第1章說明

1 為什麼需要非同步寫資料?

如所示,以傳輸速率300開啟一個串口。

圖1

單擊"同步發送"按鈕,則資料未發送完之前寫資料的函數不會返回。傳輸速率300,每秒大概能發送25個字元,發送500個字元就需要20秒。這20秒之內,整個程式將處於假死狀態。

單擊"非同步發送"按鈕,就不會出現假死狀態。

2 非同步寫資料的代碼

非同步寫資料的代碼如下:

private void btnWriteAsync_Click(object sender, EventArgs e)

{//非同步寫

byte[] byt = System.Text.Encoding.Default.GetBytes(txtSend.Text);

if(byt!=null && byt.Length > 0)

{

IntPtr hComm = GetCommHandle(m_sp);

UInt32 w = 0;

m_ov.hEvent = IntPtr.Zero;

m_ov.Internal = IntPtr.Zero;

m_ov.InternalHigh = IntPtr.Zero;

m_ov.Offset = 0;

m_ov.OffsetHigh = 0;

WriteFile(hComm, byt, (UInt32)byt.Length, ref w, ref m_ov);

}

}

要點為:

1)GetCommHandle函數擷取.NET SerialPort對象的串口控制代碼hComm;

2)調用WriteFile函數,非同步寫資料。

以下是結構OVERLAPPED的聲明、函數WriteFile的聲明、函數GetCommHandle的實現:

[StructLayout(LayoutKind.Sequential,Pack=4)]

public struct OVERLAPPED

{

public IntPtr Internal;

public IntPtr InternalHigh;

public UInt32 Offset;

public UInt32 OffsetHigh;

public IntPtr hEvent;

}

[DllImport("kernel32.dll", SetLastError = true

, CallingConvention = CallingConvention.Winapi)]

private static extern UInt32 WriteFile(IntPtr hFile, byte[] lpBuffer

, UInt32 nNumberOfBytesToWrite

, ref UInt32 lpNumberOfBytesWritten

, ref OVERLAPPED lpOverlapped);

 

protected System.IO.Ports.SerialPort m_sp =

new System.IO.Ports.SerialPort();

protected OVERLAPPED m_ov;

 

static IntPtr GetCommHandle(System.IO.Ports.SerialPort sp)

{//獲得串口控制代碼,供 Win32 API 使用

IntPtr hComm = IntPtr.Zero;

if (sp != null)

{

object stream = typeof(System.IO.Ports.SerialPort).GetField("internalSerialStream", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).GetValue(sp);

var handle = (Microsoft.Win32.SafeHandles.SafeFileHandle)stream.GetType().GetField("_handle", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).GetValue(stream);

hComm = handle.DangerousGetHandle();

}

return hComm;

}

3 原始碼

本文的代碼已上傳至git伺服器:

https://github.com/hanford77/Exercise

https://git.oschina.net/hanford/Exercise

在目錄 SerialPort\c# 目錄內。

串列通訊之.NET SerialPort非同步寫資料

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.