⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pstn_filetransdlg.cpp

📁 VisualC实践与提高——串口通信与工程应用篇代码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
							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 + -