📄 xt9702slavedlg.cpp
字号:
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 + -