設定函數:
m_ComPort.SetRThreshold(1);//接收緩沖區有大于等于1個字元時,将引發接收資料的OnCommMscomm事件
此函數并不是說序列槽來一個資料就會進中斷處理函數,而是說當接收緩存中的資料等于多于1個字元時就會觸發中斷。,當傳輸資料過快時,接收緩存中一定多于1個字元。然而,MSComm序列槽接收資料是需要時間的。也許,你想以5個字元為一組資料進行接收,但是VC可能進中斷的次數是1,2,3,4等等。無法通過設定SetRThreshold的參數來确定進入中斷的次數。如果以5個字元為一組資料進行接收,依然設定SetRThreshold參數為1,我們需要在中斷函數中實作這個功能--以5個字元為一組資料進行接收,程式如下:
<span style="color:#333333;"> VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[2048]; //設定BYTE數組 An 8-bit integerthat is not signed.
CString strtemp;
if(m_ctrlComm.GetCommEvent()==2) //事件值為2表示接收緩沖區内有字元
{
</span><span style="color:#ff0000;">Sleep(1); //延時1ms</span><span style="color:#333333;">
variant_inp=m_ctrlComm.GetInput(); //讀緩沖區
safearray_inp=variant_inp; //VARIANT型變量轉換為ColeSafeArray型變量
len=safearray_inp.GetOneDimSize(); //得到有效資料長度
TRACE("len is %d\n",len);
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k);//轉換為BYTE型數組
if(len==6)
{
.........(具體處理代碼)
}
}</span>
注意,為了保證連續接收資料時VC有足夠的時間接收資料,需要在接收前添加延時指令:Sleep(1); //1ms(延時時間根據具體的資料傳輸時間來定).如果沒有這句延時的指令,接收的資料個數必然不對。
參考自:CSDN http://blog.csdn.net/jiangdf/article/details/6097205
也可以使用類COMMTIMEOUTS 進行序列槽的接收(readfile)和發送,具體内容請檢視文章:http://bbs.csdn.net/topics/390116830