国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
VC6里用到的一些類型轉(zhuǎn)換
[引子]
在做畢設(shè)的時(shí)候,用到VC6里面的串口控件。我對(duì)VC幾乎是一竅不通的,這次做畢設(shè)里面的類型轉(zhuǎn)換也困擾了我好久。在此小小總結(jié)一下。

[主要內(nèi)容]
一、MSComm里用到的VARIANT, COleVariant類型與CString, BYTE之間的轉(zhuǎn)換,以實(shí)現(xiàn)數(shù)據(jù)的發(fā)送和接收
二、CString與int的轉(zhuǎn)換,實(shí)現(xiàn)對(duì)接收來(lái)的數(shù)據(jù)的運(yùn)算


一、MSComm和VARIANT
VC6自帶的串口ActiveX MSComm的對(duì)象使用SetOutput()和GetInput()方法實(shí)現(xiàn)發(fā)送和接收。這兩個(gè)函數(shù)的參數(shù)都是VARIANT類型。
void CMSComm::SetOutput(const VARIANT& newValue)
VARIANT CMSComm::GetInput()


發(fā)送過(guò)程:

VARIANT其實(shí)是一個(gè)C++結(jié)構(gòu)類型,COleVariant類型對(duì)VARIANT做了進(jìn)一步的封裝和擴(kuò)展,提供了許多新的功能和操作方法,支持OLE自動(dòng)化,且更容易向其數(shù)據(jù)成員填入數(shù)據(jù)。由于COleVariant類型由VARIANT派生而來(lái),因此將COleVariant類型的變量傳遞給SetOutput函數(shù)更為方便。另外,SetOutput的參數(shù)newValue類型必須是存放字節(jié)類型數(shù)據(jù)的動(dòng)態(tài)數(shù)組。因此,可以利用Visual C++提供CByteArray類型來(lái)構(gòu)造COleVariant類型的對(duì)象,并將其傳遞給SetOutput函數(shù)。對(duì)CByteArray類型變量的操作相對(duì)來(lái)說(shuō)要容易的多,比如其成員函數(shù)SetSize可用來(lái)設(shè)置動(dòng)態(tài)數(shù)組的大小,下標(biāo)操作符[]可用來(lái)為其元素賦值等等。

下面的程序代碼可實(shí)現(xiàn)將存放在緩沖區(qū)strBuf中的100個(gè)字節(jié)的數(shù)據(jù)通過(guò)通訊控件發(fā)送出去:

……
BYTE strBuf[128];
CByteArray OutBuf;
COleVariant varOutput;
……
OutBuf.SetSize(100);
for(i=0;i<100;i++)
  OutBuf[i] = strBuf[i];//BYTE轉(zhuǎn)CByteArray
varOutput = OutBuf;//CByteArray轉(zhuǎn)COleVariant
m_pCommDlg->m_Comm.SetOutput(varOutput);
……


利用通訊控件發(fā)送數(shù)據(jù)的關(guān)鍵在于構(gòu)造COleVariant類型的變量,并向其中填入通訊數(shù)據(jù),使其能滿足通訊控件的成員函數(shù)SetOutput的需要。上面的程序語(yǔ)句varOutput = OutBuf可以直接寫(xiě)成:

COleVariant varOutput(OutBuf);


但這樣必須將變量varOutput的定義語(yǔ)句COleVariant varOutput刪除掉。


上例只能發(fā)送ASCII編碼的字符,為了以十六進(jìn)制發(fā)送數(shù)據(jù),我參考一些資料后寫(xiě)了一個(gè)函數(shù):

void CSCommTestDlg::OutputBin(unsigned char *data,int len)
{
  CByteArray binData;
  binData.RemoveAll(); //清空binData
  for(int i=0;i<len;i++)
    binData.Add(*(data+i));
  COleVariant var(binData); //將binData轉(zhuǎn)化為Variant數(shù)據(jù)類型
  m_ctrlComm.SetOutput(var);
}


使用時(shí),只需要先定義一個(gè)字符數(shù)組,往數(shù)組里面填裝數(shù)據(jù),然后調(diào)用函數(shù)就可以將十六進(jìn)制數(shù)據(jù)發(fā)送到串口:

unsigned char cmd[2];
cmd[0]= 0x01;
cmd[1]= 0x02;
OutputBin(cmd,2);



接收過(guò)程:
看到過(guò)兩種轉(zhuǎn)換方法分別是VARIANT轉(zhuǎn)COleVariant轉(zhuǎn)CByteArray(需用parray)和VARIANT轉(zhuǎn)COleSafeArray轉(zhuǎn)CString。我只用過(guò)后者。

if(m_ctrlComm.GetCommEvent()==2) //事件值為2表示接收緩沖區(qū)內(nèi)有字符
  {
    variant_inp=m_ctrlComm.GetInput(); //讀緩沖區(qū)
    safearray_inp=variant_inp;  //VARIANT型變量轉(zhuǎn)換為ColeSafeArray型變量
    len=safearray_inp.GetOneDimSize(); //得到有效數(shù)據(jù)長(zhǎng)度
    for(k=0;k<len;k++)
      safearray_inp.GetElement(&k,rxdata+k);//轉(zhuǎn)換為BYTE型數(shù)組
    for(k=0;k<len;k++)             //將數(shù)組轉(zhuǎn)換為Cstring型變量
    {
      BYTE bt;
      bt=*(char*)(rxdata+k);    //字符型
      //strtemp.Format("%c",bt);    //將字符送入臨時(shí)變量strtemp存放
      strtemp.Format("%02X ",bt);   //十六進(jìn)制顯示
      m_strEditRXData+=strtemp;  //加入接收編輯框?qū)?yīng)字符串
    }
  }
  UpdateData(FALSE);  //更新編輯框內(nèi)容


二、CString和int的轉(zhuǎn)換

將CString轉(zhuǎn)換成整數(shù)可以用atoi函數(shù)

CString ss="1212.12";
int temp=atoi(ss);
//也有人這樣寫(xiě):temp=atoi((LPCTSTR)ss);


將數(shù)字轉(zhuǎn)換為CString變量,可以使用CString的Format函數(shù)。如

CString s;
int i = 64;
s.Format("%d", i)


Format函數(shù)的功能很強(qiáng),值得研究一下。
如果是使用char數(shù)組,也可以使用sprintf函數(shù)。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
BSTR、LPSTR和LPWSTR 等多種VC字符類型分析及各種字符類型轉(zhuǎn)換
CString類型字符串,轉(zhuǎn)換到 BYTE類型
_variant_t與CString
VC常用數(shù)據(jù)類型使用轉(zhuǎn)換詳解
基于VC的接收機(jī)串口程序設(shè)計(jì)
vc字符串轉(zhuǎn)換處理:(絕對(duì)精華,收集所有的例子)
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服