我用mscomm控件进行串口通讯,已经通了,但有一个问题:每次主机发送ffH,ffH,00H,30H,ffH,55H,00H,00H;我判定第三、四个字节为00H,30H时就进行回复01H,02H,03H,但当主机多次发送数据过来时,回复的结果也是重复的,如当主机第一次发送ffH,ffH,00H,30H,ffH,55H,00H,00H时,回复的是01H,02H,03H;主机第二次再发送ffH,ffH,00H,30H,ffH,55H,00H,00H时;回复的就成了01H,02H,03H,01H,02H,03H;而我想第二次还是回复01H,02H,03H;下面贴出了我的代码,望达人告知该如何修改。
void CCView::OnOnComm() 
{
LONG len,k,i;    if(m_ctlComm1.GetCommEvent()==2) //comEvReceiv 事件,有数据到达
     {    
len=m_ctlComm1.GetInBufferCount();
         if(len)
{
VARIANT variant_inp;
COleSafeArray safearray_inp;
variant_inp=m_ctlComm1.GetInput();
for(i=0;i<len;i++)
InBuffer1.Add(((BYTE*)variant_inp.parray->pvData)[i]);
}
}
BYTE *data1=InBuffer1.GetData();
k=InBuffer1.GetSize();
if(k>=8)
{
for(i=0;i<k-1;i++)
if(data1[k+2]==0x00 && data1[k+3]==0x30) 


CByteArray Outbuffer; 

BYTE cmd[3]; 
cmd[0]=0x01; 
Outbuffer.SetSize(3); 
Outbuffer.SetAt(0,cmd[0]);  cmd[1]=0x02; 
Outbuffer.SetAt(1,cmd[1]);  cmd[2]=0x03; 
Outbuffer.SetAt(2,cmd[2]); 
m_ctlComm1.SetOutput(COleVariant(Outbuffer));  
}  }      

解决方案 »

  1.   

    for(i=0;i <k-1;i++) 这行没用
      

  2.   

    还有,我发现你对一次来的数据,好像取了很多次!
    我觉得,取一次就行了!或者,你担心一次取不到数据,可以在渠道数据后面,加一个break退出循环!
    m_ctlComm1.SetOutput(COleVariant(Outbuffer)); 
    break;
      

  3.   

    上面的if(data1[k+2]==0x00 && data1[k+3]==0x30)写错了,应该是if(data1[i+2]==0x00 && data1[i+3]==0x30);
    另外,我是用调试助手模拟现实中的主机重发命令。
      

  4.   

    for(i=0;i <k-1;i++) 
    if(data1[k+2]==0x00 && data1[k+3]==0x30) 
    改成
    if(data1[2]==0x00 && data1[3]==0x30) 
    取一次
      

  5.   

    我把问题说完全吧,当主机发送ffH,ffH,00H,30H,ffH,55H,00H,00H;我判定第三、四个字节为00H,30H时就进行回复01H,02H,03H,当主机发送ffH,ffH,00H,01H,ffH,55H,00H,00H;我判定第三、四个字节为00H,01H时就进行回复04H,05H,06H;主机先发送ffH,ffH,00H,30H,ffH,55H,00H,00H时,回复是01H,02H,03H;主机再发送ffH,ffH,00H,01H,ffH,55H,00H,00H时,回复就成了01H,02H,03H,04H,05H,06H;而我只要回复04H,05H,06H就行,下面是代码,不知怎么改。
    void CControlView::OnOnCommMscomm1() 
    {
    LONG len,k,i;    if(m_ctlComm1.GetCommEvent()==2) //comEvReceiv 事件,有数据到达
        {    
    len=m_ctlComm1.GetInBufferCount();
            if(len)
    {
    VARIANT variant_inp;
    COleSafeArray safearray_inp;
    variant_inp=m_ctlComm1.GetInput();
    for(i=0;i<len;i++)
    InBuffer1.Add(((BYTE*)variant_inp.parray->pvData)[i]);
    }
    }
    BYTE *data1=InBuffer1.GetData();
    k=InBuffer1.GetSize();
    if(k>=8)
    {
    for(i=0;i<k-1;i++)
    if(data1[i+2]==0x00 && data1[i+3]==0x30)
    {
                                            CByteArray Outbuffer; 
       BYTE cmd[3];
    cmd[0]=0x01;
    Outbuffer.SetSize(3);
    Outbuffer.SetAt(0,cmd[0]);

    cmd[1]=0x02;
    Outbuffer.SetAt(1,cmd[1]);

    cmd[2]=0x03;
    Outbuffer.SetAt(2,cmd[2]);
    m_ctlComm1.SetOutput(COleVariant(Outbuffer));  
                             } else if(data1[i+2]==0x00 && data1[i+3]==0x01)
    {
                                            CByteArray Outbuffer; 
       BYTE cmd[3];
    cmd[0]=0x04;
    Outbuffer.SetSize(3);
    Outbuffer.SetAt(0,cmd[0]);

    cmd[1]=0x05;
    Outbuffer.SetAt(1,cmd[1]);

    cmd[2]=0x06;
    Outbuffer.SetAt(2,cmd[2]);
    m_ctlComm1.SetOutput(COleVariant(Outbuffer));  
    }
      

  6.   

    你接着发送会怎么样?要是还是继续加的话,估计是接收缓冲区没清,把上次的都留下来了
    PurgeComm(m_comm.CommID,   PURGE_TXCLEAR   +   PURGE_TXCLEAR); 
      

  7.   

    BYTE *data1=InBuffer1.GetData();
    k=InBuffer1.GetSize(); 
    -----------
    k在不断增大吗?
    出错的时候data1数据是什么?
      

  8.   

    k值好像没增,是不是我写的流控制语句不好?
    ----------
    如果K一直是8,就把
    if(k>=8)
    {
    for(i=0;i <k-1;i++) 去掉换成
    if(data1[i+2]==0x00 && data1[i+3]==0x30)
    {
                                            CByteArray Outbuffer;
      BYTE cmd[3];
    cmd[0]=0x01;
    Outbuffer.SetSize(3);
    Outbuffer.SetAt(0,cmd[0]);cmd[1]=0x02;
    Outbuffer.SetAt(1,cmd[1]);cmd[2]=0x03;
    Outbuffer.SetAt(2,cmd[2]);
    m_ctlComm1.SetOutput(COleVariant(Outbuffer)); 
                            }else if(data1[i+2]==0x00 && data1[i+3]==0x01) 
      

  9.   

    换成
    if(data1[2]==0x00 && data1[3]==0x30)