新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > VC++用ActiveX控件與單片機串行通信

        VC++用ActiveX控件與單片機串行通信

        作者: 時間:2012-06-27 來源:網絡 收藏


        此時即可將MSCOMM控件加入到對話框模板,加入方法與其他控件一樣。然后還要在對話框類中相應加入一個成員變量,此處我們將其命名為m_comm。加入方法為:首先,在對話框模板中,用鼠標右鍵點擊該控件,選擇ClassWizard,在出現的對話框的Member Variables標簽的Control Ids項下,選中IDC_MSCOMM1。然后,按Add Variable…按鈕,在出現的對話框的Member Variable Name項中輸入m_comm。最后,按OK按鈕即可。

        3.設置屬性

        可以在兩個地方對控件的屬性進行設置:

        (1)對話框資源編輯器中。在對話框模板上,用右鍵單擊MSCOMM控件,然后選擇Properties…菜單項,最后便可設置各項屬性。此處只對以下幾處進行改動,其他接受缺省設置:Rthershold:1,InputLen:1,DTREnable:不選,InputMode:1-Binary。

        (2)對話框類的OnInitDialog()函數中。下面是以上設置的函數實現:

        BOOL CMyCOMMDlg::OnlnitDialog()
        {
        CDialog::OnlnitDialog();
        //此處為應用框架自動生成代碼,不予列出
        //TODO:Add extra initialization here
        m_comm.SetCommPort(1);//使用串口1
        m_comm.SetSettings("9600,N,8,1");
        //波特率為9600,無奇偶校驗,8位數據位,1位停止位
        m_comm.SetRThreshold(10); //每接收10個字符就觸發1次接收事件
        m_comm.SetSThreshold(0); //不觸發發送事件
        m_comm.SetInputLen(10); //每次讀操作從緩沖區中取10個字符
        m_comm.SetInputMode(1); //二進制數據傳輸形式
        m_comm.SetPortOpen(TRUE); //打開串口
        return TRUE;//return TRUE unless you set the focus to a control
        }

        4.發送二進制數據

        如果需要發送二進制數據,可將數據作如下處理。具體代碼如下:

        CByteArray bytOutArr;
        bytOutArr.Add(0x0); //給數組賦值
        bytOutArr.Add(0x1);
        bytOutArr.Add(0x2);
        bytOutArr.Add(0x3);
        bytOutArr.Add(0x4);
        COleVariant varOut;
        varOut=COleVariant(bytOutArr); //將數據轉換為變體數據類型
        m_comm.SetOutput (varOut); //發送數據

        5.接收二進制數據

        當需要接收大量的數據時,最好采用事件驅動方式進行編程。具體步驟如下:

        (1)響應OnComm事件。在對話框資源編程器中,雙擊對話框模板上的MSCOMM控件,在彈出的對話框中填入您所希望的事件響應函數名,此處將其命名為OnCommMscomm1()。

        (2)在事件響應函數中接收和處理數據。接收來的數據為變體數據,所以需要做一些處理,具體代碼如下:

        void CMyCOMMDlg::OnCommMscomm1()
        {
        COleVariant varRcv;
        CByteArray byt;
        int i;
        long num;
        switch (m_comm.GetCommEvent())
        {
        cass 1://數據發送事件
        break;
        case 2://數據接收事件
        varRcv=m_comm.GetInput();
        varRcv.ChangeType (VT_ARRAY |VT_UI1);
        BYTE HUGEP *pbstr;
        HRESULT hr;
        hr=SafeArrayAccessData (varRcv.parray,(void HUGEP*FAR*)pbstr);//獲取安全數組指針

        if (FAILED (hr)){
        AfxMessageBox("獲取數組指針失敗!");
        break;}
        num=0;
        hr=SafeArrayGetUBound (varRcv.parray,1,num);//獲取數組上界
        if (FAILED (hr)){
        AfxMessageBox("獲取數組上界失敗!");
        break;}
        for(i=0;i
        byt.Add(pbstr [i]);
        SafeArrayUnaccessData (varRcv.parray);
        //此時數據已保存在二進制數組byt中,可根據需要進行相關處理
        break;
        default:
        break;
        }
        }

        以上代碼中的處理部分可以做成一個單獨的函數,在此處調用即可。經過以上代碼的處理,接收來的數據已存放在二進制數組byt中,可以根據自己的需要對其進行相關處理,如保存和顯示等。

        三、硬件接口

        單片機與微機之間的硬件接口可以用1片MAX232或ICL232與幾個電容即可實現,有許多文獻討論過,此處不再多述。

        以上方法經過筆者在實踐中的應用,感到非常簡潔、方便,具有很強的實用意義。


        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 怀柔区| 宁武县| 长沙市| 眉山市| 永和县| 乌拉特中旗| 葫芦岛市| 定结县| 雅安市| 右玉县| 衡东县| 山丹县| 大同市| 新巴尔虎左旗| 台安县| 义马市| 临潭县| 格尔木市| 华宁县| 昌吉市| 铁岭县| 阿瓦提县| 军事| 易门县| 孙吴县| 河间市| 安平县| 米脂县| 巴南区| 德兴市| 井陉县| 铜梁县| 台南市| 安阳县| 克拉玛依市| 太仓市| 宜宾市| 安多县| 新民市| 门头沟区| 敦化市|