1. 程式人生 > >20160426 VC++(VS2013)串列埠程式設計圖文教程(MSComm的使用)

20160426 VC++(VS2013)串列埠程式設計圖文教程(MSComm的使用)

1、新建MFC對話方塊工程如下

2、給編輯框控制元件新增變數,其中Edit Box新增Value變數,Button新增Control變數,ID和變數分別為:

IDC_BTNOPEN()                                  CButton m_cBtnOpen;

IDC_BTNSEND()                                  CButton m_cBtnSend;

IDC_EDIT_RXDATA()                          CString m_sRXDATA;

IDC_EDIT_TXDATA()                           

CString m_sTXDATA;

3、右擊插入Active X控制元件:

右擊電話圖示選擇“Class Wirzard”,新增變數m_comm1,新增Function:

雙擊兩個Button按鈕;

程式碼中顯示如下:

void CMSCommTestDlg::OnBnClickedBtnopen()
{
	// TODO: Add your control notification handler code here
}
void CMSCommTestDlg::OnBnClickedBtnsend()
{
	// TODO: Add your control notification handler code here
}
void CMSCommTestDlg::OnOncommMscomm1()
{
	// TODO: Add your message handler code here
}

5、將上面程式碼補全如下:

void CMSCommTestDlg::OnClickedBtnopen()
{
	// TODO: Add your control notification handler code here
	//如果埠已經開啟,那麼先關閉
	if (m_comm1.get_PortOpen())
	{
		m_comm1.put_PortOpen(FALSE);
	}
	m_comm1.put_CommPort(3);				//選擇com3,可以根據具體情況更改
	m_comm1.put_InBufferSize(1024);			//設定輸入緩衝區的大小,Bytes
	m_comm1.put_OutBufferSize(1024);		//設定輸出緩衝區的大小,Bytes
	m_comm1.put_Settings(_T("9600,n,8,1")); //波特率9600,無校驗,8個數據位,停止位1
	m_comm1.put_InputMode(1);				//1:表示以二進位制方式檢索資料
	m_comm1.put_RThreshold(1);				//引數1表示每當串列埠接收緩衝區中有多於或等於1個字元時將引發一個接收資料的OnComm事件
	m_comm1.put_InputLen(0);				//設定當前接收區長度是0
	if (!m_comm1.get_PortOpen())
	{
		m_comm1.put_PortOpen(TRUE);
	}
	else
	{
		AfxMessageBox(_T("Can not open serial port!"));
	}
	m_comm1.get_Input();					//先預讀緩衝區以清除殘留資料
	UpdateData(FALSE);
}


void CMSCommTestDlg::OnClickedBtnsend()
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	m_comm1.put_Output(COleVariant(m_sTXDATA));//傳送資料
}

void CMSCommTestDlg::OnOncommMscomm1()
{
	// TODO: Add your message handler code here
	VARIANT variant_inp;
	COleSafeArray safearray_inp;
	LONG len, k;
	BYTE rxdata[2048];
	CString strtemp;
	if (m_comm1.get_CommEvent() == 2)		//事件值為2表示緩衝區內有字元
	{
		variant_inp = m_comm1.get_Input();	//讀緩衝區
		safearray_inp = variant_inp;		//VARIANT型變數轉換為ColeSafeArray型變數
		len = safearray_inp.GetDim();		//得到有效資料長度
		for (k = 0; k < len; k++)
		{
			safearray_inp.GetElement(&k, rxdata + k);//轉換為BYTE型陣列
		}
		for (k = 0; k < len; k++)			//將陣列轉換為CString型變數
		{
			BYTE bt = *(char*)(rxdata + k); //字元型
			strtemp.Format(_T("%c"), bt);	//將字元送入臨時變數strtemp存放
			m_sRXDATA += strtemp;			//接收到的資料放到編輯框對應的變數中
		}
	}
	SetDlgItemText(IDC_EDIT_RXDATA, m_sRXDATA);
}

備註:

如果Project是基於檢視的,只需在對話方塊窗體中插入MSComm控制元件,再在檢視類的ClassWizard中為該控制元件宣告一個變數即可,如m_Comm1。