利用串口控件写串口,读出和写入数据的Variant变量的处理,这里包含了两种方式,自己仔细看吧!
接收:
VARIANT variant_inp;
COleSafeArray safearray_inp;
BYTE RxBuffer[10] = {0}; //设置BYTE数组
LONG len,k;
CString strtemp,str;
if(m_Comm1.get_CommEvent()==2) //事件值为2表示接收缓冲区内有字符
{
variant_inp = m_Comm1.get_Input(); //读缓冲区
if (variant_inp.vt == (VT_ARRAY | VT_UI1))
{
BYTE *pByte = NULL;
::SafeArrayAccessData(variant_inp.parray,(void**)&pByte);
memcpy(RxBuffer, pByte, 8);
::SafeArrayUnaccessData(variant_inp.parray);
}
//variant_inp = m_Comm1.get_Input(); //读缓冲区
//safearray_inp = variant_inp; //VARIANT型变量转换为COleSafeArray型变量
//len = safearray_inp.GetOneDimSize(); //得到有效数据长度
//for(k=0; k<len; k++)
// safearray_inp.GetElement(&k,RxBuffer+k);//转换为BYTE型数组
for (k=0; k < 8; k++)
{
strtemp.Format(_T("%02X " ),RxBuffer[k]);
str += strtemp;
}
CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_LIST);
pList->InsertItem(0,str);
this->OnBnClickedBnSend();
}
发送
/*CByteArray m_Array;
BYTE byteArray[8] = {0x7e,0xff,0x00,0x01,0x15,0x15,0x65,0xab};
m_Array.RemoveAll();
m_Array.SetSize(8);
for(int i=0;i<8;i++)
m_Array.SetAt(i,byteArray[i]);
try
{
m_Comm1.put_Output(COleVariant(m_Array));
}
catch (CException* e)
{
TCHAR str[255];
e->GetErrorMessage(str,255);
MessageBox(str);
}*/
BYTE byteArray[8] = {0x7e,0xff,0x00,0x01,0x15,0x15,0x65,0xab};
VARIANT vtOperator;
SAFEARRAY* psa = NULL;
BYTE* pByte = NULL;
::VariantInit(&vtOperator);
psa = ::SafeArrayCreateVector(VT_UI1, 0, 8);
::SafeArrayAccessData(psa, (void**)&pByte);
memcpy(pByte, byteArray, 8);
::SafeArrayUnaccessData(psa);
vtOperator.vt = VT_ARRAY|VT_UI1;
vtOperator.parray = psa;
m_Comm1.put_Output(vtOperator);