VS2008高版本VC使用微軟串口控件mscomm小結(jié)
在VS2008中使用mscomm的文章有很多,這里把關(guān)鍵的幾處小結(jié)一下:
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())?//如果發(fā)現(xiàn)串口本來是打開的,則關(guān)閉串口
m_cComm.put_PortOpen(FALSE);
m_cComm.put_CommPort(commNo);?//選擇COM1端口
m_cComm.put_InputMode(1);?//輸入方式為二進制方式
m_cComm.put_InBufferSize(1024);?//設(shè)置輸入緩沖區(qū)
m_cComm.put_OutBufferSize(512);?//設(shè)置輸出緩沖區(qū)
m_cComm.put_Settings(TEXT("9600,n,8,1"));//波特率,無校驗,個數(shù)據(jù)位,個停止位
if(!m_cComm.get_PortOpen())
{
m_cComm.put_PortOpen(TRUE);?//打開串口
m_cComm.put_RThreshold(1);?//每當(dāng)接收緩沖區(qū)有個字符則接收串口數(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ā)送二進制數(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. 接收:因為是在該控件的事件中處理的(在該控件上單擊右鍵添加處理事件)
??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); //打印每次收到的個數(shù)
for(k=0;k<len;k++)?//將數(shù)組轉(zhuǎn)換為CString型變量
{
char?bt=*(char*)(rxdata+k);?//字符型
strtemp.Format("0x%02x?",bt);?//將字符送入臨時變量strtemp存放
m_strRecvData?+=?strtemp;?//加入接收編輯框?qū)?yīng)字符串
}
*/
}
}
上述直接使用未注釋的代碼,因為已經(jīng)得到了數(shù)據(jù)的長度len,和指針buf,剩下來自己用吧。還有注意的是每次收到的長度len是不定的,因此需要自己寫一個接收處理(如判斷幀頭、幀尾、累計長度)。





