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

📄 xt9702slavedlg.cpp

📁 南瑞xt9702规约
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	m_pbtClear = NULL;

	m_bStart = FALSE;
	m_bConnected = FALSE;
	strcpy( strComNo, _T( "COM1" ) );
	dwBaudRate = 9600;
	DataSize = 8;
	Parity = NOPARITY;
	StopBit = ONESTOPBIT;
	
	memset( &m_osRead, 0, sizeof( OVERLAPPED ));
	memset( &m_osWrite, 0, sizeof( OVERLAPPED ));

	if((m_hPostMsgEvent=CreateEvent(NULL, TRUE, TRUE, NULL))==NULL)
		AfxMessageBox( "为WM_COMMNOTIFY消息创建事件对象失败!" );
	if((m_osRead.hEvent=CreateEvent(NULL, TRUE, FALSE, NULL))==NULL)
		AfxMessageBox( "为重叠读创建事件对象失败!" );
	if((m_osWrite.hEvent=CreateEvent(NULL, TRUE, FALSE, NULL))==NULL)
		AfxMessageBox( "为重叠写创建事件对象失败!" );

	memset( &RichEdit, 0, sizeof( CHARFORMAT ) );
	RichEdit.cbSize = sizeof(CHARFORMAT);
	RichEdit.dwMask |=  CFM_COLOR;				//启用前景色
	RichEdit.dwEffects &= ~CFE_AUTOCOLOR;		//关闭自动文字颜色
	RichEdit.dwMask |= CFM_SIZE;				//开启文字大小设置
	RichEdit.dwMask |=  CFM_FACE;				//开启字体名设置
	RichEdit.yHeight = 180;						//设置高度
	strcpy( RichEdit.szFaceName, _T("宋体") );	//设置字体
}

void CXt9702SlaveDlg::MasterProcInit( void )
{
	m_nState = XT9702S_SYNC;
	m_nrecState = XT9702S_SYNC;
	m_nCount = 0;
	m_nFrameCount = 0;
	m_nFramePoll = 0;
	m_nCurFrame = 0;
	m_nSendState = XT9702S_IDLE;
	m_nYCCurInfo = 0;
	m_nYXCurInfo = 0;
	m_nYMCurInfo = 0;
	m_nSOECurInfo = 0;
	m_nTimeCurInfo = 0;
	m_nNeedInsert = 3;
	m_ykAction = 0;
	m_soePoint = -1;
	m_soeValue = FALSE;
	m_bIsSyn = FALSE;

	savecoscount = 0;
	savesoecount = 0;
	memset( &m_Cos, -1, sizeof( m_Cos ) );
	memset( &m_Soe, -1, sizeof( m_Soe ) );
	memset( &RecBuf, 0, sizeof( struRecBuf ) );
	memset( &m_Yk, -1, sizeof( m_Yk ) );
//	m_Cos[savecoscount].m_order = -1;

}

void CXt9702SlaveDlg::MasterCreate( void )
{
	CRect	rect;
	long	oldbottom;
	GetClientRect( rect );
	m_pEdit = new CEdit;
	rect.top += 10;
	rect.left += 10;
	rect.bottom = rect.top + 20;
	rect.right/=2;
	rect.right -= 10;
	m_pEdit->Create( WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_TABSTOP|WS_BORDER|ES_LEFT|ES_AUTOHSCROLL, rect, this, 123 );
	m_pEdit->SetFont( GetFont() );
	m_pRichEditSend = new CRichEditCtrl;
	rect.top = rect.bottom + 5;
	rect.bottom = rect.top + 388;
	oldbottom = rect.bottom;
	rect.bottom = rect.top + 300;
	m_pRichEditSend->Create( WS_VSCROLL|WS_BORDER|WS_CHILD|WS_TABSTOP|WS_VISIBLE|ES_AUTOVSCROLL|ES_MULTILINE|ES_WANTRETURN|ES_READONLY, rect, this, 123 );
	m_pRichEditSend->SetFont( GetFont() );
	m_pRichEditRec = new CRichEditCtrl;
	rect.top = rect.bottom+5;
	rect.bottom = rect.top+88;
	m_pRichEditRec->Create( WS_VSCROLL|WS_BORDER|WS_CHILD|WS_TABSTOP|WS_VISIBLE|ES_AUTOVSCROLL|ES_MULTILINE|ES_WANTRETURN|ES_READONLY, rect, this, 129 );
	m_pRichEditRec->SetFont( GetFont() );
	m_pButton = new CButtonEx;
	rect.top = oldbottom + 5;
	rect.bottom = rect.top + 25;
	rect.right = rect.left+80;
	m_pButton->Create( _T( "开始" ), WS_CHILD|WS_VISIBLE|WS_TABSTOP, rect, this, IDC_BUTTON_START );
	m_pButton->SetFont( GetFont() );
	m_pbtShowYx = new CButtonEx;
	rect.left = rect.right+5;
	rect.right = rect.left+80;
	m_pbtShowYx->Create( _T( "遥信显示" ), WS_CHILD|WS_VISIBLE|WS_TABSTOP, rect, this, IDC_BUTTON_SHOWYX );
	m_pbtShowYx->SetFont( GetFont() );
	m_pbtShowYc = new CButtonEx;
	rect.left = rect.right+5;
	rect.right = rect.left+80;
	m_pbtShowYc->Create( _T( "遥测显示" ), WS_CHILD|WS_VISIBLE|WS_TABSTOP, rect, this, IDC_BUTTON_SHOWYC );
	m_pbtShowYc->SetFont( GetFont() );
	m_pbtShowYm = new CButtonEx;
	rect.left = rect.right+5;
	rect.right = rect.left+80;
	m_pbtShowYm->Create( _T( "遥脉显示" ), WS_CHILD|WS_VISIBLE|WS_TABSTOP, rect, this, IDC_BUTTON_SHOWYM );
	m_pbtShowYm->SetFont( GetFont() );
	m_pbtClear = new CButtonEx;
	rect.left = rect.right+5;
	rect.right = rect.left+80;
	m_pbtClear->Create( _T( "清除显示" ), WS_CHILD|WS_VISIBLE|WS_TABSTOP, rect, this, IDC_BUTTON_CLEAR );
	m_pbtClear->SetFont( GetFont() );

	m_pYxNum = new CStatic;
	rect.top += 20;
	rect.top = rect.bottom + 5;
	rect.bottom = rect.top + 15;
	rect.left = 10;
	rect.right = rect.left + 60;
	m_pYxNum->Create( _T( "遥信数目:" ), WS_CHILD|WS_VISIBLE, rect, this, 123 );
	m_pYxNum->SetFont( GetFont() );
	m_pEditYx = new CEdit;
	rect.top -= 5;
	rect.left = rect.right;
	rect.right = rect.left + 40;
	m_pEditYx->Create( WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_TABSTOP|WS_BORDER|ES_LEFT|ES_AUTOHSCROLL, rect, this, 123 );
	m_pEditYx->SetFont( GetFont() );
	m_pYcNum = new CStatic;
	rect.top += 5;
	rect.left = rect.right + 5;
	rect.right = rect.left + 60;
	m_pYcNum->Create( _T( "遥测数目:" ), WS_CHILD|WS_VISIBLE, rect, this, 123 );
	m_pYcNum->SetFont( GetFont() );
	m_pEditYc = new CEdit;
	rect.top -= 5;
	rect.left = rect.right;
	rect.right = rect.left + 40;
	m_pEditYc->Create( WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_TABSTOP|WS_BORDER|ES_LEFT|ES_AUTOHSCROLL, rect, this, 123 );
	m_pEditYc->SetFont( GetFont() );

	m_pYmNum = new CStatic;
	rect.top += 5;
	rect.left = rect.right + 5;
	rect.right = rect.left + 60;
	m_pYmNum->Create( _T( "遥脉数目:" ), WS_CHILD|WS_VISIBLE, rect, this, 123 );
	m_pYmNum->SetFont( GetFont() );
	m_pEditYm = new CEdit;
	rect.top -= 5;
	rect.left = rect.right;
	rect.right = rect.left + 40;
	m_pEditYm->Create( WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_TABSTOP|WS_BORDER|ES_LEFT|ES_AUTOHSCROLL, rect, this, 123 );
	m_pEditYm->SetFont( GetFont() );
	m_pYkNum = new CStatic;
	rect.top += 5;
	rect.left = rect.right + 5;
	rect.right = rect.left + 60;
	m_pYkNum->Create( _T( "遥控数目:" ), WS_CHILD|WS_VISIBLE, rect, this, 123 );
	m_pYkNum->SetFont( GetFont() );
	m_pEditYk = new CEdit;
	rect.top -= 5;
	rect.left = rect.right;
	rect.right = rect.left + 40;
	m_pEditYk->Create( WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_TABSTOP|WS_BORDER|ES_LEFT|ES_AUTOHSCROLL, rect, this, 123 );
	m_pEditYk->SetFont( GetFont() );
}

void CXt9702SlaveDlg::CreateListView( void )
{
	CRect rect;
	{
		int		i;
		char	text[128];
		CString	str;
		CImageList ImageListYx;
		m_pYxListCtrl = new CYxListCtrl;
		GetClientRect( rect );
		rect.top += 10;
		rect.left = rect.right/2;
		rect.right -= 10;
		rect.bottom -= 66;
		m_pYxListCtrl->Create(WS_CHILD | WS_VISIBLE | WS_BORDER,rect, this, 12345 );
		m_pYxListCtrl->SetTextColor( RGB( 4, 15, 191 ) );
		m_pYxListCtrl->ModifyStyle( 0, LVS_REPORT, TRUE );
		ImageListYx.Create( 1, 16, ILC_COLOR | ILC_MASK, 1, 1 ); 
		m_pYxListCtrl->SetImageList( &ImageListYx, LVSIL_SMALL );
		ASSERT( ( m_pYxListCtrl->GetStyle() & LVS_SHAREIMAGELISTS ) == 0 );
		ImageListYx.Detach();
		m_pYxListCtrl->DeleteAllItems();
		m_pYxListCtrl->SetTextColor( RGB( 0, 0, 240 ) );
		m_pYxListCtrl->ModifyStyle( 0, LVS_REPORT, TRUE );
		m_pYxListCtrl->SetExtendedStyle( m_pYxListCtrl->GetExtendedStyle() | LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT );
		m_pYxListCtrl->InsertColumn( 0, _T( "序号" ), LVCFMT_LEFT, 60 );
		m_pYxListCtrl->InsertColumn( 1, _T( "实际值" ), LVCFMT_LEFT, 80 );
		m_pYxListCtrl->DeleteAllItems();
		m_pEditYx->GetWindowText( str );
		for( i = 0; i < atoi( str.GetBuffer( 0 ) ); i++ ) {
			sprintf( text, "%d", i );
			m_pYxListCtrl->InsertItem( i, text );
			m_pYxListCtrl->SetItemText( i, 1, "    □" );
		}
	}

	{
		int		i;
		char	text[128];
		CString	str;
		CImageList ImageListYc;
		m_pYcListCtrl = new CYcListCtrl;
		GetClientRect( rect );
		rect.top += 10;
		rect.left = rect.right/2;
		rect.right -= 10;
		rect.bottom -= 66;
		m_pYcListCtrl->Create(WS_CHILD | WS_VISIBLE | WS_BORDER,rect, this, 12345 );
		m_pYcListCtrl->SetTextColor( RGB( 4, 15, 191 ) );
		m_pYcListCtrl->ModifyStyle( 0, LVS_REPORT, TRUE );
		ImageListYc.Create( 1, 16, ILC_COLOR | ILC_MASK, 1, 1 ); 
		m_pYcListCtrl->SetImageList( &ImageListYc, LVSIL_SMALL );
		ASSERT( ( m_pYcListCtrl->GetStyle() & LVS_SHAREIMAGELISTS ) == 0 );
		ImageListYc.Detach();
		m_pYcListCtrl->ShowWindow( SW_HIDE );
		m_pYcListCtrl->DeleteAllItems();
		m_pYcListCtrl->SetTextColor( RGB( 0, 0, 240 ) );
		m_pYcListCtrl->ModifyStyle( 0, LVS_REPORT, TRUE );
		m_pYcListCtrl->SetExtendedStyle( m_pYcListCtrl->GetExtendedStyle() | LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT );
		m_pYcListCtrl->InsertColumn( 0, _T( "序号" ), LVCFMT_LEFT, 60 );
		m_pYcListCtrl->InsertColumn( 1, _T( "系数" ), LVCFMT_LEFT, 60 );
		m_pYcListCtrl->InsertColumn( 2, _T( "实际值" ), LVCFMT_LEFT, 80 );
		m_pYcListCtrl->DeleteAllItems();
		m_pEditYc->GetWindowText( str );
		for( i = 0; i < atoi( str.GetBuffer( 0 ) ); i++ ) {
			sprintf( text, "%d", i );
			m_pYcListCtrl->InsertItem( i, text );
			m_pYcListCtrl->SetItemText( i, 1, "2047" );
			m_pYcListCtrl->SetItemText( i, 2, "0" );
		}
	}

	{
		int		i;
		char	text[128];
		CString	str;
		CImageList ImageListYm;
		m_pYmListCtrl = new CYcListCtrl;
		GetClientRect( rect );
		rect.top += 10;
		rect.left = rect.right/2;
		rect.right -= 10;
		rect.bottom -= 66;
		m_pYmListCtrl->Create(WS_CHILD | WS_VISIBLE | WS_BORDER,rect, this, 12345 );
		m_pYmListCtrl->SetTextColor( RGB( 0, 0, 238 ) );
		m_pYmListCtrl->ModifyStyle( 0, LVS_REPORT, TRUE );
		ImageListYm.Create( 1, 16, ILC_COLOR | ILC_MASK, 1, 1 ); 
		m_pYmListCtrl->SetImageList( &ImageListYm, LVSIL_SMALL );
		ASSERT( ( m_pYmListCtrl->GetStyle() & LVS_SHAREIMAGELISTS ) == 0 );
		ImageListYm.Detach();
		m_pYmListCtrl->ShowWindow( SW_HIDE );
		m_pYmListCtrl->DeleteAllItems();
		m_pYmListCtrl->SetTextColor( RGB( 0, 0, 240 ) );
		m_pYmListCtrl->ModifyStyle( 0, LVS_REPORT, TRUE );
		m_pYmListCtrl->SetExtendedStyle( m_pYmListCtrl->GetExtendedStyle() | LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT );
		m_pYmListCtrl->InsertColumn( 0, _T( "序号" ), LVCFMT_LEFT, 60 );
		m_pYmListCtrl->InsertColumn( 1, _T( "系数" ), LVCFMT_LEFT, 60 );
		m_pYmListCtrl->InsertColumn( 2, _T( "实际值" ), LVCFMT_LEFT, 80 );
		m_pYmListCtrl->DeleteAllItems();
		m_pEditYm->GetWindowText( str );
		for( i = 0; i < atoi( str.GetBuffer( 0 ) ); i++ ) {
			sprintf( text, "%d", i );
			m_pYmListCtrl->InsertItem( i, text );
			m_pYmListCtrl->SetItemText( i, 1, "1" );
			m_pYmListCtrl->SetItemText( i, 2, "1" );
		}
	}
}

void CXt9702SlaveDlg::OnStart()
{
	m_bStart = !m_bStart;
	if( m_bStart ) {
		CComSetting	dlg;
		dlg.m_bConnected = m_bConnected;
		strcpy( dlg.m_strComNo, strComNo );
		sprintf( dlg.m_strBaudRate, "%d", dwBaudRate );
		sprintf( dlg.m_strDataSize, "%d", DataSize );
		dlg.m_Stop = StopBit;
		dlg.m_Parity = Parity;
		if( dlg.DoModal() == IDOK ) {
			strcpy( strComNo, dlg.m_strComNo );
			dwBaudRate = (DWORD)atoi( dlg.m_strBaudRate );
			DataSize = (BYTE)atoi( dlg.m_strDataSize );
			StopBit = dlg.m_strStopBit;
			Parity = dlg.m_strParity;
			if( !CreateComm() ) {
				m_bStart = !m_bStart;
				return;
			}
			SetTimer( PROTOCOL_RUN, 1000, NULL );
			SetTimer( PROTOCOL_POLL, 10, NULL );
			CreateListView();
			m_pButton->SetWindowText( _T( "结束" ) );
		}
		else {
			m_bStart = !m_bStart;
		}
	}
	else {
		CloseComm();
		KillTimer( 0 );
		delete m_pYxListCtrl;
		delete m_pYcListCtrl;
		delete m_pYmListCtrl;
		m_pButton->SetWindowText( _T( "开始" ) );
	}
}

void CXt9702SlaveDlg::OnShowYx()
{
	m_pYxListCtrl->ShowWindow( SW_SHOW );
	m_pYcListCtrl->ShowWindow( SW_HIDE );
	m_pYmListCtrl->ShowWindow( SW_HIDE );
}

void CXt9702SlaveDlg::OnShowYc()
{
	m_pYcListCtrl->ShowWindow( SW_SHOW );
	m_pYxListCtrl->ShowWindow( SW_HIDE );
	m_pYmListCtrl->ShowWindow( SW_HIDE );
}

void CXt9702SlaveDlg::OnShowYm()
{
	m_pYmListCtrl->ShowWindow( SW_SHOW );
	m_pYxListCtrl->ShowWindow( SW_HIDE );
	m_pYcListCtrl->ShowWindow( SW_HIDE );
}

void CXt9702SlaveDlg::OnClear()
{
	m_pRichEditSend->SetWindowText( "" );
	m_pRichEditRec->SetWindowText( "" );
}

BOOL CXt9702SlaveDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	// TODO: Add extra initialization here
	MasterInit();
	MasterProcInit();
	MasterCreate();
	return TRUE;  // return TRUE  unless you set the focus to a control
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CXt9702SlaveDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CXt9702SlaveDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

BOOL CXt9702SlaveDlg::CreateComm( void )
{
	COMMTIMEOUTS	TimeOuts;
	char	InitComNo[32] = "\\\\.\\";
	strcat( InitComNo, strComNo );
	m_hCom = CreateFile(
		InitComNo,
		GENERIC_READ | GENERIC_WRITE,
		0,
		NULL,
		OPEN_EXISTING,
		FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, 
		NULL);		// 重叠方式

	if( m_hCom == INVALID_HANDLE_VALUE ) {
		MessageBox( "串口打开失败!" );
		return FALSE;
	}

	SetupComm( m_hCom, 1024, 1024 );
	SetCommMask( m_hCom, EV_RXCHAR );

	/* 把间隔超时设为最大,把总超时设为0将导致ReadFile立即返回并完成操作*/
	TimeOuts.ReadIntervalTimeout = MAXDWORD; 
	TimeOuts.ReadTotalTimeoutMultiplier = 0; 
	TimeOuts.ReadTotalTimeoutConstant = 0; 

	/* 设置写超时以指定WriteComm成员函数中的GetOverlappedResult函数的等待时间*/
	TimeOuts.WriteTotalTimeoutMultiplier = 50;
	TimeOuts.WriteTotalTimeoutConstant = 2000;

	SetCommTimeouts( m_hCom, &TimeOuts );

	DCB	dcb ;						// 定义数据控制块结构
	GetCommState( m_hCom, &dcb );	//读串口原来的参数设置
	dcb.BaudRate = dwBaudRate;
	dcb.ByteSize = DataSize; 
	dcb.Parity = Parity;
	dcb.StopBits = StopBit ;
	dcb.fBinary = TRUE ;
	dcb.fParity = FALSE;
	if( SetCommState( m_hCom, &dcb )) {
		m_pThread = AfxBeginThread(
			CommProc,
			this,
			THREAD_PRIORITY_NORMAL, 
			0,
			CREATE_SUSPENDED,
			NULL);					// 创建并挂起线程
		if( m_pThread == NULL ) {
			CloseHandle( m_hCom );
			MessageBox( "线程未能启动!" );
		return FALSE;
		}
		else {
			m_bConnected = TRUE;
			m_pThread->ResumeThread(); // 恢复线程运行
		}
	}
	else {
		CloseHandle( m_hCom );
		MessageBox( "串口配置错误!" );
		return FALSE;
	}
	return TRUE;
}

void CXt9702SlaveDlg::CloseComm( void )
{
	m_bConnected = FALSE;

	KillTimer( PROTOCOL_POLL );
	KillTimer( PROTOCOL_RUN );

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -