我用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));
} }
}
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));
} }
}
我觉得,取一次就行了!或者,你担心一次取不到数据,可以在渠道数据后面,加一个break退出循环!
m_ctlComm1.SetOutput(COleVariant(Outbuffer));
break;
另外,我是用调试助手模拟现实中的主机重发命令。
if(data1[k+2]==0x00 && data1[k+3]==0x30)
改成
if(data1[2]==0x00 && data1[3]==0x30)
取一次
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));
}
PurgeComm(m_comm.CommID, PURGE_TXCLEAR + PURGE_TXCLEAR);
k=InBuffer1.GetSize();
-----------
k在不断增大吗?
出错的时候data1数据是什么?
----------
如果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)
if(data1[2]==0x00 && data1[3]==0x30)