六月婷婷综合激情-六月婷婷综合-六月婷婷在线观看-六月婷婷在线-亚洲黄色在线网站-亚洲黄色在线观看网站

明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

在VC++6.0中使用串行通信控件

[摘要]北京裝甲兵工程學院崔 杰 梁計春 王國軍  目前,在用計算機進行數據傳輸時,常用的是串行通信方式。在 Visual C++的編程中,既可以用 Windows API函數進行串行通信編程,也可以利用環境自帶的控件進行編程。利用 API函數編寫實際應用程序時,往往要考慮多線程的問題,這樣編出來的程序不...
北京裝甲兵工程學院

崔 杰 梁計春 王國軍

  目前,在用計算機進行數據傳輸時,常用的是串行通信方式。在 Visual C++的編程中,既可以用 Windows API函數進行串行通信編程,也可以利用環境自帶的控件進行編程。利用 API函數編寫實際應用程序時,往往要考慮多線程的問題,這樣編出來的程序不但十分龐大,而且結構比較復雜,繼承性差,維護困難。但是使用串行通信控件就相對簡單一些,而且功能強大,性能安全可靠。

本文以 Microsoft Communications Control( version 6.0)為例,介紹串行通信控件在 VC++中的使用方法。

嵌入通信控件
使用串行通信控件前,首先要進行系統注冊。

1.在建立新工程時,將 ActiveX Controls復選框選中,表示本程序支持 ActiveX控件。

2.單擊 Project菜單,從中選擇 Add to Project,在彈出的對話框中單擊 Components and Controls選項,然后在彈出的對話框中再單擊 Registered ActiveX Controls選項。

3.在列表中選擇 Microsoft Communications Control (version6.0),形狀為帶有紅色底座的黃色電話機。單擊 Insert按鈕,確認后,會出現一個 Confirm Classes對話框,其中列出了該控件的類名( CMSComm)、頭文件名 (MSComm.h)、執行文件名 (MSComm.cpp)。

關閉此對話框,在程序主界面的控件列表中,可以看到該通信控件已被加入,拖動該控件就可以將其放入程序中。

編寫通信程序
通信控件的工作原理類似于中斷方式,當有通信事件發生時,如發送、接收數據,就會觸發 OnComm事件。在 OnComm事件的處理函數中調用 GetCommEvent()函數,由該函數的返回值即可確定是什么類型的事件,并由此做出相應的處理。

下面以接收處理串口的 GPS信號為例,說明該控件在編程中的具體應用。

利用 MFC生成一個基于對話框的應用程序,對話框中的控件及其相應的消息與響應函數如下表所示。


控件名稱 控件 ID 對應變量
通信控件 IDC_MSCOMM m_Comm
接收按鈕 IDC_BUTTON_RECEIVEGPSDATA OnbuttonStartreceivegps()
GPS信號顯示 IDC_EDIT_COMDATA m_comdata
停止接收按鈕 IDC_BUTTON_ENDRECEIVEGPSDATA OnbuttonEndreceivegps()

設置控件各部分屬性:

CommPort: 1;

DTREnable: 1;

InBufferSize: 4096;

EOFEnable: TRUE;

Handshaking: nohandshaking;

InputMode: 1- Binary;

NullDiscard: False;

Rthreshold: 250;

RTSEnable: False;

Settings: 9600, n, 8, 1;

Sthreshold: 0。

部分程序如下:

//開始接收 GPS信號

void CGpsDlg::OnButtonStartreceivegps()

{

//判斷串口的狀態,如果是關閉狀態,則打開

if(!m_Comm.GetPortOpen() )

//打開串口

m_Comm.SetPortOpen(TRUE);

UpdateData(TRUE);

}

//停止接收 GPS的信號

void CGpsDlg::OnButtonEndreceivegps();

{

//判斷串口的狀態,如果是打開狀態,則關閉

if( m_Comm.GetPortOpen() )

m_Comm.SetPortOpen(FALSE);

UpdateData(FALSE);

}

//相應的 OnComm事件處理

void CGpsDlg::OnComm()

{

m_comdata.Empty();

VARIANT m_input1;

COleSafeArray m_input2;

LONG length,i;

BYTE data[1024];

CString str;

//接收緩沖區內字符

if(m_Comm.GetCommEvent()== 2)

{

m_comdata.Empty();

//讀取緩沖區內的數據

m_input1=m_Comm.GetInput();

//將 VARIANT型變量轉換為 ColeSafeArray型變量

m_input2=m_input1;

//確定數據長度

length=m_input2.GetOneDimSize();

//將數據轉換為 BYTE型數組

for(i=0;i< length;i++ )

m_input2.GetElement(& i,data+ i);

//將數組轉換為 CString型變量

for(i=0;i< length;i++ ) {

char a=* (char* )(data+ i);

str.Format("% c",a);

m_comdata+ = str;

}

/*在上面的程序中,先將 VARIANT型變量轉換為 ColeSafeArray型變量,再將其轉換為 BYTE型數組,然后將數組轉換為 CString型變量,以滿足不同的變量類型顯示數據的需要。* /

//提取 GPS信號

CString m_zjz;

m_zjz=m_comdata;

//尋找 GPS信號的頭標志

int s;

s=m_zjz.Find("$ GPRMC,");

CString m_gps;

//NUM為所提取 GPS信號的長度

m_gps=m_zjz.Mid(s,NUM);

int x;

x=m_gps.GetLength();

//信號長度不符合要求,則拒絕接收

if (x != NUM) {

m_gps.Empty();

}

//尋找所需要的 GPS信號的頭標志

int y;

y=m_gps.Find("$ GPRMC,");

if (y != 0)

{

m_gps.Empty();

}

//m- gpsdata是已聲明的類成員變量

m_gpsdata=m_gps;

}

}

這樣就將 GPS信號的數據流提取出來了。再通過簡單的字符串操作就可以分別找出 GPS信號中的經度、緯度以及相對應的格林威治時間等定位信息。

以上程序在 Win98/95/NT、 P133 PC機、 ROCKWELL JUPITER GPS接收板環境下調試通過。


主站蜘蛛池模板: 中文婷婷 | 天天操天天弄 | 四虎永久在线观看视频精品 | 中文字幕天堂最新版在线网 | 亚洲 自拍 欧美 综合 | 特别黄的免费视频大片 | 日本不卡一区二区三区在线观看 | 亚洲午夜久久久 | 日本视频网站在线观看 | 无码中文资源在线播放 | 欧美一级看片免费观看视频在线 | 日本性视频网站 | 亚洲专区路线一路线二 | 欧美专区在线播放 | 日本性视频网站 | 热の综合热の国产热の潮小说 | 四色婷婷婷婷色婷婷开心网 | 天天五月天丁香婷婷深爱综合 | 性刺激欧美三级在线现看中文 | 日韩免费福利视频 | 日韩三级免费 | 日韩a级毛片免费视频 | 色成网| 日日插夜夜操 | 啪啪网站免费观看 | 天天射天天搞 | 日韩欧美亚洲综合一区二区 | 午夜视频高清在线aaa | 亚洲欧美综合在线观看 | 天天插天天透 | 午夜视频你懂的 | 性色视频在线观看 | 天天爱夜夜做 | 四虎在线观看视频 | 色噜噜狠狠一区二区三区 | 亚洲视频在线播放 | 日韩精品免费看 | 亚洲一区二区成人 | 手机午夜视频 | 日本永久免费 | 中文字幕欧美日韩 |