久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專(zhuān)注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

Visual C++串口通信技術(shù)編程實(shí)例

作者:黃波海   來(lái)源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2014年03月06日   【字體:

結(jié)合DT線(xiàn)掃程序,使用MSComm控件進(jìn)行串口編程

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

同時(shí)參考DT線(xiàn)掃,勝哥把控件直接放在AboutDlg上,應(yīng)該放在其他對(duì)話(huà)框上也行,然后在MainFrm.cpp::OnCreat()函數(shù)中添加創(chuàng)建控件的語(yǔ)句

//創(chuàng)建串口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\n");
  AfxMessageBox("串口打開(kāi)失。");
  return -1;
 }

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

2.初始化并打開(kāi)

設(shè)定通信端口號(hào),通信協(xié)議,設(shè)定傳輸速率等參數(shù),設(shè)定其他參數(shù),打開(kāi)通信端口

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

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

3.捕捉串口事項(xiàng)

這里用事件驅(qū)動(dòng)方法。

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

4.串口讀寫(xiě)

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

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<a/2; 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的高字節(jié)與低字節(jié)
 ucDataHighByte = nData >> 8;
 ucDataLowByte = (nData << 8) >> 8;
 TheSig.RemoveAll();//清空發(fā)送區(qū)
 TheSig.SetSize(2);
 TheSig.SetAt(0, ucDataHighByte);//將發(fā)送數(shù)據(jù)的高字節(jié)加入發(fā)送區(qū)
 TheSig.SetAt(1, ucDataLowByte);//將發(fā)送數(shù)據(jù)的低字節(jié)加入發(fā)送區(qū)
 m_MSComm.SetOutput(COleVariant(TheSig));//發(fā)送

}

5.

關(guān)閉串口

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

}

對(duì)照線(xiàn)掃和該書(shū)。還有關(guān)于COleSafeArray的使用等

關(guān)閉窗口

相關(guān)文章

主站蜘蛛池模板: 黑人巨大精品欧美一区二区免费 | 黄在线免费观看 | 牛牛热在线视频 | 国产乱码精品一区二区三区av | 欧美嘿咻 | 久久成人国产 | 欧美老少妇一级特黄一片 | 欧美精品一区二区三区在线 | 国产一区二区欧美 | 成人在线小视频 | 亚洲一区| 精品久草| 免费视频久久 | 成人免费视频网站在线看 | 国产一级黄色网 | 欧美多人在线 | 欧美日韩精品免费 | 国产一区二区在线视频 | 国产色片在线 | 中文字幕中文字幕 | 91素人| 黄色毛片网站在线观看 | 在线观看国产视频 | 国产精品久久毛片av大全日韩 | 亚洲欧洲日本国产 | 美日韩中文字幕 | 成人亚洲一区 | 羞羞的视频在线 | 99精品99久久久久久宅男 | 亚洲国产成人av好男人在线观看 | 色婷婷国产精品综合在线观看 | 免费一级黄色 | 一区二区三区国产好 | 国产日韩欧美 | 亚洲在线免费 | 国产成人精品久久二区二区91 | 久草免费电影 | 久久欧美高清二区三区 | 麻豆av在线免费观看 | 综合五月婷| 精品久久久久久久久久久久 |