• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • 串口調試助手源程序及編程詳細過程(二)

    發表于:2007-05-26來源:作者:點擊數: 標簽:
    串口調試助手源程序 及編程詳細過程(二) 作者: 龔建偉 2001.8.25 可以任意轉載,但必須注明作者和說明來自 http://www.gjwtech.com ,不得作為商用 目次: 1.建立項目 2.在項目中插入MSComm控件 3.利用ClassWizard定義CMSComm類控制變量 4.在對話框中添加

    串口調試助手源程序

    及編程詳細過程(二)

    作者:龔建偉  2001.8.25

    可以任意轉載,但必須注明作者和說明來自http://www.gjwtech.com,不得作為商用

     

      
      

    目次:

    1.建立項目  

    2.在項目中插入MSComm控件 

    3.利用ClassWizard定義CMSComm類控制變量

    4.在對話框中添加控件  

    5.添加串口事件消息處理函數OnComm()

    6.打開和設置串口參數

    7.發送數據

    8.發送十六進制字符

    9.在接收框中以十六進制顯示

    10.如何設置自動發送

    ANT數據類型?如何使用VARIANT數據類型?">11.什么是VARIANT數據類型?如何使用VARIANT數據類型? 

     

        這是串口調試助手源程序及編程詳細過程(一)的續篇,首先謝謝朋友們的支持與鼓勵。

      

    8.發送十六進制字符

        在主對話框中加入一個復選接鈕,ID為IDC_CHECK_HEXSEND Caption: 十六進制發送,再利用ClassWizard為其添加控制變量:m_ctrlHexSend;

        在ClassView中為SCommTestDlg類添加以下兩個PUBLIC成員函數,并輸入相應代碼;

     

    //由于這個轉換函數的格式限制,在發送框中的十六制字符應該每兩個字符之間插入一個空隔
    //如:A1 23 45 0B 00 29
    //CByteArray是一個動態字節數組,可參看MSDN幫助
    int CSCommTestDlg::String2Hex(CString str, CByteArray &senddata)
    {
    int hexdata,lowhexdata;
    int hexdatalen=0;
    int len=str.GetLength();
    senddata.SetSize(len/2);
    for(int i=0;i<len;)
    {
    char lstr,hstr=str[i];
    if(hstr==' ')
    {
    i++;
    continue;
    }
    i++;
    if(i>=len)
    break;
    lstr=str[i];
    hexdata=ConvertHexChar(hstr);
    lowhexdata=ConvertHexChar(lstr);
    if((hexdata==16)||(lowhexdata==16))
    break;
    else 
    hexdata=hexdata*16+lowhexdata;
    i++;
    senddata[hexdatalen]=(char)hexdata;
    hexdatalen++;
    }
    senddata.SetSize(hexdatalen);
    return hexdatalen;
    }

    //這是一個將字符轉換為相應的十六進制值的函數
    //好多C語言書上都可以找到
    //功能:若是在0-F之間的字符,則轉換為相應的十六進制字符,否則返回-1
    char CSCommTestDlg::ConvertHexChar(char ch) 
    {
    if((ch>='0')&&(ch<='9'))
    return ch-0x30;
    else if((ch>='A')&&(ch<='F'))
    return ch-'A'+10;
    else if((ch>='a')&&(ch<='f'))
    return ch-'a'+10;
    else return (-1);
    }

     

      再將CSCommTestDlg::OnButtonManualsend()修改成以下形式:

    void CSCommTestDlg::OnButtonManualsend() 
    {
    // TODO: Add your control notification handler code here
    UpdateData(TRUE); //讀取編輯框內容
    if(m_ctrlHexSend.GetCheck())
    {
    CByteArray hexdata;
    int len=String2Hex(m_strTXData,hexdata); //此處返回的len可以用于計算發送了多少個十六進制數
    m_ctrlComm.SetOutput(COleVariant(hexdata)); //發送十六進制數據
    }
    else 
    m_ctrlComm.SetOutput(COleVariant(m_strTXData));//發送ASCII字符數據

    }

    現在,你先將串口線接好并打開串口調試助手V2.1,選上以十六制顯示,設置好相應串口,然后運行我們這個程序,在發送框中輸入00 01 02 03 A1 CC等十六進制字符,并選上以十六進制發送,單擊手動發送,在串口調試助手的接收框中應該可以看到00 01 02 03 A1 CC了。

     

    9.在接收框中以十六進制顯示

        這就容易多了:  在主對話框中加入一個復選接鈕,IDC_CHECK_HEXDISPLAY Caption: 十六進制顯示,再利用ClassWizard為其添加控制變量:m_ctrlHexDiaplay。 然后修改CSCommTestDlg::OnComm()函數:

    void CSCommTestDlg::OnComm() 
    {
    // TODO: Add your control notification handler code here
    VARIANT variant_inp;
    COleSafeArray safearray_inp;
    LONG len,k;
    BYTE rxdata[2048]; //設置BYTE數組 An 8-bit integerthat is not signed.
    CString strtemp;
    if(m_ctrlComm.GetCommEvent()==2) //事件值為2表示接收緩沖區內有字符
    {
    variant_inp=m_ctrlComm.GetInput(); //讀緩沖區
    safearray_inp=variant_inp; //VARIANT型變量轉換為ColeSafeArray型變量
    len=safearray_inp.GetOneDimSize(); //得到有效數據長度
    for(k=0;k<len;k++)
    safearray_inp.GetElement(&k,rxdata+k);//轉換為BYTE型數組
    for(k=0;k<len;k++) //將數組轉換為Cstring型變量
    {
    BYTE bt=*(char*)(rxdata+k); //字符型
    if(m_ctrlHexDisplay.GetCheck())
    strtemp.Format("%02X ",bt); //將字符以十六進制方式送入臨時變量strtemp存放,注意這里加入一個空隔
    else 
    strtemp.Format("%c",bt); //將字符送入臨時變量strtemp存放

    m_strRXData+=strtemp; //加入接收編輯框對應字符串 
    }
    }
    UpdateData(FALSE); //更新編輯框內容
    }

    測試:在串口調試助手發送框中輸入00 01 02 03 A1 CC等十六進制字符,并選上以十六進制發送,單擊手動發送,在本程序運行后選上以十六進制顯示,在串口調試助手中單擊手動發送或自動發送,則在本程序的接收框中應該可以看到00 01 02 03 A1 CC了。

     

    10.如何設置自動發送

         最簡單的設定自動發送周期是用SetTimer()函數,這在數據采集中很有用,在控制中指令的傳送也可能用到定時發送。

        方法是:在ClassWizard中選上MessageMap卡,然后在Objects IDs選中CSCommTestDlg類,再在Messages框中選上WM_TIMER消息,單擊ADD_FUNCTION加入void CSCommTestDlg::OnTimer(UINT nIDEvent) 函數,這個函數是放入“時間到”后要處理的代碼:

    void CSCommTestDlg::OnTimer(UINT nIDEvent) 
    {
    // TODO: Add your message handler code here and/or call default
    OnButtonManualsend();
    CDialog::OnTimer(nIDEvent);
    }

    再在在主對話框中加入一個復選接鈕,ID為IDC_CHECK_AUTOSEND Caption: 自動發送(周期1秒),再利用ClassWizard為其添加BN_CLICK消息處理函數void CSCommTestDlg::OnCheckAutosend():

    void CSCommTestDlg::OnCheckAutosend() 
    {
    // TODO: Add your control notification handler code here
    m_bAutoSend=!m_bAutoSend;
    if(m_bAutoSend)
    {
    SetTimer(1,1000,NULL);//時間為1000毫秒
    }
    else
    {
    KillTimer(1);  //取消定時
    }
    }

    其中:m_bAutoSend為BOOL型變量,在CLASSVIEW中為CSCommTestDlg類加入,并在構造函數中初始化:

          m_bAutoSen=FALSE;
    現在可以運行程序測試了。

     

    11.什么是VARIANT數據類型?如何使用VARIANT數據類型?

         不知如何使用VARIANT數據類型, 有不少朋友對VARIANT這個新的數據類型大感頭疼。SetOutput()函數中 需要的VARIANT參數還可以使用COleVariant類的構造函數簡單生成,現在GetInput()函數的返回值也成了VARIANT類型,那么如何從返回的值中提取有用的內容。 VARIANT及由之而派生出的COleVariant類主要用于在OLE自動化中傳遞數據。實際上VARIANT也只不過是一個新定義的結構罷了,它的主要成員包括一個聯合體及一個變量。該聯合體由各種類型的數據成員構成, 而該變量則用來指明聯合體中目前起作用的數據類型。我們所關心的接收到的數據就存儲在該聯合體的某個數據成員中。 該聯合體中包含的數據類型很多,從一些簡單的變量到非常復雜的數組和指針。由于通過串口接收到的內容常常是一個字節串,我們將使用其中的某個數組或指針來訪問接收到的數據。這里推薦給大家的是指向一個SAFEARRAY(COleSafeArray)類型變量。新的數據類型SAFEARRAY正如其名字一樣,是一個“安全數組”,它能根據系統環境自動調整其16位或32 位的定義,并且不會被OLE改變(某些類型如BSTR在16位或32位應用程序間傳遞時會被OLE翻譯從而破壞其中的二進制數據)。大家無須了解SAFEARRAY的具體定義,只要知道它是另外一個結構,其中包含一個 (void *)類型的指針pvData,其指向的內存就是存放有用數據的地方。 簡而言之,從GetInput()函數返回的VARIANT類型變量中,找出parray 指針,再從該指針指向的SAFEARRAY變量中找出pvData指針,就可以向訪問數組一樣取得所接收到的數據了。具體應用請參見void CSCommTestDlg::OnComm()函數。

        大概我現在也說不清這個問題,我自己從第一次接觸這個東西,到現在還是給別人講不清。

     

    另:二進制收發設置請參考MSComm控件說明。

    原文轉自:http://www.kjueaiud.com

    評論列表(網友評論僅供網友表達個人看法,并不表明本站同意其觀點或證實其描述)
    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>