利用的串口控件,收到的数据格式为
FF FF 03 F8 EA 93 01 03 05 
第一,二字节均为FF
第三字节为 帧内容长度 = 帧长度-7;
第四字节为长度校验 = 0FFH – 帧内容长度;
第五、六字节为CRC校验,标准为(CCITT-16);从第七字节开始CRC校验;
第七字节为帧类型;
第八字节开始为帧内容。
先不考虑校验,由于数据是不定的,根据第三字节内容长度来得到指定位置的内容,
由于comm控件往往是流的因素,所收到的数据会引发好几次事件,即串口数据不是一次收齐的。
有时我第一次能读出数据,第二次有读不出了,有时变量清空反而一次数据也收不到了,本人vc 初学,故请各位高手指点谜津,分数不够的话,我可以再加。void CSCommTestDlg::OnComm() 
{
// TODO: Add your control notification handler code here
VARIANT variant_inp;
COleSafeArray safearray_inp;
BYTE ttt[2048];
CString xxx,xxa;
LONG len,k;
int lent,t;
BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.
CString strtemp;
if(m_ctrlComm.GetCommEvent()==2)     //事件值为2表示接收缓冲区内有字符
{
for (k=0; k<1000000;k++)
lent=0;
BYTE Chrs[256];
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型数组
safearray_inp.GetElement(&k,ttt+k);
}
m_edit="";
for(k=0;k<len;k++)             //将数组转换为Cstring型变量
{
BYTE bt=*(char*)(ttt+k);      //字符型
if ((bt==0xFF) && (*(char*)(ttt+k+1)==0xFF))
m_strRev="";
if(m_ctrlHexDisplay.GetCheck())
strtemp.Format("%02X ",bt); //将字符以十六进制方式送入临时变量strtemp存放,注意这里加入一个空隔
else 
strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放
m_strRev+=strtemp;    //加入接收编辑框对应字符串   
}
lent=m_strRev.GetLength();
for (k=0;k<lent;k++)
Chrs[k]=m_strRev.GetAt(k);
lent=m_strRev.GetLength();
for (k=0;k<lent;k++)
Chrs[k]=m_strRev.GetAt(k);
lent=m_strRev.GetLength();
for (k=0;k<lent;k++)
Chrs[k]=m_strRev.GetAt(k);
lent=m_strRev.GetLength();
for (k=0;k<lent;k++)
Chrs[k]=m_strRev.GetAt(k);
int HaveF=0;
for (k=0;k<lent;k++)
{
if (Chrs[k]==0xFF)
{
HaveF=1;
break;
}
else
m_strRev="";
}
if (HaveF!=1 )
m_strRev="";
else
{
if ((lent>k+7) && (Chrs[k+1]==0xFF) && (Chrs[k+2]+Chrs[k+3]==0xFF))
{
for(t=k+7;t<Chrs[k+2]+7;t++)             //将数组转换为Cstring型变量
{
BYTE bt=Chrs[t];      //字符型)
strtemp.Format("%02X ",bt); //将字符以十六进制方式送入临时变量strtemp存放,注意这里加入一个空隔
xxa+=strtemp;    //加入接收编辑框对应字符串    
}
m_edit=xxa;
xxa="";
}
}
}
UpdateData(FALSE);           //更新编辑框内容
}

解决方案 »

  1.   

    串行通信 
    SerialClass  一个串行通信类 2002.04.02 
    http://www.chinaoak.com/download/sources/network/Comm/SerialClass.zip
      

  2.   

    BCBCOMM  Borland c++ builder串口通讯源码示例程序 2003.01.02 
    http://www.chinaoak.com/download/sources/network/Comm/bcbcomm.zip
    ScTest  串口通信测试 2003.03.19 
    http://www.chinaoak.com/download/sources/network/Comm/scporttest.zip
    SerialProg  串行通信编程 
    http://www.chinaoak.com/download/sources/network/Comm/SerialProg.zip