www.pudn.com > SimSimens.rar > SimSimensDoc.cpp


// SimSimensDoc.cpp : implementation of the CSimSimensDoc class 
// 
 
#include "stdafx.h" 
#include "SimSimens.h" 
 
#include "SimSimensDoc.h" 
#include "SimSimensView.h" 
 
#include "ComSettingDlg.h" 
#include "PropertyDlg.h" 
 
#include "TransmitNDlg.h" 
#include "TransmitMDlg.h" 
#include "TransmitEDlg.h" 
#include "TransmitPDlg.h" 
#include "TransmitDDlg.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CSimSimensDoc 
 
IMPLEMENT_DYNCREATE(CSimSimensDoc, CDocument) 
 
BEGIN_MESSAGE_MAP(CSimSimensDoc, CDocument) 
	//{{AFX_MSG_MAP(CSimSimensDoc) 
	ON_COMMAND(ID_COMM_SETTING, OnCommSetting) 
	ON_COMMAND(ID_CONNECT, OnConnect) 
	ON_COMMAND(ID_DISCONNECT, OnDisconnect) 
	ON_COMMAND(ID_PROPERTY, OnProperty) 
	ON_COMMAND(ID_TRANSMIT_N, OnTransmitN) 
	ON_COMMAND(ID_TRANSMIT_M, OnTransmitM) 
	ON_COMMAND(ID_TRANSMIT_E, OnTransmitE) 
	ON_COMMAND(ID_TRANSMIT_P, OnTransmitP) 
	ON_COMMAND(ID_TRANSMIT_T, OnTransmitT) 
	ON_COMMAND(ID_TRANSMIT_D, OnTransmitD) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CSimSimensDoc construction/destruction 
 
CSimSimensDoc::CSimSimensDoc() 
{ 
	// TODO: add one-time construction code here 
	m_nStatus=0;               //初始读状态 
	m_nReadStep=0;             //初始为0读步骤 
    m_nWriteStep=0;            //初始为0写步骤 
	rt_STX_number=0;           //为试发过STX 
	rt_number=0;               //未发过数据 
    rr_number=0;               //未收过数据 
	EmptyTString();             
	EmptyRString();             
    EmptyTempStr(); 
	tc=NULL; 
	rc=NULL;                    
 
	m_bConnected=FALSE;        //指示串口还未被打开 
	m_pThread=NULL;            //辅助线程句柄为空 
	m_nBaud=4;                 //波特率为9600bps 
	m_nDataBits=3;             //数据位 
	m_nFlowCtrl=0;             //无流量控制 
	m_nParity=1;               //偶校验 
	m_nPort=0;                 //缺省端口为COM1 
	m_nStopBits=0;             //停止位 
	m_bNewLine=TRUE;           //从串口读到回车符(/r)换行 
	m_bEcho=TRUE;              //进行回显 
    Rectify();                 //校正 
     
	bcc=NULL; 
    no_error=true; 
	priority=1;                //PCU的发送优先权高 
 
	m_strTrainNo=""; 
	m_strDriverNo=""; 
	m_strBodyHead=""; 
	m_strBodyTail=""; 
	m_strLineNo="2"; 
	m_strLocation=""; 
} 
 
CSimSimensDoc::~CSimSimensDoc() 
{ 
	//确保关闭串口 
	if(m_bConnected) 
		CloseConnection(); 
 
	//删除事件句柄 
	if(m_hPostMsgEvent) 
		CloseHandle(m_hPostMsgEvent); 
	if(m_osRead.hEvent) 
		CloseHandle(m_osRead.hEvent); 
	if(m_osWrite.hEvent) 
		CloseHandle(m_osWrite.hEvent); 
} 
 
BOOL CSimSimensDoc::OnNewDocument() 
{ 
	if (!CDocument::OnNewDocument()) 
		return FALSE; 
 
	// TODO: add reinitialization code here 
	// (SDI documents will reuse this document) 
 
	((CEditView*)m_viewList.GetHead())->SetWindowText(NULL); 
 
	//为WM_COMMNOYIFY消息创建事件对象,手工重置,初始化为有信号的 
	if((m_hPostMsgEvent=CreateEvent(NULL,TRUE,TRUE,NULL))==NULL) 
		return FALSE; 
 
	//初始化用于重叠读/写的OVERLAPPED结构 
	memset(&m_osRead,0,sizeof(OVERLAPPED)); 
	memset(&m_osWrite,0,sizeof(OVERLAPPED)); 
 
	//为重叠读创建事件对象,手工重置,初始化为无信号的 
	if((m_osRead.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL))==NULL) 
		return FALSE; 
 
    //为重叠写创建事件对象,手工重置,初始化为无信号的 
	if((m_osWrite.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL))==NULL) 
		return FALSE;   
 
 
	return TRUE; 
} 
 
 
 
///////////////////////////////////////////////////////////////////////////// 
// CSimSimensDoc serialization 
 
void CSimSimensDoc::Serialize(CArchive& ar) 
{ 
	((CEditView*)m_viewList.GetHead())->SerializeRaw(ar); 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CSimSimensDoc diagnostics 
 
#ifdef _DEBUG 
void CSimSimensDoc::AssertValid() const 
{ 
	CDocument::AssertValid(); 
} 
 
void CSimSimensDoc::Dump(CDumpContext& dc) const 
{ 
	CDocument::Dump(dc); 
} 
#endif //_DEBUG 
 
///////////////////////////////////////////////////////////////////////////// 
// CSimSimensDoc commands 
 
UINT CommProc(LPVOID pParam)         //线程控制函数 
{ 
	OVERLAPPED os; 
	DWORD dwMask,dwTrans; 
	COMSTAT ComStat; 
	DWORD dwErrorFlags; 
	CSimSimensDoc * pDoc=(CSimSimensDoc*)pParam; 
 
	//初始化OVERLAPPED结构,为结构创汇建一个手工设置事件, 
	//初始为无信号状态 
	memset(&os,0,sizeof(OVERLAPPED)); 
	os.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL); 
	if(os.hEvent==NULL) 
	{ 
		AfxMessageBox("Can't create event object!",100,300); 
		return (UINT)-1; 
	} 
 
	//一直监视串口设备,直到串口连接被挂断 
	while(pDoc->m_bConnected) 
	{ 
		//凊除所有I/O错误,并返回设备当前状态 
		ClearCommError(pDoc->m_hCom,&dwErrorFlags,&ComStat); 
 
		//如果接收缓冲区内字符的字节数不为0, 
		//在允许的情况下通知视图读取并显示 
		if(ComStat.cbInQue) 
		{ 
			::Sleep(5); 
		 
			ClearCommError(pDoc->m_hCom,&dwErrorFlags,&ComStat); 
			if(ComStat.cbInQue) 
			{ 
			//无限等待WM_COMMNOTIFY消息被处理完 
			WaitForSingleObject(pDoc->m_hPostMsgEvent,INFINITE); 
			ResetEvent(pDoc->m_hPostMsgEvent); 
 
			//通知视图 
			PostMessage(pDoc->m_hTermWnd,WM_COMMNOTIFY, 
				EV_RXCHAR,0); 
			} 
			continue; 
		} 
 
		dwMask=0; 
		//重叠操作 
		if(!WaitCommEvent(pDoc->m_hCom,&dwMask,&os)) 
		{ 
			if(GetLastError()==ERROR_IO_PENDING) 
				//无限等待重叠操作结果 
				GetOverlappedResult(pDoc->m_hCom,&os, 
				&dwTrans,TRUE); 
			else 
			{ 
				CloseHandle(os.hEvent); 
				return (UINT)-1; 
			} 
		} 
	} 
 
	CloseHandle(os.hEvent); 
	return 0; 
} 
 
void CSimSimensDoc::OnCommSetting()  
{ 
	// TODO: Add your command handler code here 
	CComSettingDlg dlg; 
 
	AntiRectify(); 
 
	//初始化串口设置对话框各控件 
	dlg.m_bConnected=m_bConnected; 
	dlg.m_nPort=m_nPort; 
	dlg.m_nBaud=m_nBaud; 
	dlg.m_nDataBits=m_nDataBits; 
	dlg.m_nStopBits=m_nStopBits; 
	dlg.m_nFlowCtrl=m_nFlowCtrl; 
	dlg.m_nParity=m_nParity; 
 
	if(dlg.DoModal()==IDOK) 
	{ 
		//取出用户新选定的设置参数 
		m_nPort=dlg.m_nPort; 
		m_nBaud=dlg.m_nBaud; 
		m_nDataBits=dlg.m_nDataBits; 
		m_nStopBits=dlg.m_nStopBits; 
		m_nFlowCtrl=dlg.m_nFlowCtrl; 
		m_nParity=dlg.m_nParity; 
 
	    Rectify(); 
 
		//如果串口已被打开,用新的参数设置 
		if(m_bConnected) 
			if(!ConfigConnection()) 
				AfxMessageBox("Can't realize the settings!"); 
	} 
	return; 
} 
 
void CSimSimensDoc::OnConnect()  
{ 
	// TODO: Add your command handler code here 
    if(!OpenConnection()) 
		AfxMessageBox("Can't open connection!"); 
	else 
		AfxMessageBox("Open connection succeed!"); 
	return;	 
} 
 
void CSimSimensDoc::OnDisconnect()  
{ 
	// TODO: Add your command handler code here 
	CloseConnection(); 
	return; 
} 
 
void CSimSimensDoc::OnProperty()  
{ 
	// TODO: Add your command handler code here 
	CPropertyDlg dlg; 
 
	//初始化终端属性对话框各控件 
	dlg.m_bEcho=m_bEcho; 
	dlg.m_bNewLine=m_bNewLine; 
 
	if(dlg.DoModal()==IDOK) 
	{ 
		//取出用户新选定的设置参数 
		m_bEcho=dlg.m_bEcho; 
		m_bNewLine=dlg.m_bNewLine; 
	} 
	return; 
} 
 
void CSimSimensDoc::OnTransmitN()  
{ 
	// TODO: Add your command handler code here 
	CTransmitNDlg dlg; 
	dlg.m_strTrainNo=m_strTrainNo; 
	dlg.m_strBodyHead=m_strBodyHead; 
	dlg.m_strBodyTail=m_strBodyTail; 
	dlg.m_strDriverNo=m_strDriverNo; 
	dlg.m_strLineNo=m_strLineNo; 
 
	if(dlg.DoModal()==IDOK) 
	{ 
		m_cTextMode='N'; 
		m_sD1=dlg.m_strTrainNo; 
		m_sD2=dlg.m_strBodyHead; 
		m_sD3=dlg.m_strBodyTail; 
		m_sD4=dlg.m_strDriverNo; 
		m_sD5=dlg.m_strLineNo; 
 
		//组织新的报文发送 
	    transmit_number=0; 
	    GetTextBegin(m_sD1); 
	    GetText(m_sD2); 
	    GetText(m_sD3); 
	    GetText(m_sD4); 
	    GetText(m_sD5); 
	    if(transmit_number&1) 
		{ 
	    	transmit_str[transmit_number]=':'; 
		    transmit_number++; 
		} 
        transmit_number=0; 
		Transmit(); 
	} 
	m_strTrainNo=dlg.m_strTrainNo; 
	m_strBodyHead=dlg.m_strBodyHead; 
	m_strBodyTail=dlg.m_strBodyTail; 
	m_strDriverNo=dlg.m_strDriverNo; 
    return; 
} 
 
void CSimSimensDoc::OnTransmitM()  
{ 
	// TODO: Add your command handler code here 
	CTransmitMDlg dlg; 
	dlg.m_strTrainNo=m_strTrainNo; 
	dlg.m_strBodyHead=m_strBodyHead; 
	dlg.m_strBodyTail=m_strBodyTail; 
	dlg.m_strDriverNo=m_strDriverNo; 
	dlg.m_strLineNo=m_strLineNo; 
	 
	if(dlg.DoModal()==IDOK) 
	{ 
		m_cTextMode='M'; 
		m_sD1=dlg.m_strTrainNo; 
		m_sD2=dlg.m_strBodyHead; 
		m_sD3=dlg.m_strBodyTail; 
		m_sD4=dlg.m_strDriverNo; 
		m_sD5=dlg.m_strLineNo; 
 
		//组织新的报文发送 
	    transmit_number=0; 
	    GetTextBegin(m_sD1); 
	    GetText(m_sD2); 
	    GetText(m_sD3); 
	    GetText(m_sD4); 
	    GetText(m_sD5); 
	    if(transmit_number&1) 
		{ 
	    	transmit_str[transmit_number]=':'; 
		    transmit_number++; 
		} 
        transmit_number=0; 
		Transmit(); 
	} 
	m_strTrainNo=dlg.m_strTrainNo; 
	m_strBodyHead=dlg.m_strBodyHead; 
	m_strBodyTail=dlg.m_strBodyTail; 
	m_strDriverNo=dlg.m_strDriverNo; 
	return; 
} 
 
void CSimSimensDoc::OnTransmitE()  
{ 
	// TODO: Add your command handler code here 
	CTransmitEDlg dlg; 
	dlg.m_strTrainNo=m_strTrainNo; 
	dlg.m_strBodyHead=m_strBodyHead; 
	dlg.m_strBodyTail=m_strBodyTail; 
	dlg.m_strDriverNo=m_strDriverNo; 
	dlg.m_strLineNo=m_strLineNo; 
 
	if(dlg.DoModal()==IDOK) 
	{ 
		m_cTextMode='E'; 
		m_sD1=dlg.m_strTrainNo; 
		m_sD2=dlg.m_strBodyHead; 
		m_sD3=dlg.m_strBodyTail; 
		m_sD4=dlg.m_strDriverNo; 
		m_sD5=dlg.m_strLineNo; 
 
		//组织新的报文发送 
	    transmit_number=0; 
	    GetTextBegin(m_sD1); 
	    GetText(m_sD2); 
	    GetText(m_sD3); 
	    GetText(m_sD4); 
	    GetText(m_sD5); 
	    if(transmit_number&1) 
		{ 
	    	transmit_str[transmit_number]=':'; 
		    transmit_number++; 
		} 
        transmit_number=0; 
		Transmit(); 
	} 
	m_strTrainNo=dlg.m_strTrainNo; 
	m_strBodyHead=dlg.m_strBodyHead; 
	m_strBodyTail=dlg.m_strBodyTail; 
	m_strDriverNo=dlg.m_strDriverNo; 
	return;	 
} 
 
void CSimSimensDoc::OnTransmitP()  
{ 
	// TODO: Add your command handler code here 
	CTransmitPDlg dlg; 
	dlg.m_strTrainNo=m_strTrainNo; 
    dlg.m_strPost=m_strLocation; 
	dlg.m_strLineNo=m_strLineNo; 
	 
	if(dlg.DoModal()==IDOK) 
	{ 
		m_cTextMode='P'; 
		m_sD1=dlg.m_strTrainNo; 
		m_sD2=dlg.m_strPost; 
		m_sD3=dlg.m_strLineNo; 
		m_sD4=""; 
		m_sD5=""; 
 
		//组织新的报文发送 
	    transmit_number=0; 
	    GetTextBegin(m_sD1); 
	    GetText(m_sD2); 
	    GetText(m_sD3); 
	    GetText(m_sD4); 
	    GetText(m_sD5); 
	    if(transmit_number&1) 
		{ 
	    	transmit_str[transmit_number]=':'; 
		    transmit_number++; 
		} 
        transmit_number=0; 
		Transmit(); 
	} 
	m_strTrainNo=dlg.m_strTrainNo; 
	m_strLocation=dlg.m_strPost; 
	return; 
} 
 
void CSimSimensDoc::OnTransmitT()  
{ 
	// TODO: Add your command handler code here 
    EmptyTString(); 
	transmit_number=0; 
	transmit_str[0]='T'; 
	transmit_str[1]=':'; 
    SetTempStr(); 
	bcc=GetBCC(transmit_str); 
	bcc=bcc^char(DLE); 
	bcc=bcc^char(ETX); 
    m_nStatus=1; 
	transmit_number=0; 
	Write(char(STX)); 
	Show_T_STX(); 
        //写串口开始请求 
	if(rt_STX_number>TXA) 
	{ 
		Show_TXA_OVER_STX(); 
		EmptyTempStr(); 
		LargeReturnIdle(); 
		LinkError(); 
	} 
	else 
	{ 
		if(OutTime(QVZ)) 
		{ 
			Show_QVZ_OUTTIME(); 
	        rt_STX_number++; 
		    Transmit(); 
		} 
	} 
	return;		 
} 
 
void CSimSimensDoc::OnTransmitD()  
{ 
	// TODO: Add your command handler code here 
	CTransmitDDlg dlg; 
    dlg.m_strTrainNo=m_strTrainNo; 
	dlg.m_strBodyHead=m_strBodyHead; 
	dlg.m_strBodyTail=m_strBodyTail; 
	dlg.m_strDriverNo=m_strDriverNo; 
	dlg.m_strLineNo=m_strLineNo; 
		 
	if(dlg.DoModal()==IDOK) 
	{ 
		m_cTextMode='D'; 
		m_sD1=dlg.m_strTrainNo; 
		m_sD2=dlg.m_strBodyHead; 
		m_sD3=dlg.m_strBodyTail; 
		m_sD4=dlg.m_strDriverNo; 
		m_sD5=dlg.m_strLineNo; 
 
		//组织新的报文发送 
	    transmit_number=0; 
	    GetTextBegin(m_sD1); 
	    GetText(m_sD2); 
	    GetText(m_sD3); 
	    GetText(m_sD4); 
	    GetText(m_sD5); 
	    if(transmit_number&1) 
		{ 
	    	transmit_str[transmit_number]=':'; 
		    transmit_number++; 
		} 
        transmit_number=0; 
		Transmit(); 
	} 
    m_strTrainNo=dlg.m_strTrainNo; 
	m_strBodyHead=dlg.m_strBodyHead; 
	m_strBodyTail=dlg.m_strBodyTail; 
	m_strDriverNo=dlg.m_strDriverNo; 
	return;	 
} 
 
BOOL CSimSimensDoc::ConfigConnection()           //设置串口设备 
{ 
	DCB dcb; 
 
	//如果只修改部分参数,先调用GetCommState函数获得原来的设置 
	if(!GetCommState(m_hCom,&dcb)) 
		return FALSE; 
     
	//DCB的一般设置 
	dcb.fBinary=TRUE;           //二进制模式 
	dcb.BaudRate=m_nBaud;       //波特率 
	dcb.ByteSize=m_nDataBits;   //每位字节数 
	dcb.fParity=TRUE;           //奇偶校验方法 
 
	switch(m_nParity)    //校验设置 
	{ 
	case 0: 
		dcb.Parity=NOPARITY; 
		break; 
	case 1: 
		dcb.Parity=EVENPARITY; 
		break; 
	case 2: 
		dcb.Parity=ODDPARITY; 
		break; 
	default:; 
	} 
 
	switch(m_nStopBits)  //停止位 
	{ 
	case 0: 
		dcb.StopBits=ONESTOPBIT; 
		break; 
	case 1: 
		dcb.StopBits=ONE5STOPBITS; 
		break; 
	case 2: 
		dcb.StopBits=TWOSTOPBITS; 
		break; 
	default:; 
	} 
 
	//硬件流控制设置 
	dcb.fOutxCtsFlow=m_nFlowCtrl==1; 
	dcb.fRtsControl=m_nFlowCtrl==1?RTS_CONTROL_HANDSHAKE:RTS_CONTROL_ENABLE; 
 
	//XON/XOFF流控制设置 
	dcb.fInX=dcb.fOutX=m_nFlowCtrl==2; 
	dcb.XonChar=XON; 
	dcb.XoffChar=XOFF; 
	dcb.XonLim=50; 
	dcb.XoffLim=50; 
 
	//用新的DCB结构重新配置串口设备 
	return SetCommState(m_hCom,&dcb); 
} 
 
BOOL CSimSimensDoc::OpenConnection()        //打开串口设备 
{ 
	COMMTIMEOUTS TimeOuts; 
	POSITION firstViewPos; 
	CView * pView; 
 
	//获得视图窗口指针,在发送WM_COMMNOTIFY消息给视图对象时需要 
	firstViewPos=GetFirstViewPosition(); 
	pView=GetNextView(firstViewPos); 
	m_hTermWnd=pView->GetSafeHwnd(); 
 
	//如果已经连接,返回 
	if(m_bConnected) 
		return FALSE; 
 
	//以重叠方式打开串口设备,如果打开操作失败,返回 
	m_hCom=CreateFile(m_sPort,GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL); 
 
	if(m_hCom==INVALID_HANDLE_VALUE) 
		return FALSE; 
 
	//重新设置设备参数,读、写缓冲区大小均为MAXBLOCK 
	SetupComm(m_hCom,MAXBLOCK,MAXBLOCK); 
 
	//设置监视事件EV_RXCHAR,该事件表示接收倒任何字符并放进接收缓冲区中 
	SetCommMask(m_hCom,EV_RXCHAR); 
 
	//把间隔超时设为最大,把读总超时设为0将导致ReadFile立即返回并完成操作 
	TimeOuts.ReadIntervalTimeout=5; 
	TimeOuts.ReadTotalTimeoutMultiplier=5; 
	TimeOuts.ReadTotalTimeoutConstant=0; 
	//设置写超时以指定Write成员函数中的GetOverlappedResult函数的等待时间 
	TimeOuts.WriteTotalTimeoutMultiplier=5; 
	TimeOuts.WriteTotalTimeoutConstant=20; 
	SetCommTimeouts(m_hCom,&TimeOuts); 
	 
	//如果成功设置串口,启动监视串口线程,线程控制函数为CommProc, 
	//并将当前指针this作为参数传递给CommProc函数 
	if(ConfigConnection()) 
	{ 
		//创汇建并挂起监视线程 
		m_pThread=AfxBeginThread(CommProc,this,THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED,NULL); 
         
		//恢复监视线程运行 
		if(m_pThread==NULL) 
		{ 
			CloseHandle(m_hCom); 
			return FALSE; 
		} 
		else  
		{ 
			m_bConnected=TRUE; 
			m_pThread->ResumeThread(); 
		} 
 
	} 
	else 
	{ 
		CloseHandle(m_hCom); 
		return FALSE; 
	} 
	return TRUE; 
} 
 
void CSimSimensDoc::CloseConnection()        //关闭串口设备 
{ 
	//如果已被挂断,返回;否则置m_dConnected为FALSE 
	if(!m_bConnected) 
		return; 
	else 
		m_bConnected=FALSE; 
 
	//结束CommProc线程中WaitForSingleObject的等待 
	SetEvent(m_hPostMsgEvent); 
 
	//结束CommProc线程中WaitCommEvent的等待 
	SetCommMask(m_hCom,0); 
 
	//等待辅助线程终止 
	WaitForSingleObject(m_pThread->m_hThread,INFINITE); 
	m_pThread=NULL; 
 
	//关闭串口设备句柄 
	CloseHandle(m_hCom); 
	return; 
} 
 
void CSimSimensDoc::Transmit()  
{ 
	// TODO: Add your command handler code here 
	SetTempStr(); 
	bcc=GetBCC(transmit_str); 
	bcc=bcc^char(DLE); 
	bcc=bcc^char(ETX); 
    m_nStatus=1; 
	m_nWriteStep=0;              
	transmit_number=0; 
	Write(char(STX)); 
	Show_T_STX(); 
        //写串口开始请求 
	if(rt_STX_number>TXA) 
	{ 
		Show_TXA_OVER_STX(); 
		EmptyTempStr(); 
		LargeReturnIdle(); 
		LinkError(); 
	} 
	else 
	{ 
		if(OutTime(QVZ)) 
		{ 
			Show_QVZ_OUTTIME(); 
	        rt_STX_number++; 
		    Transmit(); 
		} 
	} 
	return; 
} 
 
void CSimSimensDoc::GetTextBegin(CString str) 
{ 
	int l=0; 
	if(str!="") 
	{ 
		transmit_str[transmit_number]=m_cTextMode; 
	    transmit_number++; 
        l=str.GetLength(); 
	    for(int i=0;iTXA) 
	{ 
		Show_TXA_OVER_STX(); 
		EmptyTempStr(); 
		LargeReturnIdle(); 
		LinkError(); 
	} 
	return; 
} 
 
void CSimSimensDoc::ReadDLE_2() 
{ 
	char c=NULL; 
	c=Read(); 
	if(c==char(DLE)) 
	{ 
		Show_R_DLE(); 
	    Show_T_TEXT_SUCCESS(); 
		EmptyTempStr(); 
	    LargeReturnIdle(); 
		if(is_replace) 
		{ 
			if(replace_arr.GetSize()!=0) 
			{ 
				ReplaceData(replace_arr.GetAt(0)); 
				replace_arr.RemoveAt(0); 
			} 
			else 
				is_replace=false; 
		} 
	} 
	else 
	{ 
		Show_R_OTHER(); 
		Show_T_TEXT_UNSUCCESS(); 
		ReTransmit(); 
	} 
	return; 
} 
 
void CSimSimensDoc::ReadSTX() 
{ 
	char c=NULL; 
	c=Read(); 
	if(c==char(STX)) 
	{ 
		EmptyRString(); 
		Show_R_STX(); 
		Write(char(DLE)); 
		Show_T_DLE(); 
		m_nReadStep=1; 
	} 
	else 
	{ 
		if(c==char(NAK)) 
			LargeReturnIdle(); 
		else 
		{		 
			Show_R_OTHER(); 
			::Sleep(ZVZ); 
			Show_ZVZ_WAIT(); 
			Write(char(NAK)); 
			Show_T_NAK(); 
			SmallReturnIdle(); 
		} 
	} 
	return; 
} 
 
void CSimSimensDoc::ReadText() 
{ 
	COMSTAT ComStat; 
	DWORD dwErrorFlags; 
	char c=NULL; 
	c=Read(); 
	if(ClearCommError(m_hCom,&dwErrorFlags,&ComStat)) 
		no_error=true;//? 
	if(c==char(DLE)) 
		m_nReadStep=2; 
	else 
	{ 
		rc=c; 
		receive_str[receive_number]=c; 
		receive_number++; 
	} 
	if(OutTime(ZVZ)) 
	{ 
		Show_ZVZ_OUTTIME(); 
		Write(char(NAK)); 
		Show_T_NAK(); 
		rr_number++; 
		SmallReturnIdle(); 
	} 
	if(rr_number>TXA) 
	{ 
		Show_TXA_OVER_R_TEXT(); 
		LargeReturnIdle(); 
		LinkError(); 
	} 
	return; 
} 
 
void CSimSimensDoc::ReadETX() 
{  
	COMSTAT ComStat; 
	DWORD dwErrorFlags; 
	char c=NULL; 
	c=Read(); 
	if(ClearCommError(m_hCom,&dwErrorFlags,&ComStat)) 
		no_error=true;//? 
	if(c==char(DLE)) 
	{ 
		rc=c; 
		receive_str[receive_number]=c; 
		receive_number++; 
		m_nReadStep=1; 
	} 
	else 
	{ 
		if(c==char(ETX)) 
		{ 
			receive_str[receive_number]=char(DLE); 
	        receive_number++; 
	        receive_str[receive_number]=char(ETX); 
	        receive_number++; 
		    m_nReadStep=3; 
		} 
		else 
		{ 
			Show_R_OTHER(); 
			no_error=false; 
			m_nReadStep=1; 
		} 
	} 
	if(OutTime(ZVZ)) 
	{ 
		Show_ZVZ_OUTTIME(); 
		Write(char(NAK)); 
		Show_T_NAK(); 
		rr_number++; 
		SmallReturnIdle(); 
	} 
    if(rr_number>TXA) 
	{ 
		Show_TXA_OVER_R_TEXT(); 
		LargeReturnIdle(); 
		LinkError(); 
	} 
	return; 
} 
 
void CSimSimensDoc::ReadBCC() 
{ 
	COMSTAT ComStat; 
	DWORD dwErrorFlags; 
	char c=NULL; 
	bool b=false; 
	c=Read(); 
	if(ClearCommError(m_hCom,&dwErrorFlags,&ComStat)) 
		no_error=true;//? 
	Show_R_DLEETXBCC(); 
	b=CheckBCC(c); 
	if(b) 
	{ 
		Show_CHECKBCC_SUCCESS(); 
		b=no_error; 
		if(b) 
		{ 
			Show_CHECK_SUCCESS(); 
			Show_R_TEXT_SUCCESS(); 
			Write(char(DLE)); 
			Show_T_DLE(); 
			if(receive_str[0]=='R') 
				is_replace=true; 
			else 
                LargeReturnIdle(); 
			if(is_replace) 
			{ 
				LargeReturnIdle(); 
				if(replace_arr.GetSize()!=0) 
				{ 
					ReplaceData(replace_arr.GetAt(0)); 
					replace_arr.RemoveAt(0); 
				} 
				else 
					is_replace=false; 
			} 
		} 
		else 
		{ 
			Show_CHECK_UNSUCCESS(); 
			Show_R_TEXT_UNSUCCESS(); 
		    rr_number++; 
			if(rr_number>TXA) 
			{ 
				Show_TXA_OVER_R_TEXT(); 
		        LargeReturnIdle(); 
				LinkError(); 
			} 
		    else 
			{ 
		        Write(char(NAK)); 
		    	Show_T_NAK(); 
			    SmallReturnIdle(); 
			} 
		} 
	} 
	else 
	{ 
		Show_CHECKBCC_UNSUCCESS(); 
		Show_R_TEXT_UNSUCCESS(); 
		rr_number++; 
        if(rr_number>TXA) 
		{ 
			Show_TXA_OVER_R_TEXT(); 
		    LargeReturnIdle(); 
			LinkError(); 
		} 
		else 
		{ 
			Write(char(NAK)); 
	        Show_T_NAK(); 
	        SmallReturnIdle(); 
		} 
	} 
	return; 
} 
 
void CSimSimensDoc::ReadComm() 
{ 
	switch(m_nStatus) 
	{ 
    case 0: 
		switch(m_nReadStep) 
		{ 
		case 0: 
			ReadSTX(); 
			break; 
		case 1: 
		    ReadText(); 
			break; 
		case 2: 
			ReadETX(); 
			break; 
        case 3: 
            ReadBCC(); 
			break; 
		default:; 
		} 
		break; 
    case 1: 
		switch(m_nWriteStep) 
		{ 
		case 0: 
			ReadDLE_1(); 
			break; 
		case 1: 
			ReadDLE_2(); 
			break; 
		default:; 
		} 
		break; 
   	default:; 
	   } 
	return; 
} 
 
void CSimSimensDoc::Show_T_STX() 
{ 
	POSITION firstViewPos; 
	CView * pView; 
 
	firstViewPos=GetFirstViewPosition(); 
	pView=GetNextView(firstViewPos); 
 
	pView->SendMessage(WM_SHOW_T_STX); 
} 
 
void CSimSimensDoc::Show_T_DLE() 
{ 
	POSITION firstViewPos; 
	CView * pView; 
 
	firstViewPos=GetFirstViewPosition(); 
	pView=GetNextView(firstViewPos); 
 
	pView->SendMessage(WM_SHOW_T_DLE); 
} 
 
void CSimSimensDoc::Show_T_NAK() 
{ 
	POSITION firstViewPos; 
	CView * pView; 
 
	firstViewPos=GetFirstViewPosition(); 
	pView=GetNextView(firstViewPos); 
 
	pView->SendMessage(WM_SHOW_T_NAK); 
} 
 
void CSimSimensDoc::Show_T_DLEETXBCC() 
{ 
	POSITION firstViewPos; 
	CView * pView; 
 
	firstViewPos=GetFirstViewPosition(); 
	pView=GetNextView(firstViewPos); 
 
	pView->SendMessage(WM_SHOW_T_DLEETXBCC); 
} 
 
void CSimSimensDoc::Show_R_STX() 
{ 
	POSITION firstViewPos; 
	CView * pView; 
 
	firstViewPos=GetFirstViewPosition(); 
	pView=GetNextView(firstViewPos); 
 
	pView->SendMessage(WM_SHOW_R_STX); 
} 
 
void CSimSimensDoc::Show_R_DLE() 
{ 
	POSITION firstViewPos; 
	CView * pView; 
 
	firstViewPos=GetFirstViewPosition(); 
	pView=GetNextView(firstViewPos); 
 
	pView->SendMessage(WM_SHOW_R_DLE); 
} 
 
void CSimSimensDoc::Show_R_NAK() 
{ 
	POSITION firstViewPos; 
	CView * pView; 
 
	firstViewPos=GetFirstViewPosition(); 
	pView=GetNextView(firstViewPos); 
 
	pView->SendMessage(WM_SHOW_R_NAK); 
} 
 
void CSimSimensDoc::Show_R_DLEETXBCC() 
{ 
	POSITION firstViewPos; 
	CView * pView; 
 
	firstViewPos=GetFirstViewPosition(); 
	pView=GetNextView(firstViewPos); 
 
	pView->SendMessage(WM_SHOW_R_DLEETXBCC); 
} 
 
void CSimSimensDoc::Show_ZVZ_OUTTIME() 
{ 
	POSITION firstViewPos; 
	CView * pView; 
 
	firstViewPos=GetFirstViewPosition(); 
	pView=GetNextView(firstViewPos); 
 
	pView->SendMessage(WM_SHOW_ZVZ_OUTTIME); 
} 
 
void CSimSimensDoc::Show_QVZ_OUTTIME() 
{ 
	POSITION firstViewPos; 
	CView * pView; 
 
	firstViewPos=GetFirstViewPosition(); 
	pView=GetNextView(firstViewPos); 
 
	pView->SendMessage(WM_SHOW_QVZ_OUTTIME); 
} 
 
void CSimSimensDoc::Show_BWA_OUTTIME() 
{ 
	POSITION firstViewPos; 
	CView * pView; 
 
	firstViewPos=GetFirstViewPosition(); 
	pView=GetNextView(firstViewPos); 
 
	pView->SendMessage(WM_SHOW_BWA_OUTTIME); 
} 
 
void CSimSimensDoc::Show_ZVZ_WAIT() 
{ 
	POSITION firstViewPos; 
	CView * pView; 
 
	firstViewPos=GetFirstViewPosition(); 
	pView=GetNextView(firstViewPos); 
 
	pView->SendMessage(WM_SHOW_ZVZ_WAIT); 
} 
 
void CSimSimensDoc::Show_TXA_OVER_STX() 
{ 
	POSITION firstViewPos; 
	CView * pView; 
 
	firstViewPos=GetFirstViewPosition(); 
	pView=GetNextView(firstViewPos); 
 
	pView->SendMessage(WM_SHOW_TXA_OVER_STX); 
} 
 
void CSimSimensDoc::Show_TXA_OVER_T_TEXT() 
{ 
	POSITION firstViewPos; 
	CView * pView; 
 
	firstViewPos=GetFirstViewPosition(); 
	pView=GetNextView(firstViewPos); 
 
	pView->SendMessage(WM_SHOW_TXA_OVER_T_TEXT); 
} 
 
void CSimSimensDoc::Show_TXA_OVER_R_TEXT() 
{ 
	POSITION firstViewPos; 
	CView * pView; 
 
	firstViewPos=GetFirstViewPosition(); 
	pView=GetNextView(firstViewPos); 
 
	pView->SendMessage(WM_SHOW_TXA_OVER_R_TEXT); 
} 
 
void CSimSimensDoc::Show_T_TEXT_SUCCESS() 
{ 
	POSITION firstViewPos; 
	CView * pView; 
 
	firstViewPos=GetFirstViewPosition(); 
	pView=GetNextView(firstViewPos); 
 
	pView->SendMessage(WM_SHOW_T_TEXT_SUCCESS); 
} 
 
void CSimSimensDoc::Show_T_TEXT_UNSUCCESS() 
{ 
	POSITION firstViewPos; 
	CView * pView; 
 
	firstViewPos=GetFirstViewPosition(); 
	pView=GetNextView(firstViewPos); 
 
	pView->SendMessage(WM_SHOW_T_TEXT_UNSUCCESS); 
} 
 
void CSimSimensDoc::Show_R_TEXT_SUCCESS() 
{ 
	POSITION firstViewPos; 
	CView * pView; 
 
	firstViewPos=GetFirstViewPosition(); 
	pView=GetNextView(firstViewPos); 
 
	pView->SendMessage(WM_SHOW_R_TEXT_SUCCESS); 
} 
 
void CSimSimensDoc::Show_R_TEXT_UNSUCCESS() 
{ 
	POSITION firstViewPos; 
	CView * pView; 
 
	firstViewPos=GetFirstViewPosition(); 
	pView=GetNextView(firstViewPos); 
 
	pView->SendMessage(WM_SHOW_R_TEXT_UNSUCCESS); 
} 
 
void CSimSimensDoc::Show_CHECKBCC_SUCCESS() 
{ 
	POSITION firstViewPos; 
	CView * pView; 
 
	firstViewPos=GetFirstViewPosition(); 
	pView=GetNextView(firstViewPos); 
 
	pView->SendMessage(WM_SHOW_CHECKBCC_SUCCESS); 
} 
 
void CSimSimensDoc::Show_CHECKBCC_UNSUCCESS() 
{ 
	POSITION firstViewPos; 
	CView * pView; 
 
	firstViewPos=GetFirstViewPosition(); 
	pView=GetNextView(firstViewPos); 
 
	pView->SendMessage(WM_SHOW_CHECKBCC_UNSUCCESS); 
} 
 
void CSimSimensDoc::Show_CHECK_SUCCESS() 
{ 
	POSITION firstViewPos; 
	CView * pView; 
 
	firstViewPos=GetFirstViewPosition(); 
	pView=GetNextView(firstViewPos); 
 
	pView->SendMessage(WM_SHOW_CHECK_SUCCESS); 
} 
 
void CSimSimensDoc::Show_CHECK_UNSUCCESS() 
{ 
	POSITION firstViewPos; 
	CView * pView; 
 
	firstViewPos=GetFirstViewPosition(); 
	pView=GetNextView(firstViewPos); 
 
	pView->SendMessage(WM_SHOW_CHECK_UNSUCCESS); 
} 
 
void CSimSimensDoc::Show_R_OTHER() 
{ 
	POSITION firstViewPos; 
	CView * pView; 
 
	firstViewPos=GetFirstViewPosition(); 
	pView=GetNextView(firstViewPos); 
 
	pView->SendMessage(WM_SHOW_R_OTHER); 
} 
 
void CSimSimensDoc::Show_T_A() 
{ 
	POSITION firstViewPos; 
	CView * pView; 
 
	firstViewPos=GetFirstViewPosition(); 
	pView=GetNextView(firstViewPos); 
 
	pView->SendMessage(WM_SHOW_T_A); 
} 
 
void CSimSimensDoc::Show_R_A() 
{ 
	POSITION firstViewPos; 
	CView * pView; 
 
	firstViewPos=GetFirstViewPosition(); 
	pView=GetNextView(firstViewPos); 
 
	pView->SendMessage(WM_SHOW_R_A); 
}