资讯详情

Visual C++串口通信技术编程实例

结合DT线扫程序,使用MSComm控件进行串口编程

1.先要插入控件,如果试图类是基于CFormView的,那么创建CMSComm类是简单的,只需在对话框窗体中插入控件,再在视图类中为该控件声明一个变量即可,这样在程序运行中,该控件都将有效的。如果视图类不是基于FormView的,那么需要建立一个MSComm控件,创建的方法与普通的ActiveX控件的创建类似。

同时参考DT线扫,胜哥把控件直接放在AboutDlg上,应该放在其他对话框上也行,然后在MainFrm.cpp::OnCreat()函数中添加创建控件的语句

//创建串口1 DWORD style=_VISIBLE|WS_CHILD; if(!m_MSComm.Create(NULL,style,CRect(0,0,0,0),this,I_MSCOMM3)) { //TRACE0("Failed to create OLE Communication Control\n"); 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()就可。都使用RIA类型。

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的高字节与低字节 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();

}

对照线扫和该书。还有关于COleSafe的使用等

-电子元器件采购网(www.ruidan.com)是本土元器件目录分销商,采用“小批量、现货、样品”销售模式,致力于满足客户多型号、高质量、快速交付的采购需求。 自建高效智能仓储,拥有自营库存超过50,000种,提供一站式正品现货采购、个性化解决方案、选型替代等多元化服务。
锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台