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

📄 pstn_filetransdlg.cpp

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