基於VC的接收機串列埠程式設計

2021-08-22 01:26:05 字數 2927 閱讀 4856

序列介面是微機與外部裝置的主要通訊介面之一。只需要一條訊號線就可以進行單向資料傳送。由於線路簡單,**相對較低,得到了廣泛應用。

如果想利用序列介面來實現近距離通訊(通常15公尺以內),可以採用圖1的連線方式來實現。該接收機採用eia-rs232c序列標準進行通訊,其資料通訊訊號形式如下表:

波特率(baud)

4800, 9600, or 19200 bps

資料位(databit)

8 bits

停止位(stopbit)

2 bits

校驗位(parity)

non流控制(flow control)

xon / xoff

接收機接收通過串列埠接收來自pc機的控制命令後,進行相應的動作,完成相應的設定。那麼如何在windows環境下快速有效地開發串列埠通訊程式呢?一般情況下的串列埠通訊無非採用兩種方法:一是利用windows 的通訊api 函式, 二是利用一些高階語言(如v

c++等)來實現。windows 的api 函式雖然使用面很廣,但由於比較複雜而有一定的難度,而visual

c++ 的activatex 控制項, 由於其靈活性與易用性而受廣大計算機開發者的青睞,正成為主要的開發工具。

二、activex控制項介紹

activex是windows 下進行應用程式開發的嶄新技術,它的核心內容是元件物件模型com(component object model)。activex控制項包括一系列的屬性、方法和事件,使用activex控制項的應用程式和activex控制項之間的工作方式是客戶/

伺服器方式,即應用程式通過activex控制項提供的介面來訪問activex控制項的功能。

microsoft communication control是microsoft公司提供的簡化windows下序列介面收發資料的簡便方法。下面介紹在visual

c++6.0環境下,用activex通訊控制項來程式設計實現串列埠通訊的方法和技巧。

三、串列埠通訊的程式設計實現

用vc++的active x控制項來實現串列埠通訊,是一種快速簡潔而又簡單的程式設計方法。下面簡單介紹實現過程。

3.1 在程式中嵌入通訊控制項

單擊project選單中選擇add to project,再單components and controls,從彈出的對話方塊中單擊registered activex controls,然後在列表框中選擇microsoft communications control, version 6.0,單擊ok。之後注意到project中新增加了乙個類。通過檢視類mscomm的原始檔mscomm.cpp,我們可以了解這個控制項的屬性和使用方法,其中的get...函式可以用來訪問該屬性的當前值,而set...函式則用來設定該屬性的新值。

3.2 利用串列埠通訊類程式設計實現通訊功能

在新增了串列埠通訊類之後,就可以在相應的程式中建立乙個通訊控制項,然後通過呼叫串列埠通訊類的成員函式來完成相應的資料接收和傳送功能。

四、 串列埠通訊的使用方法和技巧

4.1 通過人工對映事件自動響應函式

通訊控制項的工作原理類似與中斷方式,當有通訊事件發生時(如傳送資料、接收資料等),就會觸發oncomm事件,在該事件的處理函式中呼叫oncommevent()函式,通過返回值即可確定是那類事件,再作出相應的處理。

但需要注意的是,oncommevent()函式並不是自動對映的,必須手工新增該事件對映函式。其方法如下:

示例中是在主框架類中呼叫通訊控制項類函式。所以先要在mainfrm.h新增如下訊息對映函式。

afx_msg void oncommevent();

然後在mainfrm.cpp中新增如下**

begin_eventsink_map(cmainframe, cframewnd)

on_event(cmainframe, id_commctrl, 1, oncommevent, vts_none)

end_eventsink_map()

接下來就可以在void cmainframe::oncommevent()函式中處理各種串列埠響應事件。

串列埠收發資料時,若資料只用 ansi 字符集,則用文字方式收發。對其它字元資料,如資料中有嵌入控制字元、nulls 等等,則使用二進位制方式。

其中乙個需要注意的問題是函式setinput()傳送的是variant型變數,而我們輸入的一般是cstring型變數,因此必須進行轉換。先將cstring型變數轉換為byte型陣列,再將轉換為colesafearray型變數,然後將其組轉換為variant型變數傳送出去。這個轉換過程看起來比較複雜,但它可以滿足用不同的變數型別來傳送資料。在串列埠接收資料時,也要做類似的變數型別轉換處理。該轉換的主要**實現如下所示:

void cmainframe::onsenddata(cstring m_strinputdata,int kind)

{cstring str,string;

variant strreceive;

byte data[256];

long i,length;

colesafearray m_input2;

length=m_strinputdata.getlength();

//將cstring型變數轉換為byte型陣列

for(i=0;i

我們知道,每個使用的串列埠通訊控制項對應著乙個串列埠。如果應用程式需要訪問多個串列埠,必須使用多個控制項。通常,pc機配有兩個序列介面,分別以com1和com2標稱。所以如果需要在同一應用程式中,對兩個接收機進行遙控時,就可以通過建立兩個串列埠通訊控制項來實現。並且pc機也可以根據需要新增新的序列介面硬體,所以通過多個串列埠通訊控制項就能很容易地實現與多個外部裝置的通訊。

五、 結束語

本文實現了在windows98下用visual

c++來開發某偵察接收機與pc機序列通訊的介面程式,並且利用activex控制項大大簡化了程式設計的難度。本文給出了部分關鍵實現的**,並根據作者開發經驗,指出了需要注意的問題,具有一定的實用意義。

VC 實現串列埠通訊下GP接收機定位資料的提取

定位資訊的接收 通常gps定位資訊接收系統主要由gps接收天線 變頻器 訊號通道 微處理器 儲存器以及電源等部分組成。由於gps定位資訊內容較少,因此多用rs 232串列埠將定位資訊 nema0183語句 從gps接收機傳送到計算機中進行資訊提取處理。從串列埠讀取資料有多種方法,在此直接使用 win...

接收機中LNA的NF估計

lna對接收機的引數影響 1 滿足接收系統靈敏度要求時,lna的雜訊係數如何估算。對於低雜訊放大器的雜訊係數nf公式如下 f si ni so no 級聯的雜訊係數公式 f f1 f2 1 g1 f3 1 g1g2 假設接收機輸入端的最小訊雜比要求為snrmin,那麼系統的靈敏度為 smin snr...

新坑 基於AD9361的手持監測偵察接收機

科創論壇 虎哥 上次測量了ad9361的抗阻塞性能 原本聽各路大神說坑多,除非加上覆雜的預選器否則根本沒法用,但實測結果推翻了各路 大神 的說法。從測試來看,效能雖然不算太好,但也算是可以的。除非高檔監測接收機,普通接收機如果不開衰減,基本無法抵抗0dbm量級的阻塞訊號,比如無線電愛好者常用的幾款手...