1. 程式人生 > >VS2008高版本VC使用微軟串列埠控制元件mscomm小結

VS2008高版本VC使用微軟串列埠控制元件mscomm小結

在VS2008中使用mscomm的文章有很多,這裡把關鍵的幾處小結一下:

1. 最好安裝一遍VC++6.0,因為mscomm控制元件在VC6中是自帶的。裝好了VC6,在VS2008中就可以直接使用mscomm了;如果不想安裝VC6的,那麼直接到這裡下載mscomm控制元件(http://download.csdn.net/detail/dijkstar/9513049),直接執行裡面的批處理檔案註冊;

2. 在VS2008中使用該控制元件的方法:選擇選單【工具】--選擇工具箱項--COM元件--Microsoft Communications Control,version 6.0;

3. 初始化:

  void CTestDlg::OnBnClickedButton1()
{
	//新增的對串列埠的初始化語句
	int commNo  = 5;

	if(m_cComm.get_PortOpen()) //如果發現串列埠本來是開啟的,則關閉串列埠
		m_cComm.put_PortOpen(FALSE);
	m_cComm.put_CommPort(commNo); //選擇COM1埠
	m_cComm.put_InputMode(1); //輸入方式為二進位制方式
	m_cComm.put_InBufferSize(1024); //設定輸入緩衝區
	m_cComm.put_OutBufferSize(512); //設定輸出緩衝區
	m_cComm.put_Settings(TEXT("9600,n,8,1"));//波特率,無校驗,個數據位,個停止位
	if(!m_cComm.get_PortOpen())
	{
		m_cComm.put_PortOpen(TRUE); //開啟串列埠
		m_cComm.put_RThreshold(1); //每當接收緩衝區有個字元則接收串列埠資料
		m_cComm.put_InputLen(0); //設定當前緩衝區長度為m_cComm.get_Input(); //預讀緩衝區以清除殘留資料
	}
	else
		AfxMessageBox("開啟埠失敗!",MB_ICONSTOP,0); 

}

4. 傳送:下面看出,既可以傳送“能看的見”的字串,又可以傳送二進位制資料,注意CString如何存取unsigned char型別字元的用法,CByteArray就不用多解釋了,太直觀了。
  void CTestDlg::OnBnClickedButton2()
{
	m_strRecvData.Empty();

/*
	//使用CString代替unsigned char緩衝區
	CString m_strSendData = "";
	m_strSendData += (unsigned char)0x30;
	m_strSendData += (unsigned char)0x08;
	m_strSendData += (unsigned char)0x0a;
	m_strSendData += (unsigned char)0x33;

	m_cComm.put_Output(COleVariant(m_strSendData));//傳送資料
	*/

	//直接使用CByteArray
	CByteArray array;
	array.Add(0x30);
	array.Add(0x08);
	array.Add(0x0A);
	array.Add(0x9F);

	m_cComm.put_Output(COleVariant(array));//傳送資料
}

5. 接收:因為是在該控制元件的事件中處理的(在該控制元件上單擊右鍵新增處理事件)
  void CTestDlg::OnComm()
{
	//從串列埠接收資料並顯示在編輯框中
	VARIANT variant_inp;
	COleSafeArray safearray_inp;
	long len,k;
	byte rxdata[512]; //設定BYTE陣列
	CString strtemp;

	unsigned char *buf = NULL;
	if(m_cComm.get_CommEvent()==2) //值為表示接收緩衝區內有字元
	{
		len=m_cComm.get_InBufferCount(); //得到有效的資料長度
		variant_inp=m_cComm.get_Input(); //讀緩衝區訊息

		//開始使用收到的資料.........
		TRACE("Len= %d\t", len);
		buf = (unsigned char*)variant_inp.parray->pvData;
		for (int i=0; i<len; i++)
		{
			TRACE("0x%02x ", (unsigned char )buf[i]);
		}
		TRACE("\r\n");

		/*
		//另外一種使用方式
		safearray_inp=variant_inp; ///變數轉換
		len=safearray_inp.GetOneDimSize(); //得到有效的資料長度
		for(k=0;k<len;k++)
			safearray_inp.GetElement(&k, rxdata+k);

		TRACE("len = %d\r\n", len);	//列印每次收到的個數

		for(k=0;k<len;k++) //將陣列轉換為CString型變數
		{
			char bt=*(char*)(rxdata+k); //字元型
			strtemp.Format("0x%02x ",bt); //將字元送入臨時變數strtemp存放
			m_strRecvData += strtemp; //加入接收編輯框對應字串
		}
		*/
	}

}

上述直接使用未註釋的程式碼,因為已經得到了資料的長度len,和指標buf,剩下來自己用吧。還有注意的是每次收到的長度len是不定的,因此需要自己寫一個接收處理(如判斷幀頭、幀尾、累計長度)。