1. 程式人生 > >C#串列埠SerialPort常用屬性方法

C#串列埠SerialPort常用屬性方法

SerialPort():

//屬性

.BaudRate;獲取或設定波特率

.BytesToRead;得到 接收到資料的位元組數

.BytesToWrites;得到送往串列埠的位元組數

.DataBits;獲取或設定資料位

.IsOpen;獲取一個值,判斷串列埠是否開啟

.Pariy;獲取或設定校驗位

.PortName;串列埠名稱

.ReadBufferSize;獲取或設定讀取資料的快取大小

.ReadTimeout;讀取超時時間

.StopBits;停止位

.NewLine;用於解釋通過ReadLine()與WriteLine()的值

.WriteBufferSize;與ReadBufferSize相對

.WriteTimeout;與ReadTimeout相對

方法:

.Close();判斷串列埠

.Open();開啟串列埠

.Read(Byte[], int32, int32);讀取資料

.Read(Char[], int32, int32);

.ReadByte();讀取一個位元組的資料

.ReadChar();讀取一個字元的資料

.ReadLine();一直讀取到輸入緩衝區的NewLine值:返回string型別

.ReadExisting();讀取可用的位元組

.ReadTo(string value);讀取資料,直到讀到該value時停止。

.Write(string);寫入資料

.Write(byte[], int32, int32);

.Write(char[], int32, int32);

.WriteLine(string value);將指定的value值與NewLine值一起寫入

事件:

DataReceived

例子MSDN:

SerialPort mySerialPort = new SerialPort("COM2");

mySerialPort.BaudRate = 9600;

mySerialPort.Parity=Parity.None;

mySerialPort.StopBits = StopBits.One;

mySerialPort.DataBits = 8;

mySerialPort.Handshake = Handshake.Non;

mySerialPort.DataReceived += new SerialDataReceivedEvenHandler(DataReceive_Method);

mySerialPort.Open();

....

mySerialPort.Close();

static void DataReceive_Method(object sender, SerialPortDataReceivedEventArgs e)

{

SerialPort sp = (SerialPort)seder;

string indata = sp.ReadExisting();

Console.Write(indata);

}

RS-232串列埠,串列埠按位(bit)傳送和接收位元組。儘管比按位元組(byte)的並行通訊慢,但是串列埠可以在使用一根線傳送資料的同時用另一根線接收資料。典型地,串列埠用於ASCII碼字元的傳輸。通訊使用3根線完成:(1)地線,(2)傳送,(3)接收。

本文以c#中的SerialPort類為例,分析串列埠各引數及事件,其他平臺串列埠庫的操作類似。

專門串列埠通訊的朋友,建議參看《Visual C++串列埠通訊工程開發例項導航》。

一、屬性

1. PortName 串列埠名    預設值COM1

串列埠對於作業系統來說是一個檔案,如果設定PortName為本機不存在的串列埠名(即檔名),如“COM7”或“COMK”,Open()開啟串列埠將失敗,提示“埠COM7不存在”。

2. BaudRate 獲取或設定序列波特率bit/s    預設值9600

位元率=波特率X單個調製狀態對應的二進位制位數。

RS232是要用在近距離傳輸上最大距離為30M

RS485用在長距離傳輸最大距離1200M

3. DataBits 獲取或設定每個位元組的標準資料位長度    預設值8

當計算機發送一個資訊包,實際的資料不會是8位的,標準的值是5、7和8位。如何設定取決於你想傳送的資訊。比如,標準的ASCII碼是0~127(7位)。擴充套件的ASCII碼是0~255(8位)。如果資料使用簡單的文字(標準 ASCII碼),那麼每個資料包使用7位資料。每個包是指一個位元組,包括開始/停止位,資料位和奇偶校驗位。由於實際資料位取決於通訊協議的選取,術語“包”指任何通訊的情況。

4. StopBits 獲取或設定每個位元組的標準停止位數    預設值One

用於表示單個包的最後一位。典型的值為1,1.5和2位。由於資料是在傳輸線上定時的,並且每一個裝置有其自己的時鐘,很可能在通訊中兩臺裝置間出現了小小的不同步。因此停止位不僅僅是表示傳輸的結束,並且提供計算機校正時鐘同步的機會。適用於停止位的位數越多,不同時鐘同步的容忍程度越大,但是資料傳輸率同時也越慢。

5. Parity 獲取或設定奇偶校驗檢查協議    預設值None

在串列埠通訊中一種簡單的檢錯方式。有四種檢錯方式:偶、奇、高和低。當然沒有校驗位也是可以的。對於偶和奇校驗的情況,串列埠會設定校驗位(資料位後面的一位),用一個值確保傳輸的資料有偶個或者奇個邏輯高位。例如,如果資料是011,那麼對於偶校驗,校驗位為0,保證邏輯高的位數是偶數個。如果是奇校驗,

校驗位位1,這樣就有3個邏輯高位。高位和低位不真正的檢查資料,簡單置位邏輯高或者邏輯低校驗。這樣使得接收裝置能夠知道一個位的狀態,有機會判斷是否有噪聲干擾了通訊或者是否傳輸和接收資料是否不同步。

6. ParityReplace 獲取或設定一個位元組,該位元組在發生奇偶校驗錯誤時替換資料流中的無效位元組   預設值63(?)

7. ReadBufferSize 獲取或設定 SerialPort 輸入緩衝區的大小     預設值4096

ReadBufferSize 屬性忽略任何小於 4096 的值??由於 ReadBufferSize 屬性只表示 Windows 建立的緩衝區,而 BytesToRead 屬性除了表示 Windows 建立的緩衝區外還表示 SerialPort 緩衝區,所以 BytesToRead 屬性可以返回一個比 ReadBufferSize 屬性大的值。

8. ReadTimeout 獲取或設定讀取操作未完成時發生超時之前的毫秒數    預設值-1

確切的說ReadTimeout設定了Read(outBuf, offset, count)超時等待的時間,即如果接收緩衝區一直沒有資料,則Read()等待ReadTimeout毫秒後甩TimeoutException異常。但是在ReadTimeout期間,只要有一個數據,則Read()立馬返回,而不是等待count個位元組資料。ReadTimeout不是為了Read()阻塞等待count個位元組,那它有什麼意義?

9. ReceivedBytesThreshold 獲取或設定 DataReceived 事件發生前內部輸入緩衝區中的位元組數   預設值1

如果緩衝區一次性有4個位元組資料,那麼DataReceived事件是觸發1次還是4次?

10. WriteBufferSize 獲取或設定串列埠輸出緩衝區的大小    預設值2048

ReadBufferSize 屬性忽略任何小於 4096 的值。

由於 ReadBufferSize 屬性僅表示 Windows 建立的緩衝區,所以它可以返回比 BytesToRead屬性小的值,這表示 SerialPort 和 Windows 建立的緩衝區。

11. WreiteTimeout 獲取或設定寫入操作未完成時發生超時之前的毫秒數    預設值-1

寫入超時值在 Win32 通訊 API 中最初被設定為 500 毫秒。此屬性允許您設定此值。此值可以設定為 0 以立即從寫入操作返回,或設定為任意正值,也可以設定為預設的 InfiniteTimeout。此屬性不影響 BaseStream BeginWrite 方法。

12. BytesToRead   獲取接收緩衝區中資料的位元組數

由於 ReadBufferSize 屬性只表示 Windows 建立的緩衝區,而 BytesToRead 屬性除了表示 Windows 建立的緩衝區外還表示 SerialPort 緩衝區,所以 BytesToRead 屬性可以返回一個比 ReadBufferSize 屬性大的值。

13. BytesToWrite   獲取傳送緩衝區中資料的位元組數

14. NewLine 獲取或設定用於解釋 ReadLine( )和WriteLine( )方法呼叫結束的值    預設值“\n”

15. DiscardNull 獲取或設定一個值,指示 Null 位元組在埠和接收緩衝區之間傳輸時是否被忽略  預設值false

正常情況下,特別是對於二進位制傳輸而言,此值應該設定為 false。將此屬性設定為 true 會使 UTF32 和 UTF16 編碼位元組產生意外結果。

16. Handshake 獲取或設定串列埠資料傳輸的握手協議    預設值None

使用握手時,將指示連線到 SerialPort 物件的裝置在緩衝區中至少有 (ReadBufferSize-1024) 個位元組時停止傳送資料。當緩衝區中的位元組數小於等於 1024 時,將指示裝置重新開始傳送資料。如果裝置在大於 1024 個位元組的塊中傳送資料,可能會導致緩衝區溢位。

如果將 Handshake 屬性設定為 RequestToSendXOnXOff 並將 CtsHolding 設定為 false,則不會發送 XOff 字元。如果後來將 CtsHolding 設定為 true,則必須傳送更多的資料後才會傳送 XOff 字元。

17. Encodeing 獲取或設定傳輸前後文本轉換的位元組編碼      預設為 ASCIIEncoding

ASCIIEncoding 僅支援 U+0000 和 U+007F之間的 Unicode 字元值。因此,UTF8Encoding、UnicodeEncoding 和 UTF32Encoding 可以更好地適應全球化的應用程式。

18. DtrEnable 獲取或設定一個值,該值在序列通訊過程中啟用資料終端就緒 (DTR) 訊號   預設值 false

在 XON/XOFF 軟體握手、請求傳送/可以傳送 (RTS/CTS) 硬體握手和調變解調器通訊的過程中通常啟用資料終端就緒 (DTR)。

19. RtsEnable 獲取或設定一個值,該值指示在序列通訊中是否啟用請求傳送 (RTS) 訊號   預設值false

請求傳送 (RTS) 訊號通常用在請求傳送/可以傳送 (RTS/CTS) 硬體握手中。

20. CDHolding 獲取埠的載波檢測行的狀態

此屬性可用於監視埠的載波檢測行的狀態。無載波通常表明接收方已結束通話且載波已被丟棄。

21. CtsHolding       獲取“可以傳送”行的狀態

在請求傳送/可以傳送 (RTS/CTS) 硬體握手中使用可以傳送 (CTS) 行。傳送資料之前埠會查詢 CTS 行。

22. DsrHolding       獲取資料設定就緒 (DSR) 訊號的狀態

在資料設定就緒/資料終端就緒 (DSR/DTR) 握手中使用此屬性。通常由調變解調器將資料設定就緒 (DSR) 訊號傳送到埠,以表明它已經為資料傳輸或資料接收做好準備。

23. BufferSize    值1024

24. maxDataBits    值8

25. minDataBits    值5

二、方法

1. Open()   開啟一個新的串列埠連線

2. Close()   關閉埠連線,將 IsOpen 屬性設定為 false,並釋放內部 Stream 物件

3. Read(Byte[], int, int)   輸入緩衝區讀取一些位元組並將那些位元組寫入位元組陣列中指定的偏移量處

4. ReadByte()   從 SerialPort 輸入緩衝區中同步讀取一個位元組

5. ReadChar()   從 SerialPort 輸入緩衝區中同步讀取一個字元

6. ReadExisting()   在編碼的基礎上,讀取 SerialPort 物件的流和輸入緩衝區中所有立即可用的位元組

6. ReadLine()   一直讀取到輸入緩衝區中的 NewLine

7. ReadTo()   一直讀取到輸入緩衝區中的指定 value 的字串

8. Write(string)   將指定的字串寫入串列埠

9. Write(Byte[], int, int)   使用緩衝區的資料將指定數量的字元寫入串列埠

10. WriteLine()   將指定字串和NewLine值寫入輸出緩衝區

11. DiscardInBuffer()   丟棄接收緩衝區的資料

12. DiscardOutBuffer()   丟棄傳送緩衝區的資料

12. static GetPortNanes()   獲取當前計算機的串列埠名稱陣列

三、事件

1. DataReceive事件   資料接收事件的方法

  不保證對接收到的每個位元組引發 DataReceived 事件。 使用 BytesToRead 屬性確定緩衝區中剩餘的要讀取的資料量。從 SerialPort 物件接收資料時,將在輔助執行緒上引發 DataReceived 事件。

2. PinChanged事件    序列管腳更改事件的方法

  在 SerialPort 物件進入 BreakState 時引發,但在埠退出 BreakState 時不引發。將在輔助執行緒上引發 PinChanged 事件。

3. ErrorReceived事件       錯誤事件的方法

  如果在流的尾位元組上出現奇偶校驗錯誤,將向輸入緩衝區新增一個值為 126 的額外位元組。將在輔助執行緒上引發 ErrorReceived事件。