VS2008高版本VC使用微軟串口控件mscomm小結(jié)
在VS2008中使用mscomm的文章有很多,這里把關(guān)鍵的幾處小結(jié)一下:
1. 最好安裝一遍VC++6.0,因?yàn)閙scomm控件在VC6中是自帶的。裝好了VC6,在VS2008中就可以直接使用mscomm了;如果不想安裝VC6的,那么直接到這里下載mscomm控件(http://download.csdn.net/detail/dijkstar/9513049),直接運(yùn)行里面的批處理文件注冊(cè);
2. 在VS2008中使用該控件的方法:選擇菜單【工具】--選擇工具箱項(xiàng)--COM組件--Microsoft Communications Control,version 6.0;
3. 初始化:
??void?CTestDlg::OnBnClickedButton1() { //添加的對(duì)串口的初始化語句 int?commNo??=?5; if(m_cComm.get_PortOpen())?//如果發(fā)現(xiàn)串口本來是打開的,則關(guān)閉串口 m_cComm.put_PortOpen(FALSE); m_cComm.put_CommPort(commNo);?//選擇COM1端口 m_cComm.put_InputMode(1);?//輸入方式為二進(jìn)制方式 m_cComm.put_InBufferSize(1024);?//設(shè)置輸入緩沖區(qū) m_cComm.put_OutBufferSize(512);?//設(shè)置輸出緩沖區(qū) m_cComm.put_Settings(TEXT("9600,n,8,1"));//波特率,無校驗(yàn),個(gè)數(shù)據(jù)位,個(gè)停止位 if(!m_cComm.get_PortOpen()) { m_cComm.put_PortOpen(TRUE);?//打開串口 m_cComm.put_RThreshold(1);?//每當(dāng)接收緩沖區(qū)有個(gè)字符則接收串口數(shù)據(jù) m_cComm.put_InputLen(0);?//設(shè)置當(dāng)前緩沖區(qū)長度為m_cComm.get_Input();?//預(yù)讀緩沖區(qū)以清除殘留數(shù)據(jù) } else AfxMessageBox("打開端口失敗!",MB_ICONSTOP,0);? }
4. 發(fā)送:下面看出,既可以發(fā)送“能看的見”的字符串,又可以發(fā)送二進(jìn)制數(shù)據(jù),注意CString如何存取unsigned char類型字符的用法,CByteArray就不用多解釋了,太直觀了。
??void?CTestDlg::OnBnClickedButton2() { m_strRecvData.Empty(); /* //使用CString代替unsigned?char緩沖區(qū) 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));//發(fā)送數(shù)據(jù) */ //直接使用CByteArray CByteArray?array; array.Add(0x30); array.Add(0x08); array.Add(0x0A); array.Add(0x9F); m_cComm.put_Output(COleVariant(array));//發(fā)送數(shù)據(jù) }
5. 接收:因?yàn)槭窃谠摽丶氖录刑幚淼模ㄔ谠摽丶蠁螕粲益I添加處理事件)
??void?CTestDlg::OnComm() { //從串口接收數(shù)據(jù)并顯示在編輯框中 VARIANT?variant_inp; COleSafeArray?safearray_inp; long?len,k; byte?rxdata[512];?//設(shè)置BYTE數(shù)組 CString?strtemp; unsigned?char?*buf?=?NULL; if(m_cComm.get_CommEvent()==2)?//值為表示接收緩沖區(qū)內(nèi)有字符 { len=m_cComm.get_InBufferCount();?//得到有效的數(shù)據(jù)長度 variant_inp=m_cComm.get_Input();?//讀緩沖區(qū)消息 //開始使用收到的數(shù)據(jù)......... TRACE("Len=?%dt",?len); buf?=?(unsigned?char*)variant_inp.parray->pvData; for?(int?i=0;?i<len;?i++) { TRACE("0x%02x?",?(unsigned?char?)buf[i]); } TRACE("rn"); /* //另外一種使用方式 safearray_inp=variant_inp;?///變量轉(zhuǎn)換 len=safearray_inp.GetOneDimSize();?//得到有效的數(shù)據(jù)長度 for(k=0;k<len;k++) safearray_inp.GetElement(&k,?rxdata+k); TRACE("len?=?%drn",?len); //打印每次收到的個(gè)數(shù) for(k=0;k<len;k++)?//將數(shù)組轉(zhuǎn)換為CString型變量 { char?bt=*(char*)(rxdata+k);?//字符型 strtemp.Format("0x%02x?",bt);?//將字符送入臨時(shí)變量strtemp存放 m_strRecvData?+=?strtemp;?//加入接收編輯框?qū)?yīng)字符串 } */ } }
上述直接使用未注釋的代碼,因?yàn)橐呀?jīng)得到了數(shù)據(jù)的長度len,和指針buf,剩下來自己用吧。還有注意的是每次收到的長度len是不定的,因此需要自己寫一個(gè)接收處理(如判斷幀頭、幀尾、累計(jì)長度)。