VS2008下用MFC 的MSComm控件編寫串口程序

可以在:http://download.csdn.net/detail/plutus_lee/4525446 下載詳細文檔。

首先感謝網絡資源吧,作爲一個自動化專業出身的,不懂串口實在讓我有點無奈,本文參考xinzrjay原創的在VC++6.0下編寫串口調試助手,雖然比較詳細,但難免有錯誤,感謝xinzrjay吧,提供了較好的模板。

首先啓動VS2008,文件——新建——項目(快捷鍵Ctrl+Shift+N),

項目類型——Visual C++——MFC——模板——MFC應用程序,

l  名稱(如port1)。

l  位置(如桌面下的文件夾‘配置軟件’)。

l  解決方案名稱(會隨着名稱自動生成,建議不要修改)

點擊確定,進入MFC應用程序嚮導。

選擇下一步,不要直接點完成。選擇——基於對話框,把使用Unicode庫(N)點掉。

然後下一步,把“關於”框(B)點掉,可以點完成了。

進入界面

把對話框窗口中的靜態文本控件,兩個按鈕控件都刪掉,(選中後按Delete鍵即可),修改後的界面如下圖。

在對話框中添加兩個組框(Group Box),組框中分別添加一個文本編輯控件(Edit Control),另外加入一個按鈕控件(Button)這些都在工具箱中,選中後在對話框窗口中調節控件大小。

1.        需要修改所添加的控件一些屬性,如鼠標左鍵選中上面的組框,單擊鼠標右鍵選屬性——Caption——改爲:顯示區。

2.        修改下面的組框:屬性——Caption——發送區。

3.        修改上面的示例編輯框屬性:

l  ID——IDC_EDIT_RECV;

l       Multiline——True;

l  Want Return——True;

l  Vertical Scroll——True;

l  Auto VScroll——True;

4.        修改下面的示例編輯框屬性:

l   ID——IDC_EDIT_SEND;

l   Multiline——True;

l  Vertical Scroll——True;

5.        修改按鈕控件的屬性:

l  ID——IDC_BUTTON_SEND;

l  Caption——發送

修改好屬性後的窗口如下圖:

接下來添加關鍵的控件,選擇工具——選擇工具箱項——COM組件——MicrosoftCommunications Control,version 6.0——確定,這時在工具箱下就有了該控件,小電話標誌。

在工具箱中選中,然後把該控件拖到對話框中,如下圖:

界面完成後可以添加代碼了,要在類中添加變量和函數,先添加變量

在類視圖下,選中Cport1Dlg,單擊鼠標右鍵——添加——添加變量——控件變量(O)

控件ID(I)——IDC_EDIT_RECV;類別(T)——Value;變量名——m_strRecvData,完成。如下圖:

同理添加另外控件變量控件ID(I)——IDC_EDIT_SEND;類別(T)——Value;變量名——m_strSendData。如下圖:

同理添加另外控件變量控件ID(I)——IDC_MSCOMM1;類別(T)——Control;變量名——m_cComm,完成。如下圖:

接下來添加函數(事件處理程序):

選中MSComm控件,單擊鼠標右鍵,選擇——添加事件處理程序(A),彈出窗口,把函數處理程序名稱修改爲OnComm,點擊添加編輯,跳轉到程序部分,先不要添加。

同理,爲按鈕控件添加事件處理程序,函數處理程序名稱:OnButtonSend。

代碼部分是重點,(我電腦設置的是打開串口2,),實際上VS2008與VC++6.0中相對應的函數(類的方法)名發生了一些變化,這就需要一些修改要把在VC++6.0中的某些函數中的Get改爲get_ ,要把Set改爲put_  。

1.  我們在OnInitDialog()中添加初始化語句,用於設置串口通信的屬性和打開串口

BOOL Cport1Dlg::OnInitDialog()

{

。。。。。。。。。。

//添加的對串口的初始化語句

if(m_cComm.get_PortOpen()) //如果發現串口本來是打開的,則關閉串口

m_cComm.put_PortOpen(FALSE);

m_cComm.put_CommPort(1); //選擇COM1端口

m_cComm.put_InputMode(1); //輸入方式爲二進制方式

m_cComm.put_InBufferSize(1024); //設置輸入緩衝區

m_cComm.put_OutBufferSize(512); //設置輸出緩衝區

m_cComm.put_Settings(TEXT("9600,n,8,1"));//波特率,無校驗,個數據位,個停止位

if(!m_cComm.get_PortOpen())

{

m_cComm.put_PortOpen(TRUE); //打開串口

m_cComm.put_RThreshold(1); //每當接收緩衝區有個字符則接收串口數據

m_cComm.put_InputLen(0); //設置當前緩衝區長度爲

m_cComm.get_Input(); //預讀緩衝區以清除殘留數據

}

else

AfxMessageBox("打開端口失敗!",MB_ICONSTOP,0);

2.我們在OnComm()函數中添加對串口發送過來的數據處理過程

void Cport1Dlg::OnComm()

{

//從串口接收數據並顯示在編輯框中

VARIANT variant_inp;

COleSafeArray safearray_inp;

long len,k;

byte rxdata[512]; //設置BYTE數組

CString strtemp;

if(m_cComm.get_CommEvent()==2) //值爲表示接收緩衝區內有字符

{

variant_inp=m_cComm.get_Input(); //讀緩衝區消息

safearray_inp=variant_inp; ///變量轉換

len=safearray_inp.GetOneDimSize(); //得到有效的數據長度

for(k=0;k<len;k++)

safearray_inp.GetElement(&k,rxdata+k);

for(k=0;k<len;k++) //將數組轉換爲CString型變量

{

char bt=*(char*)(rxdata+k);//字符型

strtemp.Format("%c",bt); //將字符送入臨時變量strtemp存放

m_strRecvData+=strtemp; //加入接收編輯框對應字符串

}

}

CString temp=("\r\n"); //顯示完成後要自動換行

m_strRecvData+=temp;

UpdateData(FALSE); //更新編輯框內容

3.我們添加發送按鈕OnButtonSend()發送數據的過程

{

//單擊發送按鈕的操作

UpdateData(true); //讀取編輯框內容

m_cComm.put_Output(COleVariant(m_strSendData));//發送數據

m_strSendData.Empty(); //發送後清空輸入框

UpdateData(false); //更新編輯框內容

//對發送的數據進行強制類型轉換,由CString字符串數據轉換爲VARIANT 類型。

串口現在在筆記本電腦上已經不多見了,USB口已經大行其道,另外VS2008下有serialport類,雖然還不瞭解,但是確實新趨勢,總之,這個就算作最基礎的練習吧。

發佈了19 篇原創文章 · 獲贊 6 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章