小弟有一个关于mscomm控件超时的问题请教高手!
我发一组数据给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=_SendDataOne.GetLength();
len=_SendDataTwo.GetLength();
len=_SendDataThree.GetLength();
if(len%2!=0||len%2!=0||len%2!=0) {AfxMessageBox("输入数据长度错误!");return;}
else {
if(len==0 && len==0 && len==0) {AfxMessageBox("输入数据长度错误!"); return;}
CharToHex(_SendDataOne,len);
for(int i=0;i<len;i++)
{ data=HexData;}
CharToHex(_SendDataTwo,len);
for(int i=0;i<len;i++)
{ data=HexData;}
CharToHex(_SendDataThree,len);
for(int i=0;i<len;i++)
{ data=HexData;}
for(int i=0;i<3;i++)
{ crc_write(&data,len/2);}
if(m_strRXData.IsEmpty()==0)
{ m_strRXData+="\r\n";}
UpdateData(false);}
}
bool CSCommTestDlg::SendOne(long Time)
{
sendbufferdata();
if(len!=0)
{
senddatacount+=(long)((len+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+4)/2;i++)
{
array.InsertAt(i,data,1);
}
m_ctrlComm.put_Output(COleVariant(array));//发送数据 ////
UpdateData(false);
}
for(int i=0;i<(len+4)/2;i++)
{
if(data>0x0F)
SendDisplay.Format("%X ",data);
else SendDisplay.Format("0%X ",data);
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!=0)
{ senddatacount+=(long)((len+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+4)/2;i++) ////
{
array.InsertAt(i,data,1);
}
//if(m_ctrlComm.get_CommEvent()==1)
m_ctrlComm.put_Output(COleVariant(array));//发送数据
UpdateData(true);
}
for(int i=0;i<(len+4)/2;i++)
{
if(data>0x0F) ////
SendDisplay.Format("%X ",data);
else SendDisplay.Format("0%X ",data);
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!=0)
{
senddatacount+=(long)((len+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+4)/2;i++)
{
array.InsertAt(i,data,1);
}
//if(m_ctrlComm.get_CommEvent()==1)
m_ctrlComm.put_Output(COleVariant(array));//发送数据
UpdateData(false);
}
for(int i=0;i<(len+4)/2;i++) ////
{
if(data>0x0F)
SendDisplay.Format("%X ",data);
else SendDisplay.Format("0%X ",data);
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;
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG safe_len,k;
BYTE rxdata; //设置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);这样虽然在接受时没有问题,但是这程序编的是有漏洞的,希望各位大侠能够帮帮小弟!感激不尽! 回复【楼主位】lyc158wan
-----------------------------------------------------------------------
源程序点击此处下载 ourdev_520797.rar(文件大小:3.87M) (原文件名:SCommTest.rar) 最好是自己用API写,想怎么控制都行 回复【2楼】zht9961020
--------------------------------------------------------------------
我都用mscomm控件做的差不多了,就差这个问题了,现在打断全部重来写API的话比较麻烦, 设置你的接收响应就可以了 ,比如你说dsp返回给你8个数据,那就收到8个数据才进行com的接收处理,例如下面代码:
void XXXXX::SetRThreshold(CMSComm *pCOM,int RThreshold)
{
pCOM->SetRThreshold(RThreshold);//RThreshold你这里传8
}
这样设置以后,每当8个数据传回来后,才触发你程序中的 void CSCommTestDlg::OnCommreceive() ,否则你的程序是不走这个函数的
页:
[1]