如何在 Visual FoxPro 中使用 MScomm32 從序列埠接收


摘要


本文提供兩種技術,您可以用來透過 Mscomm32 .ocx 控制項從序列埠接收資料。 第一次使用事件驅動的方法,而且不需要您輪詢序列埠來檢查是否存在接收到的字元。 這項技術可讓您擁有最大的彈性,而且不需要大量的編碼來防止緩衝區在執行中。 第二項技術要求您定期輪詢輸入緩衝區,以檢查是否有收到的字元。 本文將說明這兩種技術,並提供每個方法的範例。

其他相關資訊


不論您使用的是哪一種技巧,都可以設定下列屬性:
  • CommPort 屬性:請將此數值屬性設定為所需的通訊埠。 根據可用的序列埠和個別電腦的設定,有效值為1、2、3或4。 這些值分別對應 Com1、Com2、Com3 和 Com4。
  • [設定] 屬性:將此字元屬性設定為連接至序列埠的裝置所需的串列傳輸速率、同位、資料位和停止位數。 這個屬性是一個字元(以逗號分隔的清單)。 例如,若要將序列埠設定為14400波特、甚至是同位、7個數據位,以及1個停止位,請將字串設定為:
       14400,E,7,1
  • PortOpen 屬性:將此邏輯屬性設定為 true,以開啟與序列埠的通訊。 您也可以檢查這個屬性來判斷埠是否已正確開啟。

技巧1:事件導向接收

當輸入緩衝區中有等候的字元時,事件驅動技術會產生 OnComm 事件。 此外,CommEvent 屬性也會包含數值2。 若要觸發 OnComm 事件,您必須將 Rthreshold 屬性設為零以外的值(其預設值)。 Rthreshold 屬性最常見的設定是1,這表示如果在輸入緩衝區中至少有一個字元在等待,就會觸發 OnComm 事件。例如,您可以將下列程式碼放在 OnComm 事件中,以將收到的資料附加到名為 mybuffer 的表單內容:
   Procedure MyCom.OnComm     IF This.CommEvent = 2       ThisForm.mybuffer = ThisForm.mybuffer + This.Input     ENDIF   ENDPROC

技術二:輪詢輸入緩衝區

輪詢輸入緩衝區需要程式定期停止執行的動作,並檢查是否有在輸入緩衝區中等候的字元。 使用這項技術時,請將 Rthreshold 屬性保留為0(其預設值),然後檢查 InBufferCount 屬性,看它是否大於零,這表示緩衝區中有等候的字元。注意: 使用諸如檢查輸入屬性長度來導致遺失字元的方法(例如,只要存取輸入屬性,就會清空輸入緩衝區)。 請改用 InBufferCount 屬性。假設 Mscomm 控制項在表單上,且具有名稱 MyCom,且有一個名為 mybuffer 的表單內容,下列程式碼說明如何針對等候字元進行輪詢:
   Procedure myform.myproc     IF Thisform.MyCom.InBufferCount > 0       Thisform.mybuffer = Thisform.mybuffer + Thisform.MyCom.Input     ENDIF   ENDPROC
程式碼可以在計時器方法中呼叫,以便在半定期間隔檢查字元。 不過,如果預期是從序列埠接收大量的資料,技術1會降低執行輸入緩衝區的機率。