|
我发一组数据给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]=HexData;}
CharToHex(_SendDataTwo,len[1]);
for(int i=0;i<len[1];i++)
{ data[1]=HexData;}
CharToHex(_SendDataThree,len[2]);
for(int i=0;i<len[2];i++)
{ data[2]=HexData;}
for(int i=0;i<3;i++)
{ crc_write(&data[0],len/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],1);
}
m_ctrlComm.put_Output(COleVariant(array));//发送数据 ////
UpdateData(false);
}
for(int i=0;i<(len[0]+4)/2;i++)
{
if(data[0]>0x0F)
SendDisplay.Format("%X ",data[0]);
else SendDisplay.Format("0%X ",data[0]);
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],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]>0x0F) ////
SendDisplay.Format("%X ",data[1]);
else SendDisplay.Format("0%X ",data[1]);
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],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]>0x0F)
SendDisplay.Format("%X ",data[2]);
else SendDisplay.Format("0%X ",data[2]);
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);这样虽然在接受时没有问题,但是这程序编的是有漏洞的,希望各位大侠能够帮帮小弟!感激不尽! |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|