📄 pstn_filetransdlg.cpp
字号:
{
charSendNow[i+3]=charSendData[i];
}
iParityTemp=0;
for(i=3;i<131;i++)
{
iParityTemp+=charSendNow[i];
}
iParityTemp=iParityTemp%256;
charSendNow[131]=(char)iParityTemp;//求出校验位CheckSum
ArraySend.RemoveAll();
ArraySend.SetSize(132);
for(i=0;i<132;i++)
{
ArraySend.SetAt(i,charSendNow[i]);
}
myComm.SetOutput(COleVariant(ArraySend)); //发送数据帧
iSendStatus=103; //更改状态
}
}
SetTimer(1,2000,NULL); //启动超时定时器
break;
}
case 103: //等待ACK,
{
switch(rxdata[0])
{
case 6: //响应是ACK
{
iSendCur++;
myStr.Format("%d",iSendCur);
m_Number=myStr;
UpdateData(false);
if(bytSendNow==255)
{
bytSendNow=0;
}
else
{
bytSendNow++;
}
if((iSendCur*128)>lFileLen) //剩余数据不足128
{
charSendNow[0]=1;
charSendNow[1]=bytSendNow;
charSendNow[2]=255-charSendNow[1];
for(i=0;i<(lFileLen%128);i++)
{
charSendNow[i+3]=charSendData[i+(iSendCur-1)*128];
}
for(i=(lFileLen%128);i<128;i++)
{
charSendNow[i+3]=32; //补齐空格
}
iParityTemp=0;
for(i=3;i<131;i++)
{
iParityTemp+=charSendNow[i];
}
iParityTemp=iParityTemp%256;
charSendNow[131]=(char)iParityTemp;//求出校验位CheckSum
ArraySend.RemoveAll();
ArraySend.SetSize(132);
for(i=0;i<132;i++)
{
ArraySend.SetAt(i,charSendNow[i]);
}
myComm.SetOutput(COleVariant(ArraySend));
iSendStatus=104;
}
else//剩余数据不小于128
{
charSendNow[0]=1;
charSendNow[1]=bytSendNow;
charSendNow[2]=255-charSendNow[1];
for(i=0;i<128;i++) //直接获取完整的128字节内容
{
charSendNow[i+3]=charSendData[i+(iSendCur-1)*128];
}
iParityTemp=0;
for(i=3;i<131;i++)
{
iParityTemp+=charSendNow[i];
}
iParityTemp=iParityTemp%256;
charSendNow[131]=(char)iParityTemp;//求出校验位CheckSum
ArraySend.RemoveAll();
ArraySend.SetSize(132);
for(i=0;i<132;i++)
{
ArraySend.SetAt(i,charSendNow[i]);
}
myComm.SetOutput(COleVariant(ArraySend)); //发送数据帧
}
break;
}
case 21://响应是NAK
{
//重发上次的数据帧
myComm.SetOutput(COleVariant(ArraySend));
break;
}
default:
{
m_Dis.SetSel(100000,100000);
m_Dis.ReplaceSel("接收到无效的字符");
UpdateData(false);
iSendStatus=100; //恢复初始状态
iRcvStatus=200;
iActStatus=0;
return; //直接退出接收处理程序
break;
}
}
SetTimer(1,2000,NULL); //启动超时定时器
break;
}
case 104: //等待ACK,发送EOT
{
switch(rxdata[0])
{
case 6: //响应是ACK
{
ArraySend.RemoveAll();
ArraySend.SetSize(1);
ArraySend.SetAt(0,4);
myComm.SetOutput(COleVariant(ArraySend));
iSendStatus=105;
break;
}
case 21: //响应是NAK
{
//重发上次的数据帧
myComm.SetOutput(COleVariant(ArraySend));
break;
}
default:
{
m_Dis.SetSel(100000,100000);
m_Dis.ReplaceSel("接收到无效的字符!\12\15");
m_Dis.SetSel(100000,100000);
m_Dis.ReplaceSel("\12\15");
UpdateData(false);
iSendStatus=100; //恢复初始状态
iRcvStatus=200;
iActStatus=0;
return; //直接退出接收处理程序
break;
}
}
SetTimer(1,2000,NULL); //启动超时定时器
break;
}
case 105: //等待ACK,结束通信
{
switch(rxdata[0])
{
case 6: //响应是ACK
{
m_Dis.SetSel(100000,100000);
m_Dis.ReplaceSel("发送完毕!\12\15");
m_Dis.SetSel(100000,100000);
m_Dis.ReplaceSel("\12\15");
UpdateData(false);
//无Modem测试时,使用这段程序,共5行。
iSendStatus=100;
iSendCur=1;
iActStatus=0;
bytSendNow=1;
Beep(400,30);
//无Modem测试程序段结束
//正常,有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));
iSendStatus=106; //切换状态至106
SetTimer(1,2000,NULL); //启动超时定时器
*/
//有Modem测试程序段结束
break;
}
case 21: //响应是NAK
{
//重发上次的数据帧
myComm.SetOutput(COleVariant(ArraySend));
SetTimer(1,2000,NULL); //启动超时定时器
break;
}
default:
{
m_Dis.SetSel(100000,100000);
m_Dis.ReplaceSel("接收到无效的字符!\12\15");
m_Dis.SetSel(100000,100000);
m_Dis.ReplaceSel("\12\15");
UpdateData(false);
iSendStatus=100; //恢复初始状态
iRcvStatus=200;
iActStatus=0;
return; //直接退出接收处理程序
break;
}
}
break;
}
case 106: //等待Modem回应,发挂机命令
{
//只要收到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));
iSendStatus=100; //恢复为初始状态
iSendCur=1;
iActStatus=0;
bytSendNow=1;
Beep(400,30);
break;
}
}
break;
}
case 2: //接收操作状态
{
switch(iRcvStatus)
{
case 201: //等待CONNECT...
{
for(i=0;i<10;i++) //最大延时2秒钟
{
Sleep(200); //延时200ms
counts=myComm.GetInBufferCount(); //获取接收缓冲区中的字符数
if (counts>=2)
{
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);
rxdata[len1]='\0';
input2=rxdata; //得到接收的字符串
input2.MakeUpper(); //接收字符串变为大写
m_Dis.SetSel(100000,100000); //更新显示内容
m_Dis.ReplaceSel(input2);
UpdateData(false);
if(input2.Find("CO")>=0) //若收到CONNECT
{
iRcvStatus=202; //更改状态
ArraySend.RemoveAll();
ArraySend.SetSize(1);
ArraySend.SetAt(0,21); //发NAK
myComm.SetOutput(COleVariant(ArraySend));
}
SetTimer(1,2000,NULL);
break;
}
case 202: //等待第一帧数据
{
for(i=0;i<10;i++) //最大延时2秒钟
{
Sleep(200); //延时200ms
counts=myComm.GetInBufferCount(); //获取接收缓冲区中的字符数
if (counts>=132)
{
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);
}
if(!(rxdata[0]==1 && rxdata[1]==1 && rxdata[2]==(BYTE)0xFE))
{
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;
iActStatus=0;
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);
iActStatus=0;
iRcvStatus=200; //恢复初始状态
iAgain=0;
return;
}
else
{
ArraySend.RemoveAll();
ArraySend.SetSize(1);
ArraySend.SetAt(0,21); //发NAK
myComm.SetOutput(COleVariant(ArraySend));
}
}
m_Dis.SetSel(100000,100000);
m_Dis.ReplaceSel("开始接收文件!\12\15");
m_Dis.SetSel(100000,100000);
m_Dis.ReplaceSel("\12\15");
UpdateData(false);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -