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

📄 sht11transmitdlg.cpp

📁 最近做的一款温湿度变送器的上位软件
💻 CPP
字号:
// SHT11TransmitDlg.cpp : implementation file
//

#include "stdafx.h"
#include "SHT11Transmit.h"
#include "SHT11TransmitDlg.h"
#include "PCOMM.H"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
CString temp;

FltData RX0,TX0;
COMMDATA  SetCommData;
SHT11Data envionment_variables;
int DisPlaySysTemFlag = 0;
int ReciveOKFlag = 0;

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()

/////////////////////////////////////////////////////////////////////////////
// CSHT11TransmitDlg dialog

CSHT11TransmitDlg::CSHT11TransmitDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CSHT11TransmitDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CSHT11TransmitDlg)
	m_ReceiveData = _T("");
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CSHT11TransmitDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CSHT11TransmitDlg)
	DDX_Control(pDX, IDC_EDIT2, m_ctrlEdit_Press1);
	DDX_Control(pDX, IDC_EDIT1, m_ctrlEdit_Press0);
	DDX_Text(pDX, IDC_EDIT3, m_ReceiveData);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CSHT11TransmitDlg, CDialog)
	//{{AFX_MSG_MAP(CSHT11TransmitDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
	ON_WM_CTLCOLOR()
	ON_WM_TIMER()
	ON_BN_CLICKED(IDC_CHECK1, OnCheck1)
	ON_BN_CLICKED(IDC_CHECK2, OnCheck2)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CSHT11TransmitDlg message handlers

BOOL CSHT11TransmitDlg::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

	SetCommData.port   = 1;
	SetCommData.baud   = B19200;
	SetCommData.parity = P_NONE;
	SetCommData.data   = BIT_8;
	SetCommData.stop   = STOP_1;
	
//	CComConfig	dlg;
	//dlg.DoModal();

	SetCommData.ret_open = sio_open(1);      //打开串口
	if(SetCommData.ret_open !=SIO_OK)
	{
		AfxMessageBox("串口没有打开或已被占用");
	}
	else 
	{
		sio_ioctl(SetCommData.port, SetCommData.baud, SetCommData.parity | SetCommData.data | SetCommData.stop );    //初始化
		sio_term_irq(SetCommData.port,TermIrq,(char)0xFD);
		sio_flush(SetCommData.port,2);    //清空输入输出缓冲区;
	}


	SetTimer(1,500,NULL);		//打开接收查询

//_T("Arial")   _T("楷体_GB2312")
	m_xsfont.CreateFont(30,12,0,0,FW_BOLD,0,0,0,GB2312_CHARSET,OUT_STROKE_PRECIS,
		CLIP_STROKE_PRECIS,DRAFT_QUALITY,VARIABLE_PITCH|FF_SWISS,_T("Arial") );//30,12,为字体的高和宽
	//设置动态文本框显示字体的大小
  	m_ctrlEdit_Press0.SetFont(&m_xsfont);
	m_ctrlEdit_Press1.SetFont(&m_xsfont);

	//设置静态文本框显示字体的 大小
	GetDlgItem(IDC_STATIC0)->SetFont(&m_xsfont); 
	GetDlgItem(IDC_STATIC1)->SetFont(&m_xsfont);
	//关闭自动发送
	AutoSendflag = FALSE;
	DisPlayVflag = FALSE;


	m_sheet.AddPage(&m_page1);
	m_sheet.AddPage(&m_page2);
	m_sheet.AddPage(&m_page3);
	m_sheet.AddPage(&m_page4);
	
	//用Create来创建一个属性页
	m_sheet.Create(this, WS_CHILD | WS_VISIBLE, WS_EX_CONTROLPARENT);
	//属性页的大小
	RECT rect;
	m_sheet.GetWindowRect(&rect);
	int width = rect.right - rect.left;
	int height = rect.bottom - rect.top;
	//调整属性页的大小和位置
	m_sheet.SetWindowPos(NULL,10,120, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE);


	//
	ReciveOKFlag = 0;
	
	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CSHT11TransmitDlg::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 CSHT11TransmitDlg::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 CSHT11TransmitDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

void CSHT11TransmitDlg::OnCancel() 
{
	// TODO: Add extra cleanup here
	
	CDialog::OnCancel();
}

void CSHT11TransmitDlg::OnButton1() 
{
	// TODO: Add your control notification handler code here

	m_ReceiveData = _T(" ");								
	SetDlgItemText(IDC_EDIT3,m_ReceiveData);

	if(SetCommData.ret_open != SIO_OK)
	{
	    AfxMessageBox("串口没有打开,请打开串口");
		return;
	}
	else
    {          
	        sio_flush(SetCommData.port,2);   //清空输入输出缓冲区		    
			int Num;
			Num = 0;
			SetCommData.TxBuff[Num++]  = (char)0xFF;
			SetCommData.TxBuff[Num++]  = (char)0x03;
			SetCommData.TxBuff[Num++]  = (char)0x01;
			SetCommData.TxBuff[Num++]  = (char)0x00;
			SetCommData.TxBuff[Num++]  = (char)0x02;
			SetCommData.TxBuff[Num++]  = (char)0xFE;
			SetCommData.TxBuff[Num++]  = (char)0xFD;
			sio_write(SetCommData.port,SetCommData.TxBuff,Num);  //把输出缓冲区中的数据发送出去
 }
}


HBRUSH m_hbrush2=CreateSolidBrush(RGB(0,0,0)); //为黑色
HBRUSH CSHT11TransmitDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
	HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
	
	if((pWnd->GetDlgCtrlID () == IDC_EDIT1) || (pWnd->GetDlgCtrlID () == IDC_EDIT2))
	{
		pDC->SetTextColor(RGB(0,255,0));	//绿
		pDC->SetBkColor(RGB(0,0,0));
		pDC->SetBkMode (TRANSPARENT);		//字的背景透明
		//设置设置EDIT的背景
		return m_hbrush2;					//为黑色
	}
	if((pWnd->GetDlgCtrlID () == IDC_STATIC0) || (pWnd->GetDlgCtrlID () == IDC_STATIC1))
	{
		pDC->SetTextColor(RGB(255,0,0));	//绿				
	}

	return hbr;
}
//接收数据效验
int  CheckReciveData()
{
	int  ret_read0,i;
	char RX_check,RX_check00;
	ret_read0 = 0;
	SetCommData.Getlen  = sio_iqueue(SetCommData.port);    //获取pcomm缓冲区的字节个数
	ret_read0 = sio_read(SetCommData.port,SetCommData.ReciveBuff,SetCommData.Getlen);
    if(ret_read0>0)
	{
			//进行校验
			RX_check = 0x00;
			for(i = 2; i < SetCommData.Getlen-4; i++)
			{
				RX_check ^= SetCommData.ReciveBuff[i];
			}
			RX_check00 = (SetCommData.ReciveBuff[SetCommData.Getlen-4]<<4) + (SetCommData.ReciveBuff[SetCommData.Getlen-3]&0x0F); 
			if(RX_check == RX_check00)
			{
					return 0xAA;
			}		
	}
	return 0x55;			
}
void GegFloatV(int Num)
{
	int ReciveCount;
	ReciveCount = Num;
	RX0.uc[3]=SetCommData.ReciveBuff[ReciveCount++];//float最高字节
	RX0.uc[2]=SetCommData.ReciveBuff[ReciveCount++];
	RX0.uc[1]=SetCommData.ReciveBuff[ReciveCount++];
	RX0.uc[0]=SetCommData.ReciveBuff[ReciveCount++];//float最低字节
}

void SendFloatV(int Num)
{
	int SendCount;
	SendCount = Num;
	SetCommData.TxBuff[Num++]  = TX0.uc[3];
	SetCommData.TxBuff[Num++]  = TX0.uc[2];
	SetCommData.TxBuff[Num++]  = TX0.uc[1];
	SetCommData.TxBuff[Num++]  = TX0.uc[0];
			
}
void CALLBACK CSHT11TransmitDlg::TermIrq(int port)
{
	int i;	
	if(CheckReciveData() == 0xAA)	//效验正确
	{
		ReciveOKFlag = 1;
		if(SetCommData.ReciveBuff[3] == 0x01)
		{
			i = 4;
			GegFloatV(i);
			envionment_variables.temperature = RX0.fl;

			i += 4;
			GegFloatV(i);
			envionment_variables.humidity = RX0.fl;

			i += 4;
			GegFloatV(i);												
			envionment_variables.dew_point = RX0.fl;

												
		}
		else if(SetCommData.ReciveBuff[3] == 0x02)				
		{
			if(SetCommData.ReciveBuff[4] == 0x55)
			{
				i = 5;
				GegFloatV(i);
				envionment_variables.Mini_temperature = RX0.fl;

				i += 4;
				GegFloatV(i);
				envionment_variables.Max_temperature = RX0.fl;

				i += 4;
				GegFloatV(i);											
				envionment_variables.Mini_humidity = RX0.fl;

				i += 4;
				GegFloatV(i);												
				envionment_variables.Max_humidity = RX0.fl;

				i += 4;
				GegFloatV(i);											
				envionment_variables.Zero_temperature = RX0.fl;
	
				i += 4;
				GegFloatV(i);												
				envionment_variables.Zero_humidity = RX0.fl;

				i += 4;
				GegFloatV(i);											
				envionment_variables.TC_CurrentType = RX0.fl;

				i += 4;
				GegFloatV(i);												
				envionment_variables.RH_CurrentType = RX0.fl;
				DisPlaySysTemFlag = 1;		//现实系统变量
			}
		}
		else if(SetCommData.ReciveBuff[3] == 0x04)
		{
			i = 5;
			GegFloatV(i);
			envionment_variables.PWM_OUTNUM = (unsigned int)RX0.fl;
			DisPlaySysTemFlag = 2;		//显示电流修正值
		}
	}
}


      //float       ;    //湿度最小量程
      //float       ;    //"湿度最大量程 


void CSHT11TransmitDlg::OnTimer(UINT nIDEvent) 
{
	float Vbuff;
	switch(nIDEvent)
	{
		case 1:														
				if(ReciveOKFlag == 1)		//显示变量和显示接收信息
				{
					ReciveOKFlag = 0;
					if(SetCommData.ReciveBuff[3] == 0x01)
					{
						CString str;
						CString DisV;
						DisV.Empty();
						str.Empty();
						str.Format("%-5.2f",envionment_variables.temperature);
						str += _T(" ℃  ");
						

						if(DisPlayVflag) //显示电压
						{
							Vbuff = envionment_variables.Max_temperature - envionment_variables.Mini_temperature;
							if(Vbuff > 0.1f)
							{
								envionment_variables.DisV_temperature = envionment_variables.temperature - envionment_variables.Mini_temperature;
							envionment_variables.DisV_temperature = envionment_variables.DisV_temperature/Vbuff;
						    envionment_variables.DisV_temperature *= 4.0f;
							envionment_variables.DisV_temperature +=1.0f;
							DisV.Format("%-6.3f",envionment_variables.DisV_temperature);
							str += DisV;
							}

							
						}
						SetDlgItemText(IDC_EDIT1,str);

						str.Empty();
						str.Format("%-5.2f",envionment_variables.humidity);
						str += _T(" RH%  ");

						if(DisPlayVflag) //显示电压
						{
							Vbuff = envionment_variables.Max_humidity - envionment_variables.Mini_humidity;
							if(Vbuff > 0.1f)
							{
								envionment_variables.DisV_humidity = envionment_variables.humidity - envionment_variables.Mini_humidity;
							envionment_variables.DisV_humidity /= Vbuff;
						    envionment_variables.DisV_humidity *= 4.0f;
							envionment_variables.DisV_humidity +=1.0f;
							DisV.Format("%-6.3f",envionment_variables.DisV_humidity);
							str += DisV;
							}

							
						}

						SetDlgItemText(IDC_EDIT2,str);
						/*
						str.Empty();
						str.Format("%-5.2f",envionment_variables.dew_point);
						SetDlgItemText(IDC_EDIT4,str);
						*/		
					}					
					//有数据接收刷新显示
					m_ReceiveData = _T(" ");
					m_ReceiveData += _T("收到回应字符:"); 
					m_ReceiveData+="\r\n";
					for(int i=0;i < SetCommData.Getlen;i++)
					{
						temp.Format("%02X",(unsigned char)SetCommData.ReciveBuff[i]);				 
						m_ReceiveData+=temp;
						m_ReceiveData+=_T(" ");
					}
					m_ReceiveData+="\r\n";			
					SetDlgItemText(IDC_EDIT3,m_ReceiveData);
				}																
			break;
	  case 2:		//自动发送
		  //清空接收显示
		m_ReceiveData = _T(" ");								
		SetDlgItemText(IDC_EDIT3,m_ReceiveData);
		if(SetCommData.ret_open != SIO_OK)
		{
			AfxMessageBox("串口没有打开,请打开串口");
			return;
		}
		else
		{          
	        sio_flush(SetCommData.port,2);   //清空输入输出缓冲区
			int Num;
			Num = 0;
			SetCommData.TxBuff[Num++]  = (char)0xFF;
			SetCommData.TxBuff[Num++]  = (char)0x03;
			SetCommData.TxBuff[Num++]  = (char)0x01;
			SetCommData.TxBuff[Num++]  = (char)0x00;
			SetCommData.TxBuff[Num++]  = (char)0x02;
			SetCommData.TxBuff[Num++]  = (char)0xFE;
			SetCommData.TxBuff[Num++]  = (char)0xFD;
			sio_write(SetCommData.port,SetCommData.TxBuff,Num);  //把输出缓冲区中的数据发送出去
		}			
		break;	
	default:
		break;
	}
	CDialog::OnTimer(nIDEvent);
}

void CSHT11TransmitDlg::OnCheck1() 
{
	// TODO: Add your control notification handler code here
	AutoSendflag =! AutoSendflag;
	if(AutoSendflag)
	{
		SetTimer(2,1000,NULL);		//打开自动发送
	}
	else
	{
		KillTimer(2);
	}
	
}

void CSHT11TransmitDlg::OnCheck2() 
{
	// TODO: Add your control notification handler code here
	
	DisPlayVflag =! DisPlayVflag;
	if(DisPlayVflag)
	{
	
	}
	else
	{
		//KillTimer(2);
	}
	
}

⌨️ 快捷键说明

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