今天調試串口,發現BytesToRead可以比ReadBufferSize屬性值大,而且這個大不是表面數值上的大,實際數據也沒有丟失。
查了MSDN SerialPort. BytesToRead 屬性 發現如下說明:
由於 ReadBufferSize 屬性只表示 Windows 創建的緩沖區,而 BytesToRead 屬性除了表示 Windows 創建的緩沖區外還表示 SerialPort 緩沖區,
所以 BytesToRead 屬性可以返回一個比 ReadBufferSize 屬性大的值。
接收緩沖區包括串行驅動程序的接收緩沖區以及 SerialPort 對象自身的內部緩沖。
那么串行驅動程序的緩沖區到底有多大呢?沒有搜索到,試了一下,可以大於65K,之后沒再試了。
另外,對於SerialPort.DataReceived 事件,假如一次事件的處理中,還沒處理完,輸入緩沖區又達到了SerialPort.ReceivedBytesThreshold的大小,此時不會再執行多一次DataReceived處理函數(即不會同時有兩個DataReceived線程在運行),只有當前一次的處理完了之后,再從頭執行DataReceived方法。假如一直這樣的話,程序運行倒不會有問題,只是當接收的未處理的數據量大於緩沖區的大小時,數據將丟失。
對於這種情況,覺得比較好的是在DataReceived里面再專門開一個線程,用於處理數據。DataReceived只負責接收。