新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > pc機與89C51單片機的串口通信編程

        pc機與89C51單片機的串口通信編程

        作者: 時間:2016-11-20 來源:網絡 收藏
        一、pc機上的串口通信編程過程如下:

        1.建立項目

        本文引用地址:http://www.104case.com/article/201611/318591.htm

        打開VC++6.0,建立一個基于對話框的MFC應用程序SCommTest(與我源代碼一致,等會你會方便一點);

        2.在項目中插入MSComm控件

        選擇Project菜單下Add To Project子菜單中的 Components and Controls…選項,在彈出的對話框中雙擊Registered ActiveX Controls項(稍等一會,這個過程較慢),則所有注冊過的ActiveX控件出現在列表框中。 選擇Microsoft Communications Control, version 6.0,,單擊Insert按鈕將它插入到我們的Project中來,接受缺省的選項。(如果你在控件列表中看不到Microsoft Communications Control, version 6.0,那可能是你在安裝VC6時沒有把ActiveX一項選上,重新安裝VC6,選上ActiveX就可以了),

        這時在ClassView視窗中就可以看到CMSComm類了,(注意:此類在ClassWizard中看不到,重構clw文件也一樣),并且在控件工具欄Controls中出現了電話圖標(如圖1所示),現在要做的是用鼠標將此圖標拖到對話框中,程序運行后,這個圖標是看不到的。

        3.利用ClassWizard定義CMSComm類控制對象

        打開ClassWizard->Member Viariables選項卡,選擇CSCommTestDlg類,為IDC_MSCOMM1添加控制變量:m_ctrlComm,這時你可以看一看,在對話框頭文件中自動加入了//{{AFX_INCLUDES() #include "mscomm.h" //}}AFX_INCLUDES (這時運行程序,如果有錯,那就再從頭開始)。

        4.在對話框中添加控件

        向主對話框中添加兩個編輯框,一個用于接收顯示數據ID為IDC_EDIT_RXDATA,另一個用于輸入發送數據,ID為IDC_EDIT_TXDATA,再添加一個按鈕,功能是按一次就把發送編輯框中的內容發送一次,將其ID設為IDC_BUTTON_MANUALSEND。別忘記了將接收編輯框的Properties->Styles中把Miltiline和Vertical Scroll屬性選上,發送編輯框若你想輸入多行文字,也可選上Miltiline。

        再打開ClassWizard->Member Viariables選項卡,選擇CSCommTestDlg類, 為IDC_EDIT_RXDATA添加CString變量m_strRXData, 為IDC_EDIT_TXDATA添加CString變量m_strTXData。說明: m_strRXData和m_strTXData分別用來放入接收和發送的字符數據。

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

        打開ClassWizard->Message Maps,選擇類CSCommTestDlg,選擇IDC_MSCOMM1,雙擊消息OnComm,將彈出的對話框中將函數名改為OnComm,(好記而已)OK。

        這個函數是用來處理串口消息事件的,如每當串口接收到數據,就會產生一個串口接收數據緩沖區中有字符的消息事件,我們剛才添加的函數就會執行,我們在OnComm()函數加入相應的處理代碼就能實現自已想要的功能了。請你在函數中加入如下代碼:

        voidCSCommTestDlg::OnComm()
        {
        // TODO: Add your control notification handler code here
        VARIANT variant_inp;
        COleSafeArray safearray_inp;
        LONGlen,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;ksafearray_inp.GetElement(&k,rxdata+k);//轉換為BYTE型數組

        for(k=0;k{
        BYTE bt=*(char*)(rxdata+k);//字符型
        strtemp.Format("%c",bt);//將字符送入臨時變量strtemp存放
        m_strRXData+=strtemp;//加入接收編輯框對應字符串
        }
        m_strRXData+="rn";//換行

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

        }



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 邯郸县| 师宗县| 花莲市| 高陵县| 宿松县| 油尖旺区| 志丹县| 湘潭市| 长阳| 梨树县| 望谟县| 沙雅县| 青铜峡市| 拉萨市| 红河县| 陆良县| 加查县| 岳池县| 临西县| 曲阳县| 尚志市| 永和县| 苏州市| 苏尼特左旗| 元阳县| 扶沟县| 财经| 称多县| 博爱县| 海兴县| 安岳县| 扎鲁特旗| 大埔区| 浙江省| 天水市| 苍南县| 青岛市| 渝中区| 博湖县| 喀什市| 托克逊县|