新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > Visual C++串口通信技術編程實例

        Visual C++串口通信技術編程實例

        作者: 時間:2016-12-01 來源:網絡 收藏
        結合DT線掃程序,使用MSC++omm控件進行串口編程

        1.先要插入控件,如果試圖類是基于CFormView的,那么創建CMSComm類是簡單的,只需在對話框窗體中插入控件,再在視圖類中為該控件聲明一個變量即可,這樣在程序運行中,該控件都將有效的。如果視圖類不是基于FormView的,那么需要建立一個MSComm控件,創建的方法與普通的ActiveX控件的創建類似。

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

        同時參考DT線掃,勝哥把控件直接放在AboutDlg上,應該放在其他對話框上也行,然后在MainFrm.cpp::OnCreat()函數中添加創建控件的語句

        //創建串口1
        DWORD style=WS_VISIBLE|WS_CHILD;
        if(!m_MSComm.Create(NULL,style,CRect(0,0,0,0),this,IDC_MSCOMM3))
        {
        //TRACE0("Failed to create OLE Communication Control");
        AfxMessageBox("串口打開失?。?);
        return -1;
        }

        http://dev.yesky.com/231/2309731.shtml深入淺出VC++串口編程之基于控件

        2.初始化并打開

        設定通信端口號,通信協議,設定傳輸速率等參數,設定其他參數,打開通信端口

        //串口1初始化
        if(m_MSComm.GetPortOpen()) //如果串口是打開的,則行關閉串口
        m_MSComm.SetPortOpen(FALSE);

        m_MSComm.SetCommPort(1); //選擇COM1
        m_MSComm.SetInBufferSize(1024); //接收緩沖區
        m_MSComm.SetOutBufferSize(1024); //發送緩沖區
        m_MSComm.SetInputLen(0); //設置當前接收區數據長度為0,表示全部讀取
        m_MSComm.SetInputMode(1); //以二進制方式讀寫數據
        m_MSComm.SetRThreshold(12); //接收緩沖區有1個及1個以上字符時,將引發接收數據的OnComm事件
        m_MSComm.SetSettings("9600,e,8,1"); //波特率:9600,偶檢驗位,8個數據位,1個停止位
        m_MSComm.SetDTREnable(TRUE);
        m_MSComm.SetRTSEnable(TRUE);

        3.捕捉串口事項

        這里用事件驅動方法。

        右鍵在控件上添加消息映射,OnCommMscomm.添加到MainFrm中

        4.串口讀寫

        用GetInput()和Setoutput()就可。都使用VARIANT類型。

        oid CMainFrame::OnCommMSComm()
        {
        int a, i;
        unsigned char *ucData;
        unsigned short *nData;
        CString str, str1;
        switch(m_MSComm2.GetCommEvent())
        {
        case 2:
        a = m_MSComm2.GetInBufferCount();
        if(a>0)
        {
        ucData = (unsigned char*)m_MSComm2.GetInput().parray->pvData;
        nData = new unsigned short[a/2];
        memset(nData, 0, sizeof(unsigned short)*a/2);
        for(i=0; i {
        nData[i] += *(ucData++);
        nData[i] <<= 8;
        nData[i] += *(ucData++);
        str1.Format("%d", nData[i]);
        str += str1;
        }
        CChildFrame *pChildFrame = (CChildFrame*)MDIGetActive();
        pChildFrame->m_pFormView2->m_viewFormView2Page2.CommPacketReceive(a/2, nData);
        delete[] nData;
        }
        AfxMessageBox(str);
        break;
        default:
        break;
        }
        }

        void CMainFrame::CommSendData(unsigned short nData)
        {

        unsigned char ucDataHighByte, ucDataLowByte;//nData的高字節與低字節
        ucDataHighByte = nData >> 8;
        ucDataLowByte = (nData << 8) >> 8;
        TheSig.RemoveAll();//清空發送區
        TheSig.SetSize(2);
        TheSig.SetAt(0, ucDataHighByte);//將發送數據的高字節加入發送區
        TheSig.SetAt(1, ucDataLowByte);//將發送數據的低字節加入發送區
        m_MSComm.SetOutput(COleVariant(TheSig));//發送

        }

        5.

        關閉串口

        bool CMainFrame::CloseComm()
        {
        if(m_MSComm.GetPortOpen())
        m_MSComm.SetPortOpen(false);
        return !m_MSComm.GetPortOpen();

        }

        對照線掃和該書。還有關于COleSafeArray的使用等



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 东乌珠穆沁旗| 迁西县| 阿拉尔市| 临沂市| 高安市| 淮南市| 新龙县| 饶平县| 阜康市| 苗栗市| 十堰市| 荔浦县| 凤庆县| 会宁县| 宝应县| 汤阴县| 延津县| 象山县| 宜春市| 塔河县| 大安市| 齐齐哈尔市| 阿拉善右旗| 时尚| 道孚县| 会东县| 万载县| 准格尔旗| 大港区| 衡南县| 赣榆县| 府谷县| 凤凰县| 香河县| 当阳市| 谢通门县| 忻州市| 万源市| 旬阳县| 微博| 乌海市|