• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

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

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

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

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

    本文引用地址:http://www.czjhyjcfj.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的使用等



    評論


    技術專區

    關閉
    主站蜘蛛池模板: 岳西县| 理塘县| 晋江市| 察隅县| 山丹县| 松桃| 铜梁县| 白山市| 嘉祥县| 甘洛县| 唐河县| 德江县| 叶城县| 祥云县| 开鲁县| 张家界市| 平邑县| 奉贤区| 云安县| 巴彦淖尔市| 安达市| 密云县| 平原县| 茂名市| 门头沟区| 神农架林区| 博乐市| 尚志市| 淮北市| 英超| 芦山县| 武强县| SHOW| 蒙山县| 金门县| 和平区| 织金县| 莆田市| 韩城市| 达日县| 通渭县|