VS2008高版本VC使用微軟串列埠控制元件mscomm小結
阿新 • • 發佈:2019-02-01
在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是不定的,因此需要自己寫一個接收處理(如判斷幀頭、幀尾、累計長度)。