📄 pstn_filetransdlg.cpp
字号:
iRcvCur=1; //接收次数为1
bytRcvNow=1; //帧序号为1
for(i=0;i<128;i++)
{
charRcvData[i]=rxdata[i+3];
}
iRcvStatus=203;
ArraySend.RemoveAll();
ArraySend.SetSize(1);
ArraySend.SetAt(0,6);
myComm.SetOutput(COleVariant(ArraySend)); //发ACK
SetTimer(1,2000,NULL);
break;
}
case 203: //等待数据,包括完整帧和EOT帧
{
myComm.SetInputLen(1); //设置只读一个字符
input1=myComm.GetInput();
myComm.SetInputLen(0); //设置读全部缓冲区
//将VARAIANT变量赋值给COleSafeArray类的实例
safearray1=input1;
k=0;
safearray1.GetElement(&k,rxdata);
switch(rxdata[0])
{
case 4: //收到EOT
{
//myStr="txt";
myFileDlg.m_ofn.lpstrFilter="*.TXT";
myFileDlg.m_ofn.lpstrDefExt="txt";
myFileDlg.m_ofn.lpstrTitle="保存文本文件";
//调出文件选择对话框,选择保存文件
if(myFileDlg.DoModal()==IDOK)
{
myPathName=myFileDlg.GetPathName();
myFileName=myFileDlg.GetFileName();
}
else
{
iRcvStatus=200;
iRcvCur=1;
iAgain=0;
bytRcvNow=1;
m_Dis.SetSel(100000,100000);
m_Dis.ReplaceSel("取消保存文件!\12\15");
m_Dis.SetSel(100000,100000);
m_Dis.ReplaceSel("\12\15");
UpdateData(false);
return;
}
myPathName.Replace("\\","\\\\"); //将文件名中的单“\”替换成双“\\”
//打开选定的文件
if(!myFile.Open(myPathName,CFile::modeWrite|CFile::modeCreate,&e))//
{
myStr.Format("%02X",e.m_cause);//文件打开错误处理,错误代码为m_cause
myStr+="error";
AfxMessageBox(myStr);
return;
}
myFile.SetLength(0);//iRcvCur*128);
myFile.Write(charRcvData,iRcvCur*128);
myFile.Close();
m_Dis.SetSel(100000,100000);
m_Dis.ReplaceSel("文件已保存!\12\15");
m_Dis.SetSel(100000,100000);
m_Dis.ReplaceSel("\12\15");
UpdateData(false);
ArraySend.RemoveAll();
ArraySend.SetSize(1);
ArraySend.SetAt(0,6); //发ACK
myComm.SetOutput(COleVariant(ArraySend));
//无Modem测试时,使用这段代码,共6行。
iRcvStatus=200; //恢复为初始状态
iRcvCur=1;
iActStatus=0;
iAgain=0;
bytRcvNow=1;
Beep(400,30);
//无Modem测试代码结束行
//正常使用时,使用这段代码,共9行。
/*Sleep(1000);
ArraySend.RemoveAll();
ArraySend.SetSize(3);
ArraySend.SetAt(0,43); //发+++
ArraySend.SetAt(1,43); //
ArraySend.SetAt(2,43); //
myComm.SetOutput(COleVariant(ArraySend));
iRcvStatus=204; //切换状态至204
SetTimer(1,2000,NULL); //启动超时定时器*/
//正常使用代码结束行
break;
}
case 1://收到SOH
{
for(i=0;i<10;i++) //最大延时2秒钟
{
Sleep(200); //延时200ms
counts=myComm.GetInBufferCount(); //获取接收缓冲区中的字符数
if (counts>=131)
{
break;
}
}
if(i==10)
{
m_Dis.SetSel(100000,100000);
m_Dis.ReplaceSel("超时错误!\12\15");
m_Dis.SetSel(100000,100000);
m_Dis.ReplaceSel("\12\15");
UpdateData(false);
iActStatus=0;
iSendStatus=100; //恢复初始状态
iRcvStatus=200;
return;
}
input1=myComm.GetInput();
//将VARAIANT变量赋值给COleSafeArray类的实例
safearray1=input1;
len1=safearray1.GetOneDimSize();//使用COleSafeArray类的成员函数获取数据长度
for(k=0;k<len1;k++)
{
//使用COleSafeArray类的成员函数将数据写入数组
safearray1.GetElement(&k,rxdata+k+1);
}
if(!(rxdata[0]==1 && (rxdata[1]+rxdata[2])==255))
{
iAgain++;
myStr.Format("%d",iAgain);
m_Again=myStr;
UpdateData(false);
if (iAgain>10)
{
m_Dis.SetSel(100000,100000);
m_Dis.ReplaceSel("重试次数超限!\12\15");
m_Dis.SetSel(100000,100000);
m_Dis.ReplaceSel("\12\15");
UpdateData(false);
iRcvStatus=200; //恢复初始状态
iAgain=0;
iRcvCur=1;
iActStatus=0;
iSendStatus=100; //恢复初始状态
bytRcvNow=1;
return;
}
else
{
ArraySend.RemoveAll();
ArraySend.SetSize(1);
ArraySend.SetAt(0,21); //发NAK
myComm.SetOutput(COleVariant(ArraySend));
}
}
iParityTemp=0;
for(i=3;i<131;i++)
{
iParityTemp+=rxdata[i];
}
iParityTemp=iParityTemp%256;
if(rxdata[131]!=(BYTE)iParityTemp) //若校验未通过
{
iAgain++;
myStr.Format("%d",iAgain);
m_Again=myStr;
UpdateData(false);
if (iAgain>10)
{
m_Dis.SetSel(100000,100000);
m_Dis.ReplaceSel("重试次数超限!\12\15");
m_Dis.SetSel(100000,100000);
m_Dis.ReplaceSel("\12\15");
UpdateData(false);
iRcvStatus=200; //恢复初始状态
iAgain=0;
iRcvCur=1;
iActStatus=0;
bytRcvNow=1;
return;
}
else
{
ArraySend.RemoveAll();
ArraySend.SetSize(1);
ArraySend.SetAt(0,21); //发NAK
myComm.SetOutput(COleVariant(ArraySend));
}
}
if(rxdata[1]==bytRcvNow+1 ||(rxdata[1]==0 && bytRcvNow==255))
{
iRcvCur++; //接收次数加1
myStr.Format("%d",iRcvCur);
m_Number=myStr;
UpdateData(false);
if(bytRcvNow<255)//帧序号加1
{
bytRcvNow++;
}
else
{
bytRcvNow=0;
}
for(i=0;i<128;i++)
{
charRcvData[i+(iRcvCur-1)*128]=rxdata[i+3];
}
ArraySend.RemoveAll();
ArraySend.SetSize(1);
ArraySend.SetAt(0,6); //发ACK
myComm.SetOutput(COleVariant(ArraySend));
SetTimer(1,2000,NULL);
}
else
{
if(rxdata[1]==bytRcvNow)
{
for(i=0;i<128;i++)
{
charRcvData[i+(iRcvCur-1)*128]=rxdata[i+3];
}
ArraySend.RemoveAll();
ArraySend.SetSize(1);
ArraySend.SetAt(0,6); //发ACK
myComm.SetOutput(COleVariant(ArraySend));
SetTimer(1,2000,NULL);
}
}
break;
}
default:
{
SetTimer(1,2000,NULL);
break;
}
}
break;
}
case 204:
{
//只要收到Modem的响应就执行挂机命令
ArraySend.RemoveAll();
ArraySend.SetSize(5);
ArraySend.SetAt(0,65); //发"ATH\12\15"
ArraySend.SetAt(1,84); //
ArraySend.SetAt(2,72); //
ArraySend.SetAt(3,10); //
ArraySend.SetAt(4,13); //
myComm.SetOutput(COleVariant(ArraySend));
iRcvStatus=200; //恢复为初始状态
iRcvCur=1;
iAgain=0;
bytRcvNow=1;
Beep(400,30);
break;
}
}
break;
}
}
}
}
}
void CPSTN_FileTransDlg::OnRcvfile()
{
// TODO: Add your control notification handler code here
//正常使用的代码,共9行
/*
CString myStr;
myStr="ats0=1\12\15"; //自动应答
myComm.SetOutput(COleVariant(myStr));
m_Dis.SetSel(100000,100000);
m_Dis.ReplaceSel("等待与对方联机...");
UpdateData(false);
iActStatus=2;
iRcvStatus=201; //切换状态为201
SetTimer(1,2000,NULL); //启动超时定时器
*/
//正常使用代码结束行
//无Modem测试使用的代码段,共8行
iActStatus=2;
iRcvStatus=202;
iSendStatus=100;
ArraySend.RemoveAll();
ArraySend.SetSize(1);
ArraySend.SetAt(0,21); //发NAK
myComm.SetOutput(COleVariant(ArraySend));
SetTimer(1,2000,NULL);
//无Modem测试代码结束行-
this->SetWindowText("接收文件");
Beep(400,30);
}
void CPSTN_FileTransDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
CString myStr;
switch(iActStatus)
{
case 1:
{
switch(iSendStatus)
{
case 100:
{
break;
}
default:
{
iRelay++;
if(iRelay>10)
{
m_Dis.SetSel(100000,100000);
m_Dis.ReplaceSel("发送出错!\12\15");
m_Dis.SetSel(100000,100000);
m_Dis.ReplaceSel("\12\15");
UpdateData(false);
iSendStatus=100;
iRelay=0;
KillTimer(1);
}
}
}
break;
}
case 2:
{
switch(iRcvStatus)
{
case 200:
{
break;
}
case 202:
{
ArraySend.RemoveAll();
ArraySend.SetSize(1);
ArraySend.SetAt(0,21);
myComm.SetOutput(COleVariant(ArraySend));
iRelay++;
if(iRelay>10)
{
m_Dis.SetSel(100000,100000);
m_Dis.ReplaceSel("接收出错!\12\15");
m_Dis.SetSel(100000,100000);
m_Dis.ReplaceSel("\12\15");
UpdateData(false);
iSendStatus=200;
iRelay=0;
KillTimer(1);
}
break;
}
default:
{
iRelay++;
if(iRelay>10)
{
m_Dis.SetSel(100000,100000);
m_Dis.ReplaceSel("接收出错!\12\15");
m_Dis.SetSel(100000,100000);
m_Dis.ReplaceSel("\12\15");
UpdateData(false);
iSendStatus=200;
iRelay=0;
KillTimer(1);
}
}
}
break;
}
}
CDialog::OnTimer(nIDEvent);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -