VCmsscom串口编程-十六进制--二进制发送接受数据.docVIP

  • 36
  • 0
  • 约2.05千字
  • 约 3页
  • 2017-11-20 发布于北京
  • 举报

VCmsscom串口编程-十六进制--二进制发送接受数据.doc

VCmsscom串口编程-十六进制--二进制发送接受数据

visual c++/vc/vc6/vs2003/vs2005 msscom串口编程-十六进制/二进制发送、接受数据 2008-12-24 00:46 首先,要注意vs2003下跟vc6的接口不一样(名字变化很有规律,请看前文)。 另外,MSComm里用到的VARIANT, COleVariant类型与CString, BYTE之间的转换,以实现数据的发送和接收。 CString与int的转换,实现对接收来的数据的运算。 一、MSComm和VARIANT VC6自带的串口ActiveX MSComm的对象使用SetOutput()和GetInput()方法实现发送和接收。这两个函数的参数都是VARIANT类型。 void CMSComm::SetOutput(const VARIANT newValue) VARIANT CMSComm::GetInput() 发送过程: VARIANT其实是一个C++结构类型,COleVariant类型对VARIANT做了进一步的封装和扩展,提供了许多新的功能和操作方法,支持OLE自动化,且更容易向其数据成员填入数据。由于COleVariant类型由VARIANT派生而来,因此将COleVariant类型的变量传递给SetOutput函数更为方便。另外,SetOutput的参数newValue类型必须是存放字节类型数据的动态数组。因此,可以利用Visual C++提供CByteArray类型来构造COleVariant类型的对象,并将其传递给SetOutput函数。对CByteArray类型变量的操作相对来说要容易的多,比如其成员函数SetSize可用来设置动态数组的大小,下标操作符[]可用来为其元素赋值等等。 下面的程序代码可实现将存放在缓冲区strBuf中的100个字节的数据通过通讯控件发送出去: …… BYTE strBuf[128]; CByteArray OutBuf; COleVariant varOutput; …… OutBuf.SetSize(100); for(i=0;i100;i++) ?? OutBuf[i] = strBuf[i];//BYTE转CByteArray varOutput = OutBuf;//CByteArray转COleVariant m_pCommDlg-m_Comm.SetOutput(varOutput); …… 或者使用OutBuf.add添加字符。 对于ascii/字符类型的发送,需要转换一次: int CCommWizardDlg::String2Hex(CString str, CByteArray senddata) { int hexdata,lowhexdata; int hexdatalen=0; int len=str.GetLength(); senddata.SetSize(len/2); for(int i=0;ilen;) { ?? char lstr,hstr=str[i]; ?? if(hstr== ) ?? { ??? i++; ??? continue; ?? } ?? i++; ?? if(i=len) ??? break; ?? lstr=str[i]; ?? hexdata=ConvertHexChar(hstr); ?? lowhexdata=ConvertHexChar(lstr); ?? if((hexdata==16)||(lowhexdata==16)) ??? break; ?? else ??? hexdata=hexdata*16+lowhexdata; ?? i++; ?? senddata[hexdatalen]=(char)hexdata; ?? hexdatalen++; } senddata.SetSize(hexdatalen); return hexdatalen; } //这是一个将字符转换为相应的十六进制值的函数 //功能:若是在0-F之间的字符,则转换为相应的十六进制字符,否则返回-1 char CCommWizardDlg::ConvertHexChar(char ch) { if((ch=0)(ch=9)) ?? return ch-0x30; else if((ch=A)(ch=F)) ?? return ch-A+10; else if((ch=a)(ch=f)) ?? return ch-a+10; else return (-1); } 另外,vs2003/2005下要使用m_pCommDlg-m_Comm.put_Output(varOutput); 具体参考: /it%5Fsecurity/blog/item/ac6647886dfd79b

文档评论(0)

1亿VIP精品文档

相关文档