1、DiscardOutBuffer和DiscardInBuffer
1)用途:
SerialPort.DiscardOutBuffer方法清除串行驅動程序發送緩衝區的數據;
SerialPort.DiscardInBuffer方法清除串行驅動程序的接收緩衝區的數據;
2)用法:
當你的程序在窗口發送一幀數據(所謂一幀是指由多個字節組成的有邏輯意義的數據)過程中檢測到串口發送錯誤,如果讓串口繼續發生就沒有意義了,這個時候可以用SerialPort.DiscardOutBuffer方法來清除已經進入發送緩衝區的錯誤數據;
類似地,當你的程序在接收一幀數據時發生錯誤,如果再讓串口繼續接收也沒有意義了,這個時候可以用SerialPort.DiscardInBuffer方法來清除已經進入接收緩衝區的錯誤數據了。
2、讀寫行數據
雙方通訊時,一般都需要定義通訊協議,即使最簡單的通過串口發送文本聊天的程序。
通常是在當一方按下回車時,將其所數據的文本連同換行符發給另一方。在這個通訊事例中,協議楨是通過換行符界定的,每一楨數據都被換行符隔開,這樣就很容易識別出通訊雙發發送的信息。
在以上的例子中,可以用WriteLine()來發送數據,用ReadLine()來讀取數據。WriteLine發送完數據後,會將換行符作爲數據也發送給對方。ReadLine()讀取數據時,直至遇到一個換行符,然後返回一個字符串代表一行信息。換行符可以通過SerialPort 的屬性NewLine來設置。一般地,Windows將CrLn作爲換行符,而在Linux下,換行符則只用一個Ln表示。
ReadLine()方法是阻塞的,直至遇到一個換行符後返回。在讀取數據時,如果一直沒有遇到換行符,那麼在等待ReadTimeout時間後,拋出一個TimeoutException。默認情況下,ReadTimeout爲InfiniteTimeout。這樣,ReadLine一直處於阻塞狀態,直至有新一行數據到達。
WriteLine()方法也是阻塞的,如果另一方不能及時接收數據,就會引起TimeoutException異常。
由於ReadLine()和WriteLine()方法都是阻塞式的,在程序使用SerialPort 進行串口通訊時,一般應該把讀寫操作交由其他線程處理,避免因爲阻塞而導致程序不響應。