我发一组数据给DSP,DSP会回我几个数(比如说8个数), 
我现在要依次定时发送2组数据,我设了一个定时器每隔100ms发一组数,但是我发了数据以后DSP回我可能才收到第6个数时候我又发第二组数据了,(虽然说DSP处理数据很快,但有这种可能),或者我发了一组数据,DSP不返回我,因为我用的是mscomm控件,我不知道有没有这样的状态判断函数,比如说这个函数达到某个数值时,表明接受事件完成了,可以发送第二组数据, 我的发送是这样的: 
void CSCommTestDlg::sendbufferdata() 

UpdateData(true); 
    _SendDataOne=_send1; 
    _SendDataTwo=_send2; 
_SendDataThree=_send3; 
_SendDataOne.Remove(' '); 
_SendDataTwo.Remove(' '); 
_SendDataThree.Remove(' '); 
len[0]=_SendDataOne.GetLength(); 
len[1]=_SendDataTwo.GetLength(); 
len[2]=_SendDataThree.GetLength(); 
if(len[0]%2!=0||len[1]%2!=0||len[2]%2!=0) {AfxMessageBox("输入数据长度错误!");return;} 
else { 
if(len[0]==0 && len[1]==0 && len[2]==0) {AfxMessageBox("输入数据长度错误!"); return;} 
 CharToHex(_SendDataOne,len[0]); 
for(int i=0;i<len[0];i++) 
{ data[0][i]=HexData[i];} 
CharToHex(_SendDataTwo,len[1]); 
for(int i=0;i<len[1];i++) 
{ data[1][i]=HexData[i];} 
CharToHex(_SendDataThree,len[2]); 
for(int i=0;i<len[2];i++) 
{ data[2][i]=HexData[i];} 
for(int i=0;i<3;i++) 
{ crc_write(&data[i][0],len[i]/2);} 
if(m_strRXData.IsEmpty()==0) 
{ m_strRXData+="\r\n";} 
UpdateData(false);} 

bool CSCommTestDlg::SendOne(long Time) 

    sendbufferdata(); 
if(len[0]!=0) 

senddatacount+=(long)((len[0]+4)/2); 
Count.Format("发送:%d",senddatacount); 
sendcount.SetWindowText(Count); 
     CByteArray array;                                                              //// 
array.RemoveAll(); 
//for(int j=0;j<3;j++) 

for(int i=0;i<(len[0]+4)/2;i++) 

array.InsertAt(i,data[0][i],1);  

m_ctrlComm.put_Output(COleVariant(array));//发送数据                              //// 
UpdateData(false); 

for(int i=0;i<(len[0]+4)/2;i++) 

if(data[0][i]>0x0F) 
   SendDisplay.Format("%X ",data[0][i]); 
else SendDisplay.Format("0%X ",data[0][i]); 
   m_strRXData+=SendDisplay; 

}     m_strRXData+="\r\n";                                                            //// 
    UpdateData(FALSE); 
       ReceiveOne(); 

SendFunc=SendTwo; 
    return 0; 


bool CSCommTestDlg::SendTwo(long Time)                                               //// 

sendbufferdata(); 
if(m_ctrlComm.get_CTSHolding()==true) 

if(len[1]!=0) 
{ senddatacount+=(long)((len[1]+4)/2); 
Count.Format("发送:%d",senddatacount); 
sendcount.SetWindowText(Count); 
CByteArray array; 
array.RemoveAll(); 
//for(int j=0;j<3;j++) 

for(int i=0;i<(len[1]+4)/2;i++)                                                          //// 

array.InsertAt(i,data[1][i],1);  
} //if(m_ctrlComm.get_CommEvent()==1) 
m_ctrlComm.put_Output(COleVariant(array));//发送数据 
UpdateData(true); 

for(int i=0;i<(len[1]+4)/2;i++) 

if(data[1][i]>0x0F)                                                        //// 
   SendDisplay.Format("%X ",data[1][i]); 
else SendDisplay.Format("0%X ",data[1][i]); 
   m_strRXData+=SendDisplay; 



    m_strRXData+="\r\n"; 
 UpdateData(FALSE); 
ReceiveTwo(); 
//Sleep(1000); 
//if(quan==1)//.get_CommEvent()==7) 
SendFunc=SendThree; 
return 0; 

bool CSCommTestDlg::SendThree(long Time) 

    sendbufferdata(); 
if(m_ctrlComm.get_CTSHolding()==true) 

if(len[2]!=0) 

senddatacount+=(long)((len[2]+4)/2); 
Count.Format("发送:%d",senddatacount);                                          //// 
sendcount.SetWindowText(Count); 
CByteArray array; 
array.RemoveAll(); 
//for(int j=0;j<3;j++) 

for(int i=0;i<(len[2]+4)/2;i++) 

array.InsertAt(i,data[2][i],1);  

//if(m_ctrlComm.get_CommEvent()==1) 
m_ctrlComm.put_Output(COleVariant(array));//发送数据 
UpdateData(false); 

for(int i=0;i<(len[2]+4)/2;i++)                                                    //// 

if(data[2][i]>0x0F) 
   SendDisplay.Format("%X ",data[2][i]); 
else SendDisplay.Format("0%X ",data[2][i]); 
   m_strRXData+=SendDisplay; 



    m_strRXData+="\r\n"; 
UpdateData(FALSE); 
ReceiveThree(); 
SendFunc=SendOne; 
return 1; 

/////////////////////////////////////////////////接收第一、第二、第三个/////////////////////////////////////////// 
bool CSCommTestDlg::ReceiveOne() 

Sleep(100); 
  return 0; 

bool CSCommTestDlg::ReceiveTwo()                                                       /// 

Sleep(100); 
 return 0; 

bool CSCommTestDlg::ReceiveThree() 

  Sleep(100); 
 return 1;                                                                            //// 

接受事件: 
void CSCommTestDlg::OnCommreceive() 

unsigned char aa[1024]; 
VARIANT variant_inp; 
    COleSafeArray safearray_inp; 
    LONG safe_len,k; 
    BYTE rxdata[1024]; //设置BYTE数组 An 8-bit integerthat is not signed. 
    CString strtemp; 
if(m_ctrlComm.get_CommEvent()==2) //事件值为2表示接收缓冲区内有字符 
    {    
////////以下你可以根据自己的通信协议加入处理代码 
variant_inp=m_ctrlComm.get_Input(); //读缓冲区 
   safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量 
        safe_len=safearray_inp.GetOneDimSize(); //得到有效数据长度 
        for(k=0;k<safe_len;k++) 

safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组 

        for(k=0;k<safe_len;k++) //将数组转换为Cstring型变量 
        { 
BYTE bt=*(char*)(rxdata+k); //字符型 
if(bt>0x0f) 
            strtemp.Format("%x ",bt);//]bt); //将字符送入临时变量strtemp存放 
else strtemp.Format("0%x ",bt);//bt); 
m_strRXData+=strtemp; //加入接收编辑框对应字符串  
receivedatacount++;   
    CString ReceiveDataNum; 
         ReceiveDataNum.Format("%ld", receivedatacount); 
ReceiveDataNum="接收:"+ReceiveDataNum; 
        receivecount.SetWindowText(ReceiveDataNum); 
            UpdateData(FALSE); 


我接受都是利用的Sleep(100);这样虽然在接受时没有问题,但是这程序编的是有漏洞的,希望各位大侠能够帮帮小弟!感激不尽! 

解决方案 »

  1.   

    那超时呢?,还有我定时器一直向DSP不停地发送,接收;突然我又向DSP发了一组数据,那前一组数据我可能还没有发出去,或者我还没有接收所有数据,只接收到4个,还有4个还没有收到,我就向DSP发数据,就有可能出现问题,我应该如何处理?请教各位大侠,如何解决,小弟感激不尽!