串口通信是指外設(shè)和計(jì)算機(jī)間,通過數(shù)據(jù)信號線 、地線、控制線等,按位進(jìn)行傳輸數(shù)據(jù)的一種通訊方式。這種通信方式使用的數(shù)據(jù)線少,在遠(yuǎn)距離通信中可以節(jié)約通信成本,但其傳輸速度比并行傳輸?shù)汀?/span>
串口是計(jì)算機(jī)上一種非常通用的設(shè)備通信協(xié)議。大多數(shù)計(jì)算機(jī)(不包括筆記本電腦)包含兩個基于RS-232的串口。串口同時也是儀器儀表設(shè)備通用的通信協(xié)議;很多GPIB兼容的設(shè)備也帶有RS-232口。同時,串口通信協(xié)議也可以用于獲取遠(yuǎn)程采集設(shè)備的數(shù)據(jù)。
RS-232(ANSI/EIA-232標(biāo)準(zhǔn))是IBM-PC及其兼容機(jī)上的串行連接標(biāo)準(zhǔn)??捎糜谠S多用途,比如連接鼠標(biāo)、打印機(jī)或者M(jìn)odem,同時也可以接工業(yè)儀器儀表。用于驅(qū)動和連線的改進(jìn),實(shí)際應(yīng)用中RS-232的傳輸長度或者速度常常超過標(biāo)準(zhǔn)的值。RS-232只限于PC串口和設(shè)備間點(diǎn)對點(diǎn)的通信。RS-232串口通信最遠(yuǎn)距離是50英尺。
RS-232串口,串口按位(bit)發(fā)送和接收字節(jié)。盡管比按字節(jié)(byte)的并行通信慢,但是串口可以在使用一根線發(fā)送數(shù)據(jù)的同時用另一根線接收數(shù)據(jù)。典型地,串口用于ASCII碼字符的傳輸。通信使用3根線完成:(1)地線,(2)發(fā)送,(3)接收。
本文以c#中的SerialPort類為例,分析串口各參數(shù)及事件,其他平臺串口庫的操作類似。
串口事件解釋
switch(m_commctrl.GetCommEvent())
{
case 1: // vbMSCommEvSend:
“Sending”
case 2: // vbMSCommEvReceive:
“Receiving”
case 3: // vbMSCommEvCTS:
“Change in CTS Detected”
case 4: // vbMSCommEvDSR:
“Change in DSR Detected”
MSComm控件使用詳解
MSComm 控件通過串行端口傳輸和接收數(shù)據(jù),為應(yīng)用程序提供串行通訊功能。MSComm控件在串口編程時非常方便,程序員不必去花時間去了解較為復(fù)雜的API函數(shù),而且在VC、VB、Delphi等語言中均可使用。 Microsoft Communications Control(以下簡稱MSComm)是Microsoft公司提供的簡化Windows下串行通信編程的ActiveX控件,它為應(yīng)用程序提供了通過串行接口收發(fā)數(shù)據(jù)的簡便方法。具體的來說,它提供了兩種處理通信問題的方法:一是事件驅(qū)動(Event-driven)方法,一是查詢法。
1.MSComm控件兩種處理通訊的方式
MSComm控件提供下列兩種處理通訊的方式:事件驅(qū)動方式和查詢方式。
1.1 事件驅(qū)動方式
事件驅(qū)動通訊是處理串行端口交互作用的一種非常有效的方法。在許多情況下,在事件發(fā)生時需要得到通知,例如,在串口接收緩沖區(qū)中有字符,或者 Carrier Detect (CD) 或 Request To Send (RTS) 線上一個字符到達(dá)或一個變化發(fā)生時。在這些情況下,可以利用 MSComm 控件的 OnComm 事件捕獲并處理這些通訊事件。OnComm 事件還可以檢查和處理通訊錯誤。所有通訊事件和通訊錯誤的列表,參閱 CommEvent 屬性。在編程過程中,就可以在OnComm事件處理函數(shù)中加入自己的處理代碼。這種方法的優(yōu)點(diǎn)是程序響應(yīng)及時,可靠性高。每個MSComm 控件對應(yīng)著一個串行端口。如果應(yīng)用程序需要訪問多個串行端口,必須使用多個 MSComm 控件。
1.2 查詢方式
查詢方式實(shí)質(zhì)上還是事件驅(qū)動,但在有些情況下,這種方式顯得更為便捷。在程序的每個關(guān)鍵功能之后,可以通過檢查 CommEvent 屬性的值來查詢事件和錯誤。如果應(yīng)用程序較小,并且是自保持的,這種方法可能是更可取的。例如,如果寫一個簡單的電話撥號程序,則沒有必要對每接收一個字符都產(chǎn)生事件,因?yàn)槲ㄒ坏却邮盏淖址钦{(diào)制解調(diào)器的“確定”響應(yīng)。
2.MSComm 控件的常用屬性
MSComm 控件有很多重要的屬性,但首先必須熟悉幾個屬性。
CommPort 設(shè)置并返回通訊端口號。
Settings 以字符串的形式設(shè)置并返回波特率、奇偶校驗(yàn)、數(shù)據(jù)位、停止位。
PortOpen 設(shè)置并返回通訊端口的狀態(tài)。也可以打開和關(guān)閉端口。
Input 從接收緩沖區(qū)返回和刪除字符。
Output 向傳輸緩沖區(qū)寫一個字符串。
下面分別描述:
CommPort屬性 設(shè)置并返回通訊端口號。
語法 object.CommPort[value ] (value 一整型值,說明端口號。)
說明 在設(shè)計(jì)時,value 可以設(shè)置成從 1 到 16 的任何數(shù)
?。ㄈ笔≈禐?1)。但是如果用 PortOpen 屬性打開一個并不存在的端口時,MSComm 控件會產(chǎn)生錯誤 68(設(shè)備無效)。
注意:必須在打開端口之前設(shè)置 CommPort 屬性。
RThreshold 屬性:在 MSComm 控件設(shè)置 CommEvent 屬性為 comEvReceive 并產(chǎn)生 OnComm 之前,設(shè)置并返回的要接收的字符數(shù)。
語法 object.Rthreshold [ = value ](value 整型表達(dá)式,說明在產(chǎn)生 OnComm 事件之前要接收的字符數(shù)。 )
說明 當(dāng)接收字符后,若 Rthreshold 屬性設(shè)置為 0(缺省值)則不產(chǎn)生 OnComm 事件。例如,設(shè)置 Rthreshold 為 1,接收緩沖區(qū)收到每一個字符都會使 MSComm 控件產(chǎn)生 OnComm 事件。
CTSHolding 屬性:確定是否可通過查詢 Clear To Send (CTS) 線的狀態(tài)發(fā)送數(shù)據(jù)。Clear To Send 是調(diào)制解調(diào)器發(fā)送到相聯(lián)計(jì)算機(jī)的信號,指示傳輸可以進(jìn)行。該屬性在設(shè)計(jì)時無效,在運(yùn)行時為只讀。
語法: object.CTSHolding(Boolean)
Mscomm 控件的 CTSHolding 屬性設(shè)置值:
True Clear To Send 線為高電平。
False Clear To Send 線為低電平。
說明:如果 Clear To Send 線為低電平 (CTSHolding = False) 并且超時時,MSComm 控件設(shè)置 CommEvent 屬性為 comEventCTSTO (Clear To Send Timeout) 并產(chǎn)生 OnComm 事件。
Clear To Send 線用于 RTS/CTS (Request To Send/Clear To Send) 硬件握手。如果需要確定 Clear To Send 線的狀態(tài),CTSHolding 屬性給出一種手工查詢的方法。
詳細(xì)信息 有關(guān)握手協(xié)議,請參閱 Handshaking 屬性。
SThreshold 屬性: MSComm 控件設(shè)置 CommEvent 屬性為 comEvSend 并產(chǎn)生 OnComm 事件之前,設(shè)置并返回傳輸緩沖區(qū)中允許的最小字符數(shù)。
語法 object.SThreshold [ = value ]
value 整形表達(dá)式,代表在 OnComm 事件產(chǎn)生之前在傳輸緩沖區(qū)中的最小字符數(shù)。
說明:若設(shè)置 Sthreshold 屬性為 0(缺省值),數(shù)據(jù)傳輸事件不會產(chǎn)生 OnComm 事件。若設(shè)置 Sthreshold 屬性為 1,當(dāng)傳輸緩沖區(qū)完全空時,MSComm 控件產(chǎn)生 OnComm 事件。如果在傳輸緩沖區(qū)中的字符數(shù)小于 value,CommEvent 屬性設(shè)置為 comEvSend,并產(chǎn)生 OnComm 事件。comEvSend 事件僅當(dāng)字符數(shù)與 Sthreshold 交叉時被激活一次。例如,如果 Sthreshold 等于 5,僅當(dāng)在輸出隊(duì)列中字符數(shù)從 5 降到 4 時,comEvSend 才發(fā)生。如果在輸出隊(duì)列中從沒有比 Sthreshold 多的字符,comEvSend 事件將絕不會發(fā)生。
Handshake 常數(shù)
常數(shù) 值 描述
comNone 0 無握手。
comXonXoff 1 XOn/Xoff 握手。
comRTS 2 Request-to-send/clear-to-send 握手。
comRTSXOnXOff 3 Request-to-send 和 clear-to-send 握手皆可。
OnComm 常數(shù)
常數(shù) 值 描述
comEvSend 1 發(fā)送事件。
comEvReceive 2 接收事件。
comEvCTS 3 clear-to-send 線變化。
comEvDSR 4 data-set ready 線變化。
comEvCD 5 carrier detect 線變化。
comEvRing 6 振鈴檢測。
comEvEOF 7 文
件結(jié)束。
Error 常數(shù)
常數(shù) 值 描述
comEventBreak 1001 接收到中斷信號
comEventCTSTO 1002 Clear-to-send 超時
comEventDSRTO 1003 Data-set ready 超時
comEventOverrun 1006 端口超速
comEventCDTO 1007 Carrier detect 超時
comEventRxOver 1008 接收緩沖區(qū)溢出
comEventRxParity 1009 Parity 錯誤
comEventTxFull 1010 傳輸緩沖區(qū)滿
comEventDCB 1011 檢索端口 設(shè)備控制塊 (DCB) 時的意外錯誤
InputMode 常數(shù)
常數(shù) 值 描述
comInputModeText 0 (缺?。┩ㄟ^ Input 屬性以文本方式取回?cái)?shù)據(jù)。
comInputModeBinary 1 通過 Input 屬性以二進(jìn)制方式檢取回?cái)?shù)據(jù)。
CDHolding 屬性:通過查詢 Carrier Detect (CD) 線的狀態(tài)確定當(dāng)前是否有傳輸。Carrier Detect 是從調(diào)制解調(diào)器發(fā)送到相聯(lián)計(jì)算機(jī)的一個信號,指示調(diào)制解調(diào)器正在聯(lián)機(jī)。該屬性在設(shè)計(jì)時無效,在運(yùn)行時為只讀。
語法 object.CDHolding
設(shè)置值:CDHolding 屬性的設(shè)置值為:
設(shè)置 描述
True Carrier Detect 線為高電平
False Carrier Detect 線為低電平
說明:注意當(dāng) Carrier Detect 線為高電平 (CDHolding = True) 且超時時,MSComm 控件設(shè)置CommEvent 屬性為 comEventCDTO(Carrier Detect 超時錯誤),并產(chǎn)生 OnComm 事件。
注意 在主機(jī)應(yīng)用程序中捕獲一個丟失的傳輸是特別重要的,例如一個公告板,因?yàn)楹艚姓呖梢噪S時掛起(放棄傳輸)。
Carrier Detect 也被稱為 Receive Line Signal Detect (RLSD)。
數(shù)據(jù)類型 Boolean
DSRHolding 屬性:確定 Data Set Ready (DSR) 線的狀態(tài)。Data Set Ready 信號由調(diào)制解調(diào)器發(fā)送到相連計(jì)算機(jī),指示作好操作準(zhǔn)備。該屬性在設(shè)計(jì)時無效,在運(yùn)行時為只讀。
語法:object.DSRHolding
object 所在處表示對象表達(dá)式,其值是“應(yīng)用于”列表中的對象。
DSRHolding 屬性返回以下值:
值 描述
True Data Set Ready 線高
False Data Set Ready 線低
說明:當(dāng) Data Set Ready 線為高電平 (DSRHolding = True) 且超時時,MSComm 控件設(shè)置 CommEvent 屬性為 comEventDSRTO(數(shù)據(jù)準(zhǔn)備超時)并產(chǎn)生 OnComm 事件。
當(dāng)為 Data Terminal Equipment (DTE) 機(jī)器寫 Data Set Ready/Data Terminal Ready 握手例程時該屬性是十分有用的。
數(shù)據(jù)類型:Boolean
Settings 屬性: 設(shè)置并返回波特率、奇偶校驗(yàn)、數(shù)據(jù)位、停止位參數(shù)。
語法: object.Settings[ = value]
說明:當(dāng)端口打開時,如果 value 非法,則 MSComm 控件產(chǎn)生錯誤 380(非法屬性值)。
Value 由四個設(shè)置值組成,有如下的格式:
“BBBB,P,D,S”
BBBB 為波特率,P 為奇偶校驗(yàn),D 為數(shù)據(jù)位數(shù),S 為停止位數(shù)。value 的缺省值是:
“9600,N,8,1”
InputLen 屬性:設(shè)置并返回 Input 屬性從接收緩沖區(qū)讀取的字符數(shù)。
語法 object.InputLen [ = value]
InputLen 屬性語法包括下列部分:
value 整型表達(dá)式,說明 Input 屬性
從接收緩沖區(qū)中讀取的字符數(shù)。
說明:InputLen 屬性的缺省值是 0。設(shè)置 InputLen 為 0 時,使用 Input 將使 MSComm 控件讀取接收緩沖區(qū)中全部的內(nèi)容。
若接收緩沖區(qū)中 InputLen 字符無效,Input 屬性返回一個零長度字符串 (“”)。在使用 Input 前,用戶可以選擇檢查 InBufferCount 屬性來確定緩沖區(qū)中是否已有需要數(shù)目的字符。該屬性在從輸出格式為定長數(shù)據(jù)的機(jī)器讀取數(shù)據(jù)時非常有用。
EOFEnable 屬性:確定在輸入過程中 MSComm 控件是否尋找文件結(jié)尾 (EOF) 字符。如果找到 EOF 字符,將停止輸入并激活 OnComm 事件,此時 CommEvent 屬性設(shè)置為 comEvEOF,
語法:object.EOFEnable [ = value ]
EOFEnable 屬性語法包括下列部分:
value 布爾表達(dá)式,確定當(dāng)找到 EOF 字符時,OnComm 事件是否被激活,如“設(shè)置值”中所描述。
value 的設(shè)置值:
True 當(dāng) EOF 字符找到時 OnComm 事件被激活。
False (缺?。┊?dāng) EOF 字符找到時 OnComm 事件不被激活。
說明:當(dāng) EOFEnable 屬性設(shè)置為 False,OnComm 控件將不在輸入流中尋找 EOF 字符。
錯誤消息(MS Comm 控件)
硬件流控:串口通信中的硬件流控有兩種,DTE/DSR方式和RTS/CTS方式,這與DCB結(jié)構(gòu)的初始化有關(guān)系,DCB結(jié)構(gòu)中的OutxCtsFlow、 fOutxDsrFlow、fDsrSensitivity、fRtsControl、fDtrControl幾個成員的初始值很關(guān)鍵,不同的值代表不同流控,也可以自己設(shè)置流控,但建議采用標(biāo)準(zhǔn)流行的流控方式。采用硬件流控時,DTE、DSR、RTS、CTS的邏輯位直接影響到數(shù)據(jù)的讀寫及收發(fā)數(shù)據(jù)的緩沖區(qū)控制。
軟件流控:串口通信中采用特殊字符XON和XOFF作為控制串口數(shù)據(jù)的收發(fā)。與此相關(guān)的DCB成員是:fOut、fInX、XoffChar、XonChar、 XoffLim和XonLim。具體含義參見MSDN幫助。
2.硬件流控制
硬件流控制常用的有RTS/CTS流控制和DTR/DSR(數(shù)據(jù)終端就緒/數(shù)據(jù)設(shè)置就緒)流控制。
硬件流控制必須將相應(yīng)的電纜線連上,用RTS/CTS(請求發(fā)送/清除發(fā)送)流控制時,應(yīng)將通訊兩端的RTS、CTS線對應(yīng)相連,數(shù)據(jù)終端設(shè)備(如計(jì)算機(jī))使用RTS來起始調(diào)制解調(diào)器或其它數(shù)據(jù)通訊設(shè)備的數(shù)據(jù)流,而數(shù)據(jù)通訊設(shè)備(如調(diào)制解調(diào)器)則用CTS來起動和暫停來自計(jì)算機(jī)的數(shù)據(jù)流。這種硬件握手方式的過程為:我們在編程時根據(jù)接收端緩沖區(qū)大小設(shè)置一個高位標(biāo)志(可為緩沖區(qū)大小的75%)和一個低位標(biāo)志(可為緩沖區(qū)大小的25%),當(dāng)緩沖區(qū)內(nèi)數(shù)據(jù)量達(dá)到高位時,我們在接收端將CTS線置低電平(送邏輯0),當(dāng)發(fā)送端的程序檢測到CTS為低后,就停止發(fā)送數(shù)據(jù),直到接收端緩沖區(qū)的數(shù)據(jù)量低于低位而將CTS 置高電平。RTS則用來標(biāo)明接收設(shè)備有沒有準(zhǔn)備好接收數(shù)據(jù)。
常用的流控制還有還有DTR/DSR(數(shù)據(jù)終端就緒
/數(shù)據(jù)設(shè)置就緒)。我們在此不再詳述。由于流控制的多樣性,我個人認(rèn)為,當(dāng)軟件里用了流控制時,應(yīng)做詳細(xì)的說明,如何接線,如何應(yīng)用。
3.軟件流控制
由于電纜線的限制,我們在普通的控制通訊中一般不用硬件流控制,而用軟件流控制。一般通過 XON/XOFF來實(shí)現(xiàn)軟件流控制。常用方法是:當(dāng)接收端的輸入緩沖區(qū)內(nèi)數(shù)據(jù)量超過設(shè)定的高位時,就向數(shù)據(jù)發(fā)送端發(fā)出XOFF字符(十進(jìn)制的19或 Control-S,設(shè)備編程說明書應(yīng)該有詳細(xì)闡述),發(fā)送端收到XOFF字符后就立即停止發(fā)送數(shù)據(jù);當(dāng)接收端的輸入緩沖區(qū)內(nèi)數(shù)據(jù)量低于設(shè)定的低位時,就向數(shù)據(jù)發(fā)送端發(fā)出XON字符(十進(jìn)制的17或Control-Q),發(fā)送端收到XON字符后就立即開始發(fā)送數(shù)據(jù)。一般可以從設(shè)備配套源程序中找到發(fā)送的是什么字符。
應(yīng)該注意,若傳輸?shù)氖嵌M(jìn)制數(shù)據(jù),標(biāo)志字符也有可能在數(shù)據(jù)流中出現(xiàn)而引起誤操作,這是軟件流控制的缺陷,而硬件流控制不會有這個問題
關(guān)于流控制的設(shè)置問題:
流控制的設(shè)置可以用EscapeCommFunction函數(shù)來設(shè)置,也可以通過DCB結(jié)構(gòu)來設(shè)置。
在流控制方式為“無”和“軟件控制”的情況下,基本上沒有什么問題,但在“硬件控制”下,Win32手冊中說明RTS_CONTROL_HANDSHAKE控制方式的含義如下:
Enable RTS handshaking .The driver raises the RTS line when the “type_ahead”(input)buffer is less than one-half full and lowers the RTS line when the buffer is more than three-quarters full.If handshaking is enabled,it is an error for the application to adjust the line by using the EscapeCommFunction function.
也就是說,當(dāng)緩沖區(qū)快滿的時候,RTS會自動OFF通知對方暫停發(fā)送,當(dāng)緩沖區(qū)重新空出來的時候,RTS也會自動地ON。但我發(fā)現(xiàn)當(dāng)RTS變OFF以后,即使你已經(jīng)清空了緩沖區(qū),RTS也不會自動地ON,造成對方停在那里不發(fā)送。所以,如果要用硬件流控制的話,則還要在接收后最好加上檢測緩沖區(qū)大小的判斷,具體事使用ClearCommError后返回的COMSTAT.cbInQue,當(dāng)緩沖區(qū)已經(jīng)空出來的時候,要使用invoke EscapeCommFunction(hComm,SETRTS)重新將RTS設(shè)置為ON.
串口通信屬性
一、屬性
1. PortName 串口名 默認(rèn)值COM1
串口對于操作系統(tǒng)來說是一個文件,如果設(shè)置PortName為本機(jī)不存在的串口名(即文件名),如“COM7”或“COMK”,Open()打開串口將失敗,提示“端口COM7不存在”。
2. BaudRate 獲取或設(shè)置串行波特率bit/s 默認(rèn)值9600
比特率=波特率X單個調(diào)制狀態(tài)對應(yīng)的二進(jìn)制位數(shù)。
RS232是要用在近距離傳輸上最大距離為30M
RS485用在長距離傳輸最大距離1200M
3. DataBits 獲取或設(shè)置每個字節(jié)的標(biāo)準(zhǔn)數(shù)據(jù)位長度 默認(rèn)值8
當(dāng)計(jì)算機(jī)發(fā)送一個信息包,實(shí)際的數(shù)據(jù)不會是8位的,標(biāo)準(zhǔn)的值是5、7和8位。如何設(shè)置取決于你想傳送的信息。比如,標(biāo)準(zhǔn)的ASCII碼是0~127(7位)。擴(kuò)展的ASCII碼是0~255(8位)。如果數(shù)據(jù)使用簡單的文本(標(biāo)準(zhǔn) ASCII碼),那么每個數(shù)據(jù)包使用7位數(shù)據(jù)。每個包是指一個字節(jié),包括開始/停止位,數(shù)據(jù)位和奇偶校驗(yàn)位。由于實(shí)際數(shù)據(jù)位取決于通信協(xié)議的選取,術(shù)語“包”指任何通信的情況。
4. StopBits 獲取或設(shè)置每個字節(jié)的標(biāo)準(zhǔn)停止位數(shù) 默認(rèn)值One
用于表示單個包的最后一位。典型的值為1,1.5和2位。由于數(shù)據(jù)是在傳輸線上定時的,并且每一個設(shè)備有其自己的時鐘,很可能在通信中兩臺設(shè)備間出現(xiàn)了小小的不同步。因此停止位不僅僅是表示傳輸?shù)慕Y(jié)束,并且提供計(jì)算機(jī)校正時鐘同步的機(jī)會。適用于停止位的位數(shù)越多,不同時鐘同步的容忍程度越大,但是數(shù)據(jù)傳輸率同時也越慢。
5. Parity 獲取或設(shè)置奇偶校驗(yàn)檢查協(xié)議 默認(rèn)值None
在串口通信中一種簡單的檢錯方式。有四種檢錯方式:偶、奇、高和低。當(dāng)然沒有校驗(yàn)位也是可以的。對于偶和奇校驗(yàn)的情況,串口會設(shè)置校驗(yàn)位(數(shù)據(jù)位后面的一位),用一個值確保傳輸?shù)臄?shù)據(jù)有偶個或者奇?zhèn)€邏輯高位。例如,如果數(shù)據(jù)是011,那么對于偶校驗(yàn),校驗(yàn)位為0,保證邏輯高的位數(shù)是偶數(shù)個。如果是奇校驗(yàn),
校驗(yàn)位位1,這樣就有3個邏輯高位。高位和低位不真正的檢查數(shù)據(jù),簡單置位邏輯高或者邏輯低校驗(yàn)。這樣使得接收設(shè)備能夠知道一個位的狀態(tài),有機(jī)會判斷是否有噪聲干擾了通信或者是否傳輸和接收數(shù)據(jù)是否不同步。
6. ParityReplace 獲取或設(shè)置一個字節(jié),該字節(jié)在發(fā)生奇偶校驗(yàn)錯誤時替換數(shù)據(jù)流中的無效字節(jié) 默認(rèn)值63(?)
7. ReadBufferSize 獲取或設(shè)置 SerialPort 輸入緩沖區(qū)的大小 默認(rèn)值4096
ReadBufferSize 屬性忽略任何小于 4096 的值??由于 ReadBufferSize 屬性只表示 Windows 創(chuàng)建的緩沖區(qū),而 BytesToRead 屬性除了表示 Windows 創(chuàng)建的緩沖區(qū)外還表示 SerialPort 緩沖區(qū),所以 BytesToRead 屬性可以返回一個比 ReadBufferSize 屬性大的值。
8. ReadTimeout 獲取或設(shè)置讀取操作未完成時發(fā)生超時之前的毫秒數(shù) 默認(rèn)值-1
確切的說ReadTimeout設(shè)置了Read(outBuf, offset, count)超時等待的時間,即如果接收緩沖區(qū)一直沒有數(shù)據(jù),則Read()等待ReadTimeout毫秒后甩TimeoutException異常。但是在ReadTimeout期間,只要有一個數(shù)據(jù),則Read()立馬返回,而不是等待count個字節(jié)數(shù)據(jù)。ReadTimeout不是為了Read()阻塞等待count個字節(jié),那它有什么意義?
9. ReceivedBytesThreshold 獲取或設(shè)置 DataReceived 事件發(fā)生前內(nèi)部輸入緩沖區(qū)中的字節(jié)數(shù) 默認(rèn)值1
如果緩沖區(qū)一次性有4個字節(jié)數(shù)據(jù),那么DataReceived事件是觸發(fā)1次還是4次?
10. WriteBufferSize 獲取或設(shè)置串行端口輸出緩沖區(qū)的大小 默認(rèn)值2048
ReadBufferSize 屬性忽略任何小于 4096 的值。
由于 ReadBufferSize 屬性僅表示 Windows 創(chuàng)建的緩沖區(qū),所以它可以返回比 BytesToRead屬性小的值,這表示 SerialPort 和 Windows 創(chuàng)建的緩沖區(qū)。
11. WreiteTimeout 獲取或設(shè)置寫入操作未完成時發(fā)生超時之前的毫秒數(shù) 默認(rèn)值-1
寫入超時值在 Win32 通信 API 中最初被設(shè)置為 500 毫秒。此屬性允許您設(shè)置此值。此值可以設(shè)置為 0 以立即從寫入操作返回,或設(shè)置為任意正值,也可以設(shè)置為默認(rèn)的 InfiniteTimeout。此屬性不影響 BaseStream 的 BeginWrite 方法。
12. BytesToRead 獲取接收緩沖區(qū)中數(shù)據(jù)的字節(jié)數(shù)
由于 ReadBufferSize 屬性只表示 Windows 創(chuàng)建的緩沖區(qū),而 BytesToRead 屬性除了表示 Windows 創(chuàng)建的緩沖區(qū)外還表示 SerialPort 緩沖區(qū),所以 BytesToRead 屬性可以返回一個比 ReadBufferSize 屬性大的值。
13. BytesToWrite 獲取發(fā)送緩沖區(qū)中數(shù)據(jù)的字節(jié)數(shù)
14. NewLine 獲取或設(shè)置用于解釋 ReadLine( )和WriteLine( )方法調(diào)用結(jié)束的值 默認(rèn)值“\n”
15. DiscardNull 獲取或設(shè)置一個值,指示 Null 字節(jié)在端口和接收緩沖區(qū)之間傳輸時是否被忽略 默認(rèn)值false
正常情況下,特別是對于二進(jìn)制傳輸而言,此值應(yīng)該設(shè)置為 false。將此屬性設(shè)置為 true 會使 UTF32 和 UTF16 編碼字節(jié)產(chǎn)生意外結(jié)果。
16. Handshake 獲取或設(shè)置串行端口數(shù)據(jù)傳輸?shù)奈帐謪f(xié)議 默認(rèn)值None
使用握手時,將指示連接到 SerialPort 對象的設(shè)備在緩沖區(qū)中至少有 (ReadBufferSize-1024) 個字節(jié)時停止發(fā)送數(shù)據(jù)。當(dāng)緩沖區(qū)中的字節(jié)數(shù)小于等于 1024 時,將指示設(shè)備重新開始發(fā)送數(shù)據(jù)。如果設(shè)備在大于 1024 個字節(jié)的塊中發(fā)送數(shù)據(jù),可能會導(dǎo)致緩沖區(qū)溢出。
如果將 Handshake 屬性設(shè)置為 RequestToSendXOnXOff 并將 CtsHolding 設(shè)置為 false,則不會發(fā)送 XOff 字符。如果后來將 CtsHolding 設(shè)置為 true,則必須發(fā)送更多的數(shù)據(jù)后才會發(fā)送 XOff 字符。
17. Encodeing 獲取或設(shè)置傳輸前后文本轉(zhuǎn)換的字節(jié)編碼 默認(rèn)為 ASCIIEncoding
ASCIIEncoding 不提供錯誤檢測。出于安全原因,建議您使用 UTF8Encoding、UnicodeEncoding 或 UTF32Encoding 并啟用錯誤檢測。
ASCIIEncoding 僅支持 U+0000 和 U+007F之間的 Unicode 字符值。因此,UTF8Encoding、UnicodeEncoding 和 UTF32Encoding 可以更好地適應(yīng)全球化的應(yīng)用程序。
18. DtrEnable 獲取或設(shè)置一個值,該值在串行通信過程中啟用數(shù)據(jù)終端就緒 (DTR) 信號 默認(rèn)值 false
在 XON/XOFF 軟件握手、請求發(fā)送/可以發(fā)送 (RTS/CTS) 硬件握手和調(diào)制解調(diào)器通信的過程中通常啟用數(shù)據(jù)終端就緒 (DTR)。
19. RtsEnable 獲取或設(shè)置一個值,該值指示在串行通信中是否啟用請求發(fā)送 (RTS) 信號 默認(rèn)值false
請求發(fā)送 (RTS) 信號通常用在請求發(fā)送/可以發(fā)送 (RTS/CTS) 硬件握手中。
20. CDHolding 獲取端口的載波檢測行的狀態(tài)
此屬性可用于監(jiān)視端口的載波檢測行的狀態(tài)。無載波通常表明接收方已掛斷且載波已被丟棄。
21. CtsHolding 獲取“可以發(fā)送”行的狀態(tài)
在請求發(fā)送/可以發(fā)送 (RTS/CTS) 硬件握手中使用可以發(fā)送 (CTS) 行。發(fā)送數(shù)據(jù)之前端口會查詢 CTS 行。
22. DsrHolding 獲取數(shù)據(jù)設(shè)置就緒 (DSR) 信號的狀態(tài)
在數(shù)據(jù)設(shè)置就緒/數(shù)據(jù)終端就緒 (DSR/DTR) 握手中使用此屬性。通常由調(diào)制解調(diào)器將數(shù)據(jù)設(shè)置就緒 (DSR) 信號發(fā)送到端口,以表明它已經(jīng)為數(shù)據(jù)傳輸或數(shù)據(jù)接收做好準(zhǔn)備。
23. BufferSize 值1024
24. maxDataBits 值8
25. minDataBits 值5
26. SERIAL_NAME 值\\Device\\Serial
二、方法
1. Open() 打開一個新的串行端口連接
2. Close() 關(guān)閉端口連接,將 IsOpen 屬性設(shè)置為 false,并釋放內(nèi)部 Stream 對象
3. Read(Byte[], int, int) 輸入緩沖區(qū)讀取一些字節(jié)并將那些字節(jié)寫入字節(jié)數(shù)組中指定的偏移量處
4. ReadByte() 從 SerialPort 輸入緩沖區(qū)中同步讀取一個字節(jié)
5. ReadChar() 從 SerialPort 輸入緩沖區(qū)中同步讀取一個字符
6. ReadExisting() 在編碼的基礎(chǔ)上,讀取 SerialPort 對象的流和輸入緩沖區(qū)中所有立即可用的字節(jié)
6. ReadLine() 一直讀取到輸入緩沖區(qū)中的 NewLine 值
7. ReadTo() 一直讀取到輸入緩沖區(qū)中的指定 value 的字符串
8. Write(string) 將指定的字符串寫入串行端口
9. Write(Byte[], int, int) 使用緩沖區(qū)的數(shù)據(jù)將指定數(shù)量的字符寫入串行端口
10. WriteLine() 將指定字符串和NewLine值寫入輸出緩沖區(qū)
11. DiscardInBuffer() 丟棄接收緩沖區(qū)的數(shù)據(jù)
12. DiscardOutBuffer() 丟棄發(fā)送緩沖區(qū)的數(shù)據(jù)
12. static GetPortNanes() 獲取當(dāng)前計(jì)算機(jī)的串口名稱數(shù)組
三、事件
1. DataReceive事件 數(shù)據(jù)接收事件的方法
不保證對接收到的每個字節(jié)引發(fā) DataReceived 事件。 使用 BytesToRead 屬性確定緩沖區(qū)中剩余的要讀取的數(shù)據(jù)量。從 SerialPort 對象接收數(shù)據(jù)時,將在輔助線程上引發(fā) DataReceived 事件。
2. PinChanged事件 串行管腳更改事件的方法
在 SerialPort 對象進(jìn)入 BreakState 時引發(fā),但在端口退出 BreakState 時不引發(fā)。將在輔助線程上引發(fā) PinChanged 事件。
3. ErrorReceived事件 錯誤事件的方法
如果在流的尾字節(jié)上出現(xiàn)奇偶校驗(yàn)錯誤,將向輸入緩沖區(qū)添加一個值為 126 的額外字節(jié)。將在輔助線程上引發(fā) PinChanged 事件。
評論
查看更多