讀串口的代碼在網上是鋪天蓋地,但他們幾乎完全是一樣的,第一個人寫出來的纔是英雄,其它的不是。這段代碼類似於下面:
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類,大家知道,類要構造與析構,我敢保證,我上面的程序,在效率上,在第一段代碼構造類的時候,我的代碼已經收完數據了。另一點,是次要的,但要提一下,看看兩段程序申請的變量個數,程序的長度,可讀性,我的代碼都應該較好!