用控件(CMSComm)讀串口代碼(高效率,不同於網上常見的,決沒有抄襲)!

讀串口的代碼在網上是鋪天蓋地,但他們幾乎完全是一樣的,第一個人寫出來的纔是英雄,其它的不是。這段代碼類似於下面:

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表示接收緩衝區內有字符
{
 ////////以下你可以根據自己的通信協議加入處理代碼
 variant_inp=m_ctrlComm.GetInput(); //讀緩衝區
 safearray_inp=variant_inp; //VARIANT型變量轉換爲ColeSafeArray型變量
 len=safearray_inp.GetOneDimSize(); //得到有效數據長度
 for(k=0;k<len;k++)
  safearray_inp.GetElement(&k,rxdata+k);//轉換爲BYTE型數組
 for(k=0;k<len;k++) //將數組轉換爲Cstring型變量
 {
  BYTE bt=*(char*)(rxdata+k); //字符型
  strtemp.Format("%c",bt); //將字符送入臨時變量strtemp存放
  m_strRXData+=strtemp; //加入接收編輯框對應字符串
        }
}
UpdateData(FALSE); //更新編輯框內容

下面我先給出我的代碼:

VARIANT Rec_Data;
int Data_Len;
char Rec_Data_Array[2048];
if (m_ctrlComm.GetCommEvent() == 2) //事件值爲2表示接收緩衝區內有字符
{
 Rec_Data = m_SerialCOM.GetInput();
 int Data_Len = Rec_Data.parray->rgsabound->cElements; //取出一維的數據個數
 memcpy(Rec_Data_Array, (char*) Rec_Data.parray->pvData, Data_Len); //拷貝出數據
 Rec_Data_Array[Data_Len] = 0;
}
UpdateData(FALSE); //更新編輯框內容

我的代碼有以下特點:
一:程序簡單;
二:也是最主要的,效率很高!
我沒有使用COleSafeArray類,大家知道,類要構造與析構,我敢保證,我上面的程序,在效率上,在第一段代碼構造類的時候,我的代碼已經收完數據了。另一點,是次要的,但要提一下,看看兩段程序申請的變量個數,程序的長度,可讀性,我的代碼都應該較好!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章