1. 程式人生 > >用控制元件(CMSComm)讀串列埠程式碼(高效率,不同於網上常見的,決沒有抄襲)!

用控制元件(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類,大家知道,類要構造與析構,我敢保證,我上面的程式,在效率上,在第一段程式碼構造類的時候,我的程式碼已經收完資料了。另一點,是次要的,但要提一下,看看兩段程式申請的變數個數,程式的長度,可讀性,我的程式碼都應該較好!