簡體   English   中英

Serialport寫單字節后的c#事件處理程序

[英]c# event handler after Serialport Write single byte

我想知道是否有可能在單獨的線程/進程中使用某種事件處理程序,當使用comport.Write(...)發送單個字節時會觸發該事件。

請考慮以下部分代碼:

public SerialPort comport = new SerialPort("COM1", 38400, Parity.Even, 8, StopBits.One);    
comport.Write(buf, 0, buf.Length);

現在讓我們說buf.Lenght是1000。我的程序停止,直到我發送了所有1000字節。 我不想分割comport.Write,我只想使用一次。

現在是否有可能每次發送一個字節時都可以打開某種事件處理程序,例如更新進程欄等,而不會中斷發送太多數據(不會減慢它的速度)。

任何幫助,將不勝感激。

SerialPort類不提供現成的功能,但是您可以添加此功能。 步驟(作為元代碼在記事本中編寫,您需要將其轉換為正確的C#並添加錯誤處理,邊界條件和參數檢查)

定義一個事件

public event Action BytesWritten;

定義事件調用者

public void FireBytesWritten(){...}

定義事件處理程序

public void OnBytesWritten(...){}

將事件掛鈎到init處的事件處理程序或設置代碼

this.BytesWritten += OnBytesWritten;

現在添加一個循環包裝語句並在寫入N個字節時觸發一個事件

SerialPort comport = new SerialPort("COM1", 38400, Parity.Even, 8, StopBits.One);

int chunkSize = 1; // 1 byte for the chunk size
for(int i = 0; i < buf.Length; i += chunkSize)
{
    // Write small amount of bytes
    comport.Write(buf, i, chunkSize);

    // Fire an event saying that many bytes were written
    FireBytesWritten(...);

    //do checks for boundary conditions, add error handling if Write fails
}

是的,只需在您的班級內創建事件並在適當的時候觸發它。

http://msdn.microsoft.com/en-us/library/aa645739(v=vs.71).aspx

正如您可以在文檔中輕松看到的那樣,內置SerialPort類中沒有此類事件。 但是,您當然可以在包裝器類中編寫自己的方法,該類將消息分成較小的塊並提供此類事件。 當然,對性能的影響不大,但是由於串行線確實很慢,因此您不會感覺到。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM