1. 程式人生 > >mfc初步探索——串列埠配置與通訊

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裡;