本文目錄一覽:
解釋一下這段程序
小弟只有10年VC++經驗,幫你解讀一下哦: 滿意的話麻煩給我分.
如下代碼是為了實現: 接收串口過來的數據! 首先初始化一個泛型類型接受容器, 接收串口接口發來的數據,然後顯示在界面上的edit控件上!
VARIANT variant_inp; 用VARIANT 泛型變量類型 定義一個數組變量variant_inp; 泛型就是任何類型都可以放進去的意思. 作為緩衝池使用很適合.
COleSafeArray safearray_inp; 用COleSafeArray用OLE安全數據容器類 定義一個對象名字是 safearray inp 因為VARIANT雖然可以放任何類型數據到這個數組中,但該類型沒有豐富的處理成員函數,說白了他是結構體不是類, 所以 需要做個轉換, 轉為COleSafeArray類型的數組類即可. 他具有非常豐富的成員函數.
那麼, 你會問為什麼不直接讓safearray_inp=m_ctrlComm.GetInput(); 讀緩衝區,而要經過一個中間變量呢?
variant_inp=m_ctrlComm.GetInput(); 讀緩衝區
safearray_inp=variant_inp; VARIANT轉換成COleSafeArray型變量
VARIANT和COleSafeArray 是什麼關係呢?
原因是:
這中間有調用不同的重載=運算符,m_ctrlComm.GetInput(); 的數據可以轉化為variant_inp,有默認的轉化方式,而safearray_inp=variant_inp則是另一個轉化方式,如果直接轉,可能數據不對。
VARIANT和COleSafeArray 一個是結構體,一個是類,各自的數據構造不一樣。
long k=0; 初始化一個長整型變量 k=0;
int len; 定義長度len,整數型.
BYTE rxdata[2048]; 定義接受數據的數組,2k大小,2048字節. 為BYTE類型,也即unsigned char類型.
CString strtemp; 定義一個CString類型的字符串strtemp;
if(m_ctrlComm.GetCommEvent()) 如果控制通信對象m_ctlComm有get的事件發生,
{
————————
這裡應該加switch(ret) , 將上面getcommevent賦值給ret.
case 2: 事件值為2表示接收緩衝區內有字符
{
variant_inp=m_ctrlComm.GetInput(); 控制通信器對象得到輸入數據流. 如果GetCommEvent返回2,說明有字符到達了, 接收緩衝區內有字符
safearray_inp=variant_inp; 將variant inp轉換為COleSafeArray 類型,付給safearry inp. 因為COleSafeArray提供了豐富的函數處理.符合我們的需要.
len=safearray_inp.GetOneDimSize(); 獲取輸入安全數組的長度len
for(k=0;klen;k++) 做個循環,
{
safearray_inp.GetElement(k,rxdata+k); 從輸入的安全數組到rxdata進行數據拷貝. 一次一個字節拷貝.
}
for(k=0;klen;k++) 做個循環. 讀取len長度的所有字節.
{
BYTE bt=*(char*)(rxdata+k); 內存 rxdata 起始地址+k字節偏移的指針 取值,得到 一個字節.
strtemp.Format(“%c”,bt); strtemp賦值為bt,也就是一個字符.
m_strEditRXData+=strtemp; m_strEdit這個CEdit控件顯示一直加長.
}
}
UpdateData(FALSE); 將內存變量數據更新到界面.
====================
參考:
VARIANT
C++、BASIC、Java、Pascal、Script……計算機語言多種多樣,而它們各自又都有自己的數據類型,COM
產生目的,其中之一就是要跨語言(注3)。而 VARIANT
數據類型就具有跨語言的特性,同時它可以表示(存儲)任意類型的數據。從C語言的角度來講,VARIANT
其實是一個結構,結構中用一個域(vt)表示——該變量到底表示的是什麼類型數據,同時真正的數據則存貯在 union
空間中。結構的定義太長了(雖然長,但其實很簡單)大家去看 MSDN 的描述吧,這裡給出如何使用的簡單示例:
學生:我想用 VARIANT 表示一個4字節長的整數,如何做?
老師:VARIANT v; v.vt=VT_I4; v.lVal=100;
學生:我想用 VARIANT 表示布爾值“真”,如何做?
老師:VARIANT v; v.vt=VT_BOOL; v.boolVal=VARIANT_TRUE;
學生:這麼麻煩?我能不能 v.boolVal=true; 這樣寫?
老師:不可以!因為
類型
字節長度
假值
真值
bool
1(char)
0(false)
1(true)
BOOL
4(int)
0(FALSE)
1(TRUE)
VT_BOOL
2(short int)
0(VARIANT_FALSE)
-1(VARIANT_TRUE)
所以如果你 v.boolVal=true 這樣賦值,那麼將來 if(VARIANT_TRUE==v.boolVal)
的時候會出問題(-1 !=
1)。但是你注意觀察,任何布爾類型的“假”都是0,因此作為一個好習慣,在做布爾判斷的時候,不要和“真值”相比較,而要與“假值”做比較。
學生:謝謝老師,你太牛了。我對老師的敬仰如滔滔江水,連綿不絕……
學生:我想用 VARIANT 保存字符串,如何做?
老師:VARIANT v; v.vt=VT_BSTR; v.bstrVal=SysAllocString(L”Hello,你好”);
學生:哦……我明白了。可是這麼操作真夠麻煩的,有沒有簡單一些的方法?
老師:有呀,你可以使用現成的包裝類 CComVariant、COleVariant、_variant_t。比如上面三個問題就可以這樣書寫:CComVariant v1(100),v2(true),v3(“Hello,你好”); 簡單了吧?!(注4)
學生:老師,我再問最後一個問題,我如何用 VARIANT 保存一個數組?
老師:這個問題很複雜,我現在不能告訴你,我現在告訴你怕你印象不深……(注5)
學生:~!@#$%^*()……暈!
VARIANT 數據類型在文件OAIDL.IDL中定義如下:
struct tagVARIANT {
union {
struct __tagVARIANT {
VARTYPE vt;
WORD wReserved1;
WORD wReserved2;
WORD wReserved3;
union {
ULONGLONG ullVal;
LONGLONG llVal;
LONG lVal;
BYTE bVal;
SHORT iVal;
FLOAT fltVal;
DOUBLE dblVal;
VARIANT_BOOL boolVal;
_VARIANT_BOOL bool;
SCODE scode;
CY cyVal;
DATE date;
BSTR bstrVal;
IUnknown * punkVal;
IDispatch * pdispVal;
SAFEARRAY * parray;
BYTE * pbVal;
SHORT * piVal;
LONG * plVal;
LONGLONG * pllVal;
FLOAT * pfltVal;
DOUBLE * pdblVal;
VARIANT_BOOL *pboolVal;
_VARIANT_BOOL *pbool;
SCODE * pscode;
CY * pcyVal;
DATE * pdate;
BSTR * pbstrVal;
IUnknown ** ppunkVal;
IDispatch ** ppdispVal;
SAFEARRAY ** pparray;
VARIANT * pvarVal;
PVOID byref;
CHAR cVal;
USHORT uiVal;
ULONG ulVal;
INT intVal;
UINT uintVal;
DECIMAL * pdecVal;
CHAR * pcVal;
USHORT * puiVal;
ULONG * pulVal;
ULONGLONG * pullVal;
INT * pintVal;
UINT * puintVal;
struct __tagBRECORD {
PVOID pvRecord;
IRecordInfo * pRecInfo;
} __VARIANT_NAME_4;
} __VARIANT_NAME_3;
} __VARIANT_NAME_2;
DECIMAL decVal;
} __VARIANT_NAME_1;
};
給水管網中JSCL是什麼井的簡稱
你好,很高興為你解答。
JS代表:給水
CL這個通用含義是:中心線(center line)
當然有的設計院有自己的命名規則,所以你要結合圖紙去看
如何建一個類似於這樣的網站http://www.cljsjjyw.com/yjptc/啊?
首先你得取得這個網站的FTP管理權,然後你得有一套為YJPTC準備的網站程序,要麼你就直接獲取cljsjjyw.com的數據與程序。程序在本機調試完成後,上傳到站點的yjptc目錄下邊,設置好默認的訪問文件如:index.htm/index.asp/default.php等。。就可以在瀏覽器里直接訪問了。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/293220.html