串口通信屬性及事件解析
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 不提供錯誤檢測。出於安全原因,建議您使用 UTF8Encoding、UnicodeEncoding 或UTF32Encoding 並啟用錯誤檢測。
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
26. SERIAL_NAME 值\\Device\\Serial
二、方法
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 的額外字節。將在輔助線程上引發 PinChanged 事件。
標簽: 串口屬性設置串口通信屬性及事件解析