我的思路:
发送方先设了标志位5,再发送第一行.
接收方满足标志位5的条件,才接收,接着接收方发送标志位6
发送方收到标志位6后,设了标志位5,才发送第二行。
重复上述步骤,直至内容发送完。结果程序,死在:上面的第三行中的:接着接收方发送标志位6 程序:void CPc_pcDlg::OnOK() //发送按钮
{
file1.Open(strDirFile,CFile::modeReadWrite|CFile::shareExclusive);
file1.SeekToBegin();
m_strSend="";
szLine="";
GetDlgItem(IDC_send)->SetWindowText( m_strSend);
Status=0;
Array1.RemoveAll();
Array1.SetSize(1);
Array1.SetAt(0,05);
if( file1.ReadString(szLine) )
{
m_strSend+= szLine;
m_strSend+="\r\n" ;
UpdateData(false);
m_ctrlComm.SetOutput(COleVariant(m_strSend));//发送数据
}
else file1.Close();
}
void CPc_pcDlg::OnOnCommMscomm1()
{
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[2048]; //设置BYTE数组
CString strtemp;
if(m_ctrlComm.GetCommEvent()==2)
{
switch(Status)
{
case 0://接收方处理数据
{
if(Array1[0]==5)
{
variant_inp=m_ctrlComm.GetInput(); //读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
for(k=0;k<len;k++) //将数组转换为Cstring型变量
{
BYTE bt=*(char*)(rxdata+k); //字符型
strtemp.Format("%c",bt); //将字符送入临时变量strtem
m_strReceive+=strtemp; //加入接收编辑框对应字符串
//UpdateData(FALSE); //更新编辑框内容
}
if(m_strSend==m_strReceive)
{
m_strReceive+="\r\n" ;
GetDlgItem(IDC_receive)->SetWindowText(m_strReceive);
}
else
UpdateData(FALSE); //更新编辑框内容
Status=1;
Array1.RemoveAll();
Array1.SetSize(1);
Array1.SetAt(0,06);
m_ctrlComm.SetOutput(COleVariant(Array1));
}
else
{
Status=1;
Array1.RemoveAll();
Array1.SetSize(1);
Array1.SetAt(0,06);
m_ctrlComm.SetOutput(COleVariant(Array1));
}
}
break; case 1://发送方处理数据
{
if(Array1[0]==6)
{
Status=0;
Array1.RemoveAll();
Array1.SetSize(1);
Array1.SetAt(0,05);
if( file1.ReadString(szLine) )
{
m_strSend+= szLine;
m_strSend+="\r\n" ;
UpdateData(FALSE); //更新编辑框内容
//GetDlgItem(IDC_send)->SetWindowText(m_strSend);
record=file1.GetPosition();//记录上次的结果(读到哪了)
m_ctrlComm.SetOutput(COleVariant(m_strSend));
}
else file1.Close();
}
else
{
file1.Seek(record,0);//接着上回读
if( file1.ReadString(szLine) )
{
m_strSend+= szLine;
m_strSend+="\r\n" ;
//GetDlgItem(IDC_send)->SetWindowText(m_strSend);
UpdateData(FALSE); //更新编辑框内容
record=file1.GetPosition();//记录上次的结果(读到哪了)
m_ctrlComm.SetOutput(COleVariant(m_strSend));
}
else file1.Close();
}
}
break;
}
}
}
发送方先设了标志位5,再发送第一行.
接收方满足标志位5的条件,才接收,接着接收方发送标志位6
发送方收到标志位6后,设了标志位5,才发送第二行。
重复上述步骤,直至内容发送完。结果程序,死在:上面的第三行中的:接着接收方发送标志位6 程序:void CPc_pcDlg::OnOK() //发送按钮
{
file1.Open(strDirFile,CFile::modeReadWrite|CFile::shareExclusive);
file1.SeekToBegin();
m_strSend="";
szLine="";
GetDlgItem(IDC_send)->SetWindowText( m_strSend);
Status=0;
Array1.RemoveAll();
Array1.SetSize(1);
Array1.SetAt(0,05);
if( file1.ReadString(szLine) )
{
m_strSend+= szLine;
m_strSend+="\r\n" ;
UpdateData(false);
m_ctrlComm.SetOutput(COleVariant(m_strSend));//发送数据
}
else file1.Close();
}
void CPc_pcDlg::OnOnCommMscomm1()
{
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[2048]; //设置BYTE数组
CString strtemp;
if(m_ctrlComm.GetCommEvent()==2)
{
switch(Status)
{
case 0://接收方处理数据
{
if(Array1[0]==5)
{
variant_inp=m_ctrlComm.GetInput(); //读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
for(k=0;k<len;k++) //将数组转换为Cstring型变量
{
BYTE bt=*(char*)(rxdata+k); //字符型
strtemp.Format("%c",bt); //将字符送入临时变量strtem
m_strReceive+=strtemp; //加入接收编辑框对应字符串
//UpdateData(FALSE); //更新编辑框内容
}
if(m_strSend==m_strReceive)
{
m_strReceive+="\r\n" ;
GetDlgItem(IDC_receive)->SetWindowText(m_strReceive);
}
else
UpdateData(FALSE); //更新编辑框内容
Status=1;
Array1.RemoveAll();
Array1.SetSize(1);
Array1.SetAt(0,06);
m_ctrlComm.SetOutput(COleVariant(Array1));
}
else
{
Status=1;
Array1.RemoveAll();
Array1.SetSize(1);
Array1.SetAt(0,06);
m_ctrlComm.SetOutput(COleVariant(Array1));
}
}
break; case 1://发送方处理数据
{
if(Array1[0]==6)
{
Status=0;
Array1.RemoveAll();
Array1.SetSize(1);
Array1.SetAt(0,05);
if( file1.ReadString(szLine) )
{
m_strSend+= szLine;
m_strSend+="\r\n" ;
UpdateData(FALSE); //更新编辑框内容
//GetDlgItem(IDC_send)->SetWindowText(m_strSend);
record=file1.GetPosition();//记录上次的结果(读到哪了)
m_ctrlComm.SetOutput(COleVariant(m_strSend));
}
else file1.Close();
}
else
{
file1.Seek(record,0);//接着上回读
if( file1.ReadString(szLine) )
{
m_strSend+= szLine;
m_strSend+="\r\n" ;
//GetDlgItem(IDC_send)->SetWindowText(m_strSend);
UpdateData(FALSE); //更新编辑框内容
record=file1.GetPosition();//记录上次的结果(读到哪了)
m_ctrlComm.SetOutput(COleVariant(m_strSend));
}
else file1.Close();
}
}
break;
}
}
}
这是个协议的事,和收发无关,把上下位机的通信协议定好,双方按协议来做就行了
乍看上去没有什么能够导致死循环的位置啊