mfc初步探索——串口配置与通信

本文采用vs2013+mfc,使用mscomm进行串口通讯

首先注册mscomm插件,

添加ActiveX控件——Microsoft Communications Control,version 6.0,右键控件添加变量,并将主程序中DDX_Control(pDX, IDC_MSCOMM, m_mscomm)这行删除掉。

打开串口

	if (m_mscomm.get_PortOpen())
		m_mscomm.put_PortOpen(FALSE); //关闭串口  
	CButton* pBtnOpencomm = (CButton*)GetDlgItem(IDC_BUTTON_OPENCOMM);
	CComboBox* pComboBoxComm = (CComboBox*)GetDlgItem(IDC_COMBO_COMM);
	int nSelComm = pComboBoxComm->GetCurSel();

	m_mscomm.put_CommPort(nSelComm + 1); //设定串口为COM4  
	m_mscomm.put_Settings(_T("115200,N,8,1")); //设定波特率115200,无奇偶校验,8位数据位,1位停止位  
	m_mscomm.put_InputMode(1); //设定数据接收模式,1为二进制,0为文本  
	m_mscomm.put_InputLen(0); //设定当前接收区数据长度,0表示全部读取  
	m_mscomm.put_InBufferSize(1024); //设定输入缓冲区大小为1024 byte  
	m_mscomm.put_OutBufferSize(1024); //设定输出缓冲区大小为1024 byte  
	m_mscomm.put_RThreshold(8); //每接收到1个字符时,触发OnComm事件  
	m_mscomm.put_SThreshold(0); //设定每发送多少个字符触发OnComm事件,0表示不触发OnComm事件  
	if (!m_mscomm.get_PortOpen())
	{
		m_mscomm.put_PortOpen(TRUE); //打开串口  
		pBtnOpencomm->SetWindowText(_T("串口已打开"));
	}
	else
		AfxMessageBox(_T("can't open serial port"));

初始化串口

        CComboBox* pComboComm = (CComboBox*)GetDlgItem(IDC_COMBO_COMM);
	ASSERT(pComboComm);

	//初始化串口窗口
	for (int i = 1; i <= 10; i++)
	{
		CString strComm;
		strComm.Format(_T("COM%d"), i);
		pComboComm->AddString(strComm);
	}
	pComboComm->SetCurSel(2); //设置默认串口4

有可能初始化后在combo-box里显示乱序,这时候需要设置sort为false。

发送数据

		unsigned char TxData[13] = { LonWL, 0x10, 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, LonA, 0x00, LonC, 0, 0 };
		unsigned short int unintCRC = GetCRC16(TxData, 11);
		unsigned char* punintCRC = (unsigned char*)&unintCRC;
		TxData[11] = punintCRC[1];
		TxData[12] = punintCRC[0];
		unsigned char* pTxData = (unsigned char*)&TxData;
		CByteArray array;
		array.RemoveAll();
		array.SetSize(13);
		for (int a = 0; a < 13; a++)
		{
			array.SetAt(a, pTxData[a]);
		}
		m_mscomm.put_Output(COleVariant(array));

Txdata[13]为假定的一段数据 

接收数据

	//AfxMessageBox("T1");
	if (m_mscomm.get_CommEvent() != 2)
	{
		return;
	}

	CString strRecv = _T("");
	unsigned char rcvdata[1024] = { 0 };//接收的数据  
	COleSafeArray safearray_inp = m_mscomm.get_Input();//读缓冲区消息  
	DWORD len = safearray_inp.GetOneDimSize();//获取有效数据长度  
	for (long j = 0; j < len; j++)//转化为unsigned char数组  
	{
		safearray_inp.GetElement(&j, rcvdata + j);
	}
	for (long j = 0; j < len; j++)//将数组转换为CString型变量 
	{
		unsigned char charTemp = *(char*)(rcvdata + j);
		if (charTemp <= 0x0F)
			strRecv.Format(_T("0%x "), charTemp);
		else
			strRecv.Format(_T("%x "), charTemp);
		m_editTemp += strRecv;
	}

数据存储在m_editTemp里;

猜你喜欢

转载自blog.csdn.net/no_zhushenghui/article/details/81299010