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

📄 bsq_dispdlg.cpp

📁 通过串行口接收并显示电力质量检测变送器信息
💻 CPP
字号:
// bsq_dispDlg.cpp : implementation file
//

#include "stdafx.h"
#include "bsq_disp.h"
#include "bsq_dispDlg.h"
#include <math.h>                    // for trigonometry functions

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
struct uipq
        {char dat_num;
		 int  max;
		};
 struct uipq  ddd[16]=
{
{6,10},{8,10},{10,10},{0,200},{2,200},{4,200},{36,360},{38,360},{40,360},
{12,2000},{14,2000},{16,2000},{28,1},{30,1},{32,1},{44,50}
 };
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
		// No message handlers
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CBsq_dispDlg dialog

CBsq_dispDlg::CBsq_dispDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CBsq_dispDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CBsq_dispDlg)
	m_adl = _T("");
	m_ady = _T("");
	m_agl = _T("");
	m_axj = _T("");
	m_ays = _T("");
	m_bdl = _T("");
	m_bdy = _T("");
	m_bgl = _T("");
	m_bxj = _T("");
	m_bys = _T("");
	m_cdl = _T("");
	m_cdy = _T("");
	m_cgl = _T("");
	m_cxj = _T("");
	m_cys = _T("");
	m_apl = _T("");
	m_bpl = _T("");
	m_cpl = _T("");
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CBsq_dispDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CBsq_dispDlg)
	DDX_Text(pDX, IDC_EDIT_ADL, m_adl);
	DDV_MaxChars(pDX, m_adl, 10);
	DDX_Text(pDX, IDC_EDIT_ADY, m_ady);
	DDV_MaxChars(pDX, m_ady, 10);
	DDX_Text(pDX, IDC_EDIT_AGL, m_agl);
	DDV_MaxChars(pDX, m_agl, 10);
	DDX_Text(pDX, IDC_EDIT_AXJ, m_axj);
	DDV_MaxChars(pDX, m_axj, 10);
	DDX_Text(pDX, IDC_EDIT_AYS, m_ays);
	DDV_MaxChars(pDX, m_ays, 10);
	DDX_Text(pDX, IDC_EDIT_BDL, m_bdl);
	DDV_MaxChars(pDX, m_bdl, 10);
	DDX_Text(pDX, IDC_EDIT_BDY, m_bdy);
	DDV_MaxChars(pDX, m_bdy, 10);
	DDX_Text(pDX, IDC_EDIT_BGL, m_bgl);
	DDV_MaxChars(pDX, m_bgl, 10);
	DDX_Text(pDX, IDC_EDIT_BXJ, m_bxj);
	DDV_MaxChars(pDX, m_bxj, 10);
	DDX_Text(pDX, IDC_EDIT_BYS, m_bys);
	DDV_MaxChars(pDX, m_bys, 10);
	DDX_Text(pDX, IDC_EDIT_CDL, m_cdl);
	DDV_MaxChars(pDX, m_cdl, 10);
	DDX_Text(pDX, IDC_EDIT_CDY, m_cdy);
	DDV_MaxChars(pDX, m_cdy, 10);
	DDX_Text(pDX, IDC_EDIT_CGL, m_cgl);
	DDV_MaxChars(pDX, m_cgl, 10);
	DDX_Text(pDX, IDC_EDIT_CXJ, m_cxj);
	DDV_MaxChars(pDX, m_cxj, 10);
	DDX_Text(pDX, IDC_EDIT_CYS, m_cys);
	DDV_MaxChars(pDX, m_cys, 10);
	DDX_Text(pDX, IDC_EDIT_APL, m_apl);
	DDV_MaxChars(pDX, m_apl, 10);
	DDX_Text(pDX, IDC_EDIT_BPL, m_bpl);
	DDV_MaxChars(pDX, m_bpl, 10);
	DDX_Text(pDX, IDC_EDIT_CPL, m_cpl);
	DDV_MaxChars(pDX, m_cpl, 10);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CBsq_dispDlg, CDialog)
	//{{AFX_MSG_MAP(CBsq_dispDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_WM_TIMER()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CBsq_dispDlg message handlers

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

	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// 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
	if(m_port.InitPort(this, 1, 4800,'N',8,1,EV_RXCHAR|EV_TXEMPTY,512))
	{
		m_port.StartMonitoring();
	}
	SetTimer(102,500,0);
	GetDlgItem(IDC_ICON_RECT)->GetWindowRect(&icon_rect);
	ScreenToClient(&icon_rect);
	
	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CBsq_dispDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// 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 CBsq_dispDlg::OnPaint() 
{
	static int k=0;
	int x,y,r=80;
	double PI=3.1415926535,w,wa,wb,wc;
	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);
		
		// Do not call CDialog::OnPaint() for painting messages
		  
	}
	else
	{
		CPaintDC memdc(this); // device context for painting
		CPen newpen,newpen2,newpen3;
		CPen *poldpen;
		
		newpen.CreatePen(PS_SOLID,1,RGB(0,0,0));
		poldpen=memdc.SelectObject(&newpen);
		memdc.SetROP2(R2_COPYPEN);
		CFont newfont;
		newfont.CreateFont(12,0,0,0,FW_NORMAL,0,0,0,
		GB2312_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,
		DEFAULT_PITCH|FF_DONTCARE,"宋体");
		CFont *poldfont=memdc.SelectObject(&newfont);
		int oldmode=memdc.SetBkMode(TRANSPARENT);
		memdc.SetTextColor(RGB(0,0,0));

		x=icon_rect.left+(icon_rect.right-icon_rect.left)/2;
		y=icon_rect.top+(icon_rect.bottom-icon_rect.top)/2+5;
		wa=-PI/2;
		if(r_buf[0]&0x80) 
		{
			wb=PI*4/3-PI/2;
			wc=PI*2/3-PI/2;
		}
		else
		{
			wc=PI*4/3-PI/2;
			wb=PI*2/3-PI/2;
		}

		memdc.MoveTo(x,y);
		memdc.LineTo(x+80*cos(wa),y+80*sin(wa));
		memdc.TextOut(x+80*cos(wa),y+80*sin(wa),"UA");
		memdc.MoveTo(x,y);
		memdc.LineTo(x+80*cos(wb),y+80*sin(wb));
		memdc.TextOut(x+80*cos(wb),y+80*sin(wb),"UB");
		memdc.MoveTo(x,y);
		memdc.LineTo(x+80*cos(wc),y+80*sin(wc));
		memdc.TextOut(x+80*cos(wc),y+80*sin(wc),"UC");

		memdc.SetTextColor(RGB(255,0,0));
		newpen2.CreatePen(PS_SOLID,1,RGB(255,0,0));
		memdc.SelectObject(&newpen2);
		w=atof(m_axj);
		w=wa+(double)w/180*PI;
		memdc.MoveTo(x,y);
		memdc.LineTo(x+60*cos(w),y+60*sin(w));
		memdc.TextOut(x+60*cos(w),y+60*sin(w),"IA");
		w=atof(m_bxj);
		w=wb+(double)w/180*PI;
		memdc.MoveTo(x,y);
		memdc.LineTo(x+60*cos(w),y+60*sin(w));
		memdc.TextOut(x+60*cos(w),y+60*sin(w),"IB");
		memdc.MoveTo(x,y);
		w=atof(m_cxj);
		w=wc+(double)w/180*PI;
		memdc.LineTo(x+60*cos(w),y+60*sin(w));
		memdc.TextOut(x+60*cos(w),y+60*sin(w),"IC");

		newpen3.CreatePen(2,1,RGB(0,0,255));
		memdc.SelectObject(&newpen3);
		memdc.SelectStockObject(NULL_BRUSH);
		memdc.Ellipse(x-80,y-80,x+80,y+80);
		memdc.Ellipse(x-60,y-60,x+60,y+60);

		memdc.SelectObject(poldpen);
		memdc.SelectObject(poldfont);

		CDialog::OnPaint();
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CBsq_dispDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}
CString turn_data(BYTE dat1,BYTE dat2,BYTE dot)
{
	CString str;
	char cc[2]={0,0};
	cc[0]=((dat1>>4)&0x0f)+'0';str=cc;
	if(dot==3) str+=".";
	cc[0]=(dat1&0x0f)+'0';str+=cc;
	if(dot==2) str+=".";
	cc[0]=((dat2>>4)&0x0f)+'0';str+=cc;
	if(dot==1) str+=".";
	cc[0]=(dat2&0x0f)+'0';str+=cc;
	return str;
}
void CBsq_dispDlg::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	static unsigned int gl_tmp[3][3]={{0,0,0},{0,0,0},{0,0,0}};
	static unsigned int xj_tmp[3][3]={{0,0,0},{0,0,0},{0,0,0}};
	 WORD i,k;
	float fm;
	char cc_tmp[10];
	if(revice_ok)
	{
		revice_ok=0;
/*		m_ady=turn_data(r_buf[1],r_buf[2],1);//电压
		m_bdy=turn_data(r_buf[3],r_buf[4],1);
		m_cdy=turn_data(r_buf[5],r_buf[6],1);

		m_adl=turn_data(r_buf[7],r_buf[8],2);//电流
		m_bdl=turn_data(r_buf[9],r_buf[10],2);
		m_cdl=turn_data(r_buf[11],r_buf[12],2);

		for(i=0;i<3;i++)
		{
			for(k=0;k<2;k++) gl_tmp[i][k]=gl_tmp[i][k+1];
			gl_tmp[i][2]=((r_buf[i*2+13]>>4)&0x0f)*1000+(r_buf[i*2+13]&0x0f)*100+((r_buf[i*2+14]>>4)&0x0f)*10+(r_buf[i*2+14]&0x0f);
		}
		for(i=0;i<3;i++)
		{
			gl_tmp[i][0]=(gl_tmp[i][0]+gl_tmp[i][1]+gl_tmp[i][2])/3;
			r_buf[i*2+13]=gl_tmp[i][0]/1000;
			gl_tmp[i][0]=gl_tmp[i][0]%1000;
			r_buf[i*2+13]=(r_buf[i*2+13]<<4)|(gl_tmp[i][0]/100);
			gl_tmp[i][0]=gl_tmp[i][0]%100;
			r_buf[i*2+14]=gl_tmp[i][0]/10;
			gl_tmp[i][0]=gl_tmp[i][0]%10;
			r_buf[i*2+14]=(r_buf[i*2+14]<<4)|gl_tmp[i][0];
		}
		m_agl=turn_data(r_buf[13],r_buf[14],0);//功率
		if(r_buf[0]&0x10) m_agl="-"+m_agl;
		m_bgl=turn_data(r_buf[15],r_buf[16],0);
		if(r_buf[0]&0x20) m_bgl="-"+m_bgl;
		m_cgl=turn_data(r_buf[17],r_buf[18],0);
		if(r_buf[0]&0x40) m_cgl="-"+m_cgl;

/*		for(i=0;i<3;i++)
		{
			for(k=0;k<2;k++) wgl_tmp[i][k]=wgl_tmp[i][k+1];
			wgl_tmp[i][2]=(r_buf[i*2+19]>>4)*1000+(r_buf[i*2+19]&0x0f)*100+(r_buf[i*2+20]>>4)*10+(r_buf[i*2+20]&0x0f);
		}
		for(i=0;i<3;i++)
		{
			wgl_tmp[i][0]=(wgl_tmp[i][0]+wgl_tmp[i][1]+wgl_tmp[i][2])/3;
			r_buf[i*2+19]=wgl_tmp[i][0]/1000;
			wgl_tmp[i][0]=wgl_tmp[i][0]%1000;
			r_buf[i*2+19]=(r_buf[i*2+19]<<4)|(wgl_tmp[i][0]/100);
			wgl_tmp[i][0]=wgl_tmp[i][0]%100;
			r_buf[i*2+20]=wgl_tmp[i][0]/10;
			wgl_tmp[i][0]=wgl_tmp[i][0]%10;
			r_buf[i*2+20]=(r_buf[i*2+20]<<4)|wgl_tmp[i][0];
		}
		m_awg=turn_data(r_buf[19],r_buf[20],0);//无功
		if(r_buf[0]&0x01) m_awg="-"+m_awg;
		m_bwg=turn_data(r_buf[21],r_buf[22],0);
		if(r_buf[0]&0x02) m_bwg="-"+m_bwg;
		m_cwg=turn_data(r_buf[23],r_buf[24],0);
		if(r_buf[0]&0x04) m_cwg="-"+m_cwg;
*/
/*		m_ays=turn_data(r_buf[25],r_buf[26],3);//功率因数
		m_bys=turn_data(r_buf[27],r_buf[28],3);
		m_cys=turn_data(r_buf[29],r_buf[30],3);

		for(i=0;i<3;i++)
		{
			for(k=0;k<2;k++) xj_tmp[i][k]=xj_tmp[i][k+1];
			xj_tmp[i][2]=(r_buf[i*2+31]>>4)*1000+(r_buf[i*2+31]&0x0f)*100+(r_buf[i*2+32]>>4)*10+(r_buf[i*2+32]&0x0f);
		}
		for(i=0;i<3;i++)
		{
			xj_tmp[i][0]=(xj_tmp[i][0]+xj_tmp[i][1]+xj_tmp[i][2])/3;
			r_buf[i*2+31]=xj_tmp[i][0]/1000;
			xj_tmp[i][0]=xj_tmp[i][0]%1000;
			r_buf[i*2+31]=(r_buf[i*2+31]<<4)|(xj_tmp[i][0]/100);
			xj_tmp[i][0]=xj_tmp[i][0]%100;
			r_buf[i*2+32]=xj_tmp[i][0]/10;
			xj_tmp[i][0]=xj_tmp[i][0]%10;
			r_buf[i*2+32]=(r_buf[i*2+32]<<4)|xj_tmp[i][0];
		}
		m_axj=turn_data(r_buf[31],r_buf[32],1);//相角
		m_bxj=turn_data(r_buf[33],r_buf[34],1);
		m_cxj=turn_data(r_buf[35],r_buf[36],1);

		m_apl=turn_data(r_buf[37],r_buf[38],2);//频率
		m_bpl=turn_data(r_buf[39],r_buf[40],2);
		m_cpl=turn_data(r_buf[41],r_buf[42],2);
*/
			for(i=0;i<16;i++)
			{
			  k=r_buf[ddd[i].dat_num];
			  k=(k<<8)|r_buf[ddd[i].dat_num+1];
              if((i>=9)&&(i<15)&&(k&0x8000))//***********
              {
				k=(~k)+1;
				fm=(double)k*ddd[i].max/(-16384);
              }
			  else
			  fm=(float)k/16384*ddd[i].max;
			  sprintf(cc_tmp,"%.3f",fm);
			  if(i==0) 
			  {m_adl=cc_tmp;}
			  if(i==1) 
			  {m_bdl=cc_tmp;}
			  if(i==2) 
			  {m_cdl=cc_tmp;}
			  if(i==3) 
			  {m_ady=cc_tmp;}
			  if(i==4) 
			  {m_bdy=cc_tmp;}
			  if(i==5) 
			  {m_cdy=cc_tmp;}
			  if(i==6) 
			  {m_axj=cc_tmp;}
			  if(i==7) 
			  {m_bxj=cc_tmp;}
			  if(i==8) 
			  {m_cxj=cc_tmp;}
			  if(i==9) 
			  {m_agl=cc_tmp;}
			  if(i==10) 
			  {m_bgl=cc_tmp;}
			  if(i==11) 
			  {m_cgl=cc_tmp;}
			  if(i==12) 
			  {m_ays=cc_tmp;}
			  if(i==13) 
			  {m_bys=cc_tmp;}
			  if(i==14) 
			  {m_cys=cc_tmp;}
			  if(i==15) 
			  {m_apl=m_bpl=m_cpl=cc_tmp;}

			}
		UpdateData(0);
//	RedrawWindow();
	}	
	CDialog::OnTimer(nIDEvent);
}

⌨️ 快捷键说明

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