1. 程式人生 > >串列埠程式設計(VS2010)

串列埠程式設計(VS2010)

  • 解壓後拷貝到:
    C:\Windows\System32(WIN7系統);
    C:\WINDOWS\system32(XP系統)。
    注意:64位win7系統還需要將mscomm32.ocx檔案複製到C:\Windows\SysWOW64\目錄下,否則後面註冊會出錯。

  • 在C:\Windows\System32裡找到cmd.exe以管理員身份執行:
    Regsvr32 C:\WINDOWS\system32\MSCOMM32.OCX

  • 修改登錄檔:
    win+R組合鍵開啟“執行”或者直接在開始選單裡找到“執行”;輸入regedit後回車,開啟登錄檔管理器,在其中找到HKEY_CLASSES_ROOT項下的Licenses項,新增主項命名為“4250E830-6AC2-11cf-8ADB-00AA00C00905”,並將鍵值修改為“kjljvjjjoquqmjjjvpqqkqmqykypoqjquoun”

2.進入正題

一、開啟VS2010軟體,繪製介面;

這裡寫圖片描述

  • 我們要用到就是對話方塊模組,所以選擇如下圖所示

這裡寫圖片描述

  • 點選下一步至完成。

我們可以看到就緒之後的介面如下圖所示,按照步驟把原來的靜態文字框和確定按鈕、取消按鈕刪掉;

這裡寫圖片描述

二、為我們的對話方塊新增控制元件

  • 新增兩個組合邊框,並放置好位置;

這裡寫圖片描述

  • 修改組合邊框顯示的名稱;

這裡寫圖片描述

  • 在組合邊框裡面新增編輯文字框;

這裡寫圖片描述

在這一步一定要小心選擇右邊的屬性;

這裡寫圖片描述

這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述

二、新增控制元件和變數

  • 這一步是把串列埠控制元件新增到對話方塊中來;

這裡寫圖片描述
這裡寫圖片描述

  • 給四個控制元件(兩個輸入區域,一個選擇串列埠,一個波特率)新增變數 控制元件處右鍵,新增變數

這裡寫圖片描述

  • 接受區域,變數名最好和例項一樣,否則後面程式也需要修改

這裡寫圖片描述

  • 其他三個區域相同方法

這裡寫圖片描述

  • 選擇串列埠和波特率為control

這裡寫圖片描述
這裡寫圖片描述

  • 串列埠控制元件為public

    這裡寫圖片描述

三、為按鈕和串列埠控制元件新增程式函式

  • 雙擊開啟串列埠按鈕,進入相應的程式設計部分
void C串列埠v2Dlg::OnBnClickedButtonOpen()
{
    CString str, str1, n;
    GetDlgItemText(IDC_BUTTON_OPEN, str);   //str獲得與對話方塊中的控制元件相關的標題或文字
    CWnd *h1;                               //視窗類的基類
h1 = GetDlgItem(IDC_BUTTON_OPEN); //指向控制元件的caption //串列埠為關閉狀態 if(!m_mscom.get_PortOpen()) { m_comb2.GetLBText(m_comb2.GetCurSel(), str1); //取得所選的字串,並存放在str1裡面 str1 = str1+','+'n'+','+'8'+','+'1'; m_mscom.put_CommPort(m_comb1.GetCurSel()+1); //選擇串列埠 m_mscom.put_InputMode(1); //設定輸入方式為二進位制方式 m_mscom.put_Settings(str1); //comb2選擇的波特率,無校驗,8資料位,1個停止位 m_mscom.put_InputLen(1024); //設定當前接收區資料長度為1024 m_mscom.put_RThreshold(1); //緩衝區一個字元引發事件 m_mscom.put_RTSEnable(1); //設定RT允許 m_mscom.put_PortOpen(true); //開啟串列埠 //開啟成功 if(m_mscom.get_PortOpen()) { str = _T("關閉串列埠"); UpdateData(true); //把控制元件中的值和變數進行交換 h1->SetWindowText(str); //改變按鈕名稱為‘’關閉串列埠”,提供關閉操作 } } //串列埠為開啟狀態 else { m_mscom.put_PortOpen(false); //關閉串列埠 //關閉成功 if(str != _T("開啟串列埠")) { str = _T("開啟串列埠"); UpdateData(true); h1->SetWindowText(str); //更新資料後,提供開啟操作 } } }
  • 其餘三個按鈕同法:
void C串列埠v2Dlg::OnBnClickedButtonSend()
{
    UpdateData(true);                       //更新控制元件資料
    m_mscom.put_Output(COleVariant(m_EditSend));//把傳送編輯框的資料傳送出去

}


void C串列埠v2Dlg::OnBnClickedButtonClean()
{
    m_EditReceive = _T("");                 //給接收編輯框傳送空格符
    UpdateData(false);                      //根據資料狀態反饋給控制元件
}


void C串列埠v2Dlg::OnBnClickedButtonClose()
{
    //若當前串列埠為開啟
    if(m_mscom.get_PortOpen())
        m_mscom.put_PortOpen(false);        //置為關閉
    CDialogEx::OnCancel();
}
  • 新增事件處理程式

這裡寫圖片描述

void C串列埠v2Dlg::OnCommMscomm1()
{
    //接收緩衝區有資料
    if(m_mscom.get_CommEvent() == 2)
    {
        char str[1024] = {0};           //緩衝區最大為1024
        long k;
        VARIANT InputData = m_mscom.get_Input();    //讀入緩衝區
        COleSafeArray fs;
        fs = InputData;                 //VARIANT型變À量轉換為COleSafeArray型變數
        for(k = 0; k < fs.GetOneDimSize(); k++)
        {
            fs.GetElement(&k, str+k);   //轉換為BYTE型陣列
        }

        m_EditReceive += str;           //接收到編輯框裡面
        //SetTimer(1, 10, NULL);        //延時10ms
        UpdateData(false);              //將資料在螢幕中對應控制元件中顯示出來。
    }
}
  • 最後

在對話方塊初始部分BOOL C串列埠v2Dlg::OnInitDialog(),將對話方塊程式碼完善,新增程式碼的作用是增加串列埠選擇,和波特率選擇:

// 設定此對話方塊的圖示。當應用程式主視窗不是對話方塊時,框架將自動
    //  執行此操作
    SetIcon(m_hIcon, TRUE);         // 設定大圖示
    SetIcon(m_hIcon, FALSE);        // 設定小圖示

    // TODO: 在此新增額外的初始化程式碼

    // 串列埠選擇組合框
    CString str;
    int i;
    for(i = 0; i < 15; i++)
    {
        str.Format(_T("COM %d"), i+1);
        m_comb1.InsertString(i, str);       //將COM 1-15填入comb1
    }
    m_comb1.SetCurSel(0);                   //預置為COM 1

    //波特率選擇組合框
    CString str1[]={_T("300"),_T("600"),_T("1200"),_T("2400"),_T("4800"),_T("9600"),
                    _T("19200"),_T("38400"),_T("43000"),_T("56000"),_T("57600"),_T("115200")};
    for(i = 0; i < 12; i++)
    {
        int judge_tf = m_comb2.AddString(str1[i]);
        if((judge_tf == CB_ERR) || (judge_tf == CB_ERRSPACE))
            MessageBox(_T("Build baud error!"));
    }
    m_comb2.SetCurSel(5);                   //預置波特率為9600

    return TRUE;  // 除非將焦點設定到控制元件,否則返回 TRUE
  • 程式完畢

編譯成功後,在儲存目錄下的Debug目錄下,找到可執行檔案。進入測試。
效果圖
這裡寫圖片描述
四、測試

  • 下載虛擬串列埠工具Virtual Serial Port Driver(VSPD)
  • 新增兩個匹配的虛擬串列埠:

這裡寫圖片描述

  • 開啟兩個串列埠程式

在同波特率下,一個選擇串列埠1, 一個選擇串列埠2, 測試結果如下。
這裡寫圖片描述