1.MSComm控件兩種處理通訊的方式?
1.1 事件驅動方式
事件驅動通訊是處理串行端口交互作用的一種非常有效的方法。在許多情況下,在事件發生時需要得到通知,例如,在串口接收緩沖區中有字符,或者 Carrier Detect (CD) 或 Request To Send (RTS) 線上一個字符到達或一個變化發生時。在這些情況下,可以利用 MSComm 控件的 OnComm 事件捕獲并處理這些通訊事件。OnComm 事件還可以檢查和處理通訊錯誤。所有通訊事件和通訊錯誤的列表,參閱 CommEvent 屬性。在編程過程中,就可以在OnComm事件處理函數中加入自己的處理代碼。這種方法的優點是程序響應及時,可靠性高。每個MSComm 控件對應著一個串行端口。如果應用程序需要訪問多個串行端口,必須使用多個 MSComm 控件。
1.2 查詢方式?
查詢方式實質上還是事件驅動,但在有些情況下,這種方式顯得更為便捷。在程序的每個關鍵功能之后,可以通過檢查 CommEvent 屬性的值來查詢事件和錯誤。如果應用程序較小,并且是自保持的,這種方法可能是更可取的。例如,如果寫一個簡單的電話撥號程序,則沒有必要對每接收一個字符都產生事件,因為唯一等待接收的字符是調制解調器的“確定”響應。?
2.MSComm控件的常用屬性
MSComm1.Settings:=’9600,n,8,1’; //設置波特率?,校驗位,數據位,停止位
Settings屬性:?設置串口的波特率?,校驗位,數據位,停止位,?’9600,n,8,1’表示波特率為9600,無奇偶校 ? ? ? ? ? 驗,數據位為8為,1位停止位
MSComm1.InBufferSize:=1024;????//??接受緩沖區大小?
InBufferSize?屬性:接收緩沖區的大小,默認值為1024,也可以自己設定,比如, MSComm1.InBufferSize:=2000,則接收緩沖區的大小為2000字節
MSComm1.OutBufferSize:=1024;???//??發送緩沖區大小?
OutBufferSize屬性:發送緩沖區的大小,默認值為1024,也可以自己設定。 ?
?
MSComm1.InBufferCount:=0;?????//清空接受緩沖區?
InBufferCount屬性:當前接收緩沖區接收到的數據的長度,?count:=MSComm1.InBufferCount,
? ? ? ? ? ? ? ? ?則count值就是接收緩沖區接收到的數據的長度,對InBufferCount賦 ? ? ? ? ? ? ? ? ? ? ? ? 值MSComm1.InBufferCount:=0,可以清空接受緩沖區
MSComm1.OutBufferCount:=0;????//清空發送緩沖區?
OutBufferCount屬性:當前發送緩沖區中數據的長度,對OutBufferCount?賦值?
? ? ? ? ? ? ? ? ? MSComm1. OutBufferCount:=0,可以清空發送緩沖區
?
MSComm1.InputMode:=comInputModeText;//?以文本方式取回數據?
MSComm1.InputMode:=comInputModeBinary; //設置接收數據模式為二進制形式?
InputMode屬性:串口接收數據的模式, comInputModeText(0)表示以文本(ASCII)方式取回數據,
?????????????????comInputModeBinary(1)表示以二進制方式取回數據
?????????????????comInputModeText, comInputModeBinary為預定義常量,分別表示0,1
RcvByte:=MSComm1.Input?
input屬性:通過Input屬性可以讀取串口中接收到的數據,RcvByte:=MSComm1.Input表示讀取串口接收到的數據?,其中RcvByte的數據類型為:?array of??Byte?或array of??Variant.在讀取之前先設置RcvByte的長度:SetLength(RcvByte,len),如果一次讀取所有數據,則SetLength(RcvByte, MSComm1.InBufferCount)
MSComm1.Output:=?OutputDat
Output屬性:通過Output屬性可以發送數據,?MSComm1.Output:=OutputDat,則將OutputDat中的數據發送出去,其中OutputDat數據類型為array of??Byte,發送前要設置OutputDat的長度, SetLength(OutputDat,len),然后向OutputDat中填入數據,再清空發送緩沖區MSComm1.OutBufferCount:=0,然后再發送MSComm1.Output:=OutputDat
MSComm1.InputLen:=0; ? //?一次讀取所有數據?
?
InputLen屬性:一次從Input屬性中讀取數據的長度, MSComm1.InputLen:=1,表示一次讀取一個字節,如果MSComm1.InputLen:=0,則表示一次讀取全部數據
MSComm1.SThreshold:=0; //一次發送所有數據?,發送數據時不產生OnComm?事件
?
SThreshold屬性:通過該屬性設置產生OnComm?事件(發送時產生)的閥值,若MSComm1.SThreshold:=0,?則一次發送所有數據?,發送數據時不產生OnComm?事件,?若MSComm1.SThreshold:=5,當發送緩沖區的字節數從5字節減少到4字節時,?產生OnComm?事件
MSComm1.RThreshold:=1; //每接收1個字節就產生一個OnComm?事件?
RThreshold屬性:?通過該屬性設置產生OnComm?事件(接收時產生)的閥值,若MSComm1.RThreshold:=0,不產生OnComm?事件,若MSComm1.RThreshold:=5,接收緩沖區每收到5字節時,則產生OnComm?事件
MSComm1.PortOpen:=True;???????//打開串口
PortOpen屬性:設置端口的打開與關閉,打開端口MSComm1.PortOpen:=True,
關閉端口MSComm1.PortOpen:=False
MSComm1.CommPort:=CommPort;?
CommPort屬性:設置端口號, MSComm1.CommPort:=1,?設置端口號為COM1
CommEvent屬性:?常用的兩個comEvReceive, comEvSend
?
OnComm???常數??
常數??????????????值?????????描述????
comEvSend?????????1??????發送事件。????
comEvReceive ? ? ?2??????接收事件。????
comEvCTS??????????3??????clear-to-send???線變化。????
comEvDSR??????????4??????data-set?? ready???線變化。????
comEvCD???????????5??????carrier?? detect???線變化。????
comEvRing?????????6??????振鈴檢測。????
comEvEOF??????????7??????文件結束。? ??
ComPort屬性:
設置并返回通訊端口號。
語法 object.CommPort[value ] (value 一整型值,說明端口號。)?
說明 在設計時,value 可以設置成從 1 到 16 的任何數(缺省值為 1)。但是如果用 PortOpen 屬性打開一個并不存在的端口時,MSComm 控件會產生錯誤 68(設備無效)。
注意:必須在打開端口之前設置 CommPort 屬性。
RThreshold屬性:在 MSComm 控件設置 CommEvent 屬性為 comEvReceive 并產生 OnComm 之前,設置并返回的要接收的字符數。
語法 object.Rthreshold [ = value ](value 整型表達式,說明在產生 OnComm 事件之前要接收的字符數。 )
說明 當接收字符后,若 Rthreshold 屬性設置為 0(缺省值)則不產生 OnComm 事件。例如,設置 Rthreshold 為 1,接收緩沖區收到每一個字符都會使 MSComm 控件產生 OnComm 事件。
CTSHolding屬性:確定是否可通過查詢 Clear To Send (CTS) 線的狀態發送數據。Clear To Send 是調制解調器發送到相聯計算機的信號,指示傳輸可以進行。該屬性在設計時無效,在運行時為只讀。
語法: object.CTSHolding(Boolean)
Mscomm 控件的 CTSHolding 屬性設置值:
True Clear To Send 線為高電平。?
False Clear To Send 線為低電平。?
說明:如果 Clear To Send 線為低電平 (CTSHolding = False) 并且超時時,MSComm 控件設置 CommEvent 屬性為 comEventCTSTO (Clear To Send Timeout) 并產生 OnComm 事件。
Clear To Send 線用于 RTS/CTS (Request To Send/Clear To Send) 硬件握手。如果需要確定 Clear To Send 線的狀態,CTSHolding 屬性給出一種手工查詢的方法。
詳細信息 有關握手協議,請參閱 Handshaking 屬性。
SThreshold屬性:?MSComm 控件設置 CommEvent 屬性為 comEvSend 并產生 OnComm 事件之前,設置并返回傳輸緩沖區中允許的最小字符數。
語法 object.SThreshold [ = value ]
value 整形表達式,代表在 OnComm 事件產生之前在傳輸緩沖區中的最小字符數。?
說明:若設置 Sthreshold 屬性為 0(缺省值),數據傳輸事件不會產生 OnComm 事件。若設置 Sthreshold 屬性為 1,當傳輸緩沖區完全空時,MSComm 控件產生 OnComm 事件。如果在傳輸緩沖區中的字符數小于 value,CommEvent 屬性設置為 comEvSend,并產生 OnComm 事件。comEvSend 事件僅當字符數與 Sthreshold 交叉時被激活一次。例如,如果 Sthreshold 等于 5,僅當在輸出隊列中字符數從 5 降到 4 時,comEvSend 才發生。如果在輸出隊列中從沒有比 Sthreshold 多的字符,comEvSend 事件將絕不會發生。
HandShake 常數
常數 ? ? ? ? ? ? ? 值 ? ? ? ? ? 描述?
comNone ? ? ? ? ? ?0 ? ? ? ? ?無握手。?
comXonXoff ? ? ? ? 1 ? ? ? ? ?XOn/Xoff 握手。?
comRTS ? ? ? ? ? ? 2 ? ? ? ? ?Request-to-send/clear-to-send 握手。?
comRTSXOnXOff ? ? ?3 ? ? ? ? ?Request-to-send 和 clear-to-send 握手皆可。?
OnComm 常數
常數 ? ? ? ? ? ? ? 值 ? ? ? ? ? 描述?
comEvSend ? ? ? ? ?1 ? ? ? ? 發送事件。?
comEvReceive ? ? ? 2 ? ? ? ? 接收事件。?
comEvCTS ? ? ? ? ? 3 ? ? ? ? clear-to-send 線變化。?
comEvDSR ? ? ? ? ? 4 ? ? ? ? data-set ready 線變化。?
comEvCD ? ? ? ? ? ?5 ? ? ? ? carrier detect 線變化。?
comEvRing ? ? ? ? ?6 ? ? ? ? 振鈴檢測。?
comEvEOF ? ? ? ? ? 7 ? ? ? ? 文件結束。?
Error常數
常數 ? ? ? ? ? ? ?值 ? ? ? ? ? ? 描述?
comEventBreak ? ?1001 ? ? ? ?接收到中斷信號?
comEventCTSTO ? ?1002 ? ? ? ?Clear-to-send 超時?
comEventDSRTO ? ?1003 ? ? ? ?Data-set ready 超時?
comEventFrame ? ?1004 ? ? ? ?幀錯誤?
comEventOverrun ?1006 ? ? ? ?端口超速?
comEventCDTO ? ? 1007 ? ? ? ?Carrier detect 超時?
comEventRxOver ? 1008 ? ? ? ?接收緩沖區溢出?
comEventRxParity 1009 ? ? ? ?Parity 錯誤?
comEventTxFull ? 1010 ? ? ? ?傳輸緩沖區滿?
comEventDCB ? ? ?1011 ? ? ? ?檢索端口 設備控制塊 (DCB) 時的意外錯誤?
InputMode常數?
常數 ? ? ? ? ? ? ? ? ? 值 ? ? ? ? ? ? ? ? ? ? ?描述?
comInputModeText ? ? ? 0 ? ? ? ? ? (缺省)通過 Input 屬性以文本方式取回數據。?
comInputModeBinary ? ? 1 ? ? ? ? ? ?通過 Input 屬性以二進制方式檢取回數據。?
CDHolding屬性:通過查詢 Carrier Detect (CD) 線的狀態確定當前是否有傳輸。Carrier Detect 是從調制解調器發送到相聯計算機的一個信號,指示調制解調器正在聯機。該屬性在設計時無效,在運行時為只讀。
語法 object.CDHolding
設置值:CDHolding 屬性的設置值為:?
設置 描述?
True Carrier Detect 線為高電平?
False Carrier Detect 線為低電平?
說明:注意當 Carrier Detect 線為高電平 (CDHolding = True) 且超時時,MSComm 控件設置CommEvent 屬性為 comEventCDTO(Carrier Detect 超時錯誤),并產生 OnComm 事件。
注意 在主機應用程序中捕獲一個丟失的傳輸是特別重要的,例如一個公告板,因為呼叫者可以隨時掛起(放棄傳輸)。
Carrier Detect 也被稱為 Receive Line Signal Detect (RLSD)。
數據類型 Boolean
DSRHolding屬性:確定 Data Set Ready (DSR) 線的狀態。Data Set Ready 信號由調制解調器發送到相連計算機,指示作好操作準備。該屬性在設計時無效,在運行時為只讀。
語法:object.DSRHolding
object 所在處表示對象表達式,其值是“應用于”列表中的對象。
DSRHolding 屬性返回以下值:
值 描述?
True Data Set Ready 線高?
False Data Set Ready 線低?
說明:當 Data Set Ready 線為高電平 (DSRHolding = True) 且超時時,MSComm 控件設置 CommEvent 屬性為 comEventDSRTO(數據準備超時)并產生 OnComm 事件。
當為 Data Terminal Equipment (DTE) 機器寫 Data Set Ready/Data Terminal Ready 握手例程時該屬性是十分有用的。
數據類型:Boolean
Setting屬性:?設置并返回波特率、奇偶校驗、數據位、停止位參數。
語法: object.Settings[ = value]
說明:當端口打開時,如果 value 非法,則 MSComm 控件產生錯誤 380(非法屬性值)。
Value 由四個設置值組成,有如下的格式:
"BBBB,P,D,S"
BBBB 為波特率,P 為奇偶校驗,D 為數據位數,S 為停止位數。value 的缺省值是:
"9600,N,8,1"
InputLen屬性:設置并返回 Input 屬性從接收緩沖區讀取的字符數。
語法 object.InputLen [ = value]
InputLen 屬性語法包括下列部分:
value 整型表達式,說明 Input 屬性從接收緩沖區中讀取的字符數。?
說明:InputLen 屬性的缺省值是 0。設置 InputLen 為 0 時,使用 Input 將使 MSComm 控件讀取接收緩沖區中全部的內容。
若接收緩沖區中 InputLen 字符無效,Input 屬性返回一個零長度字符串 ("")。在使用 Input 前,用戶可以選擇檢查 InBufferCount 屬性來確定緩沖區中是否已有需要數目的字符。該屬性在從輸出格式為定長數據的機器讀取數據時非常有用。
EofEnable屬性:確定在輸入過程中 MSComm 控件是否尋找文件結尾 (EOF) 字符。如果找到 EOF 字符,將停止輸入并激活 OnComm 事件,此時 CommEvent 屬性設置為 comEvEOF,
語法:object.EOFEnable [ = value ]
EOFEnable 屬性語法包括下列部分:
value 布爾表達式,確定當找到 EOF 字符時,OnComm 事件是否被激活,如“設置值”中所描述。?
value 的設置值:
True 當 EOF 字符找到時 OnComm 事件被激活。?
False (缺省)當 EOF 字符找到時 OnComm 事件不被激活。?
說明:當 EOFEnable 屬性設置為 False,OnComm 控件將不在輸入流中尋找 EOF 字符。
錯誤消息:(MS Comm 控件)
下表列出 MSComm 控件可以捕獲的錯誤:
值 描述?
380 無效屬性值 comInvalidPropertyValue
383 屬性為只讀 comSetNotSupported
394 屬性為只讀 comGetNotSupported?
8000 端口打開時操作不合法 comPortOpen
8001 超時值必須大于 0?
8002 無效端口號 comPortInvalid
8003 屬性只在運行時有效?
8004 屬性在運行時為只讀?
8005 端口已經打開 comPortAlreadyOpen
8006 設備標識符無效或不支持該標識符?
8007 不支持設備的波特率?
8008 指定的字節大小無效?
8009 缺省參數錯誤?
8010 硬件不可用(被其它設備鎖定)?
8011 函數不能分配隊列?
8012 設備沒有打開 comNoOpen?
8013 設備已經打開?
8014 不能使用 comm 通知?
8015 不能設置 comm 狀態 comSetCommStateFailed
8016 不能設置 comm 事件屏蔽?
8018 僅當端口打開時操作才有效 comPortNotOpen?
8019 設備忙?
8020 讀 comm 設備錯誤 comReadError
8021 為該端口檢索設備控制塊時的內部錯誤 comDCBError?
端口初始化設置:
procedure TFMonitorCenter.SBtnOpenPortClick(Sender: TObject); vari,CommPort:integer;Speed,DataBit,StopBit,CheckBit,SetString:string; beginCommPort:=1;Speed:='115200';DataBit:='8';CheckBit[1]:='N';StopBit:='1';if MSComm1.PortOpen=False thenbeginMSComm1.CommPort:=CommPort; //設置端口SetString:=Speed+','+CheckBit[1]+','+DataBit+','+StopBit;MSComm1.Settings:=SetString; //設置波特率 ,校驗位,數據位,停止位MSComm1.InBufferSize:=1024; // 接受緩沖區大小MSComm1.OutBufferSize:=1024; // 發送緩沖區大小MSComm1.InBufferCount:=0; //清空接受緩沖區MSComm1.OutBufferCount:=0; //清空發送緩沖區MSComm1.InputMode:=comInputModeText;// 以文本方式取回數據MSComm1.InputMode:=comInputModeBinary; //設置接收數據模式為二進制形式MSComm1.InputLen:=0;// 一次讀取所有數據 /MSComm1.SThreshold:=0;//一次發送所有數據 ,發送數據時不產生OnComm 事件MSComm1.RThreshold:=1; 每接收1個字節就產生一個OnComm 事件MSComm1.PortOpen:=True; //打開串口end; end;本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
網絡推廣與網站優化公司(網絡優化與推廣專家)作為數字營銷領域的核心服務提供方,其價值在于通過技術手段與策略規劃幫助企業提升線上曝光度、用戶轉化率及品牌影響力。這...
在當今數字化時代,公司網站已成為企業展示形象、傳遞信息和開展業務的重要平臺。然而,對于許多公司來說,網站建設的價格是一個關鍵考量因素。本文將圍繞“公司網站建設價...
在當今的數字化時代,企業網站已成為企業展示形象、吸引客戶和開展業務的重要平臺。然而,對于許多中小企業來說,高昂的網站建設費用可能會成為其發展的瓶頸。幸運的是,隨...
cf穿越火線卡代碼是什么意思?CF一般表示CPU出現故障。1.代碼FF、00、C0、D0、CF、F1或無表示CPU出現故障。2.代碼C1、C6、C3、D3、D4、D6、D8、B0、A7、E1表示內存不足。3.代碼24、25、26、01、0A、0B、2A、2B和31表示顯卡不是。4.代碼C1、C6、C3、01、02的組合循環跳轉大多是I/O壞或BIOS閃。5.代碼05,ED,41直接刷BIOS。6....
彩虹島瓦爾哈拉怎么走?1瓦爾哈拉殺死前兩個怪手然后在傳送門下殺死兩個流星錘打開門。其他怪物不用打,2不用殺怪物,可以去4和4,也沒有怪物可以殺。關鍵是從4傳送門到3(去3就是從4到5,然后一條直線到3)和6把圣女貞德全部干掉,傳送門就開了。注意,你可以去一個從4底只有一個圣女貞德的封閉的地方。其他的奇怪可以忽略。彩虹島瓦爾基里在哪里?瓦哈拉,是嗎?你在做第二份工作嗎?瓦哈拉在太空的頂端。彩虹島魔法...
399美元等于多少人民幣?在今天的場外交易中,匯率為人民幣=101393.039]=RMB=101387.039=287.039美元]=287.039美元=287.039美元]=287.039美元]=397.039美元]=RMB=287.039美元]=287.039.039美元]=287美元]=397.039.039美元]=RMB=1039.039.039美元...