天天看點

關于VC序列槽控件MSComm響應中斷函數次數不定的問題

設定函數:

 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