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

📄 oxcygentestdlg.cpp

📁 本人用VC6.0开发的单片机通过串口与PC机通信的上位机,通信协议在说明文档中已经写出,用户在单片机上编写串口函数时按照通信协议,便可以很方便通过此软件与PC机通信.
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// OxcygenTestDlg.cpp : implementation file
//

#include "stdafx.h"
#include "OxcygenTest.h"
#include "OxcygenTestDlg.h"
#include "PortSet.h"
#include "SlaveInfo.h"
#include "Check.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

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

/////////////////////////////////////////////////////////////////////////////
// COxcygenTestDlg dialog

COxcygenTestDlg::COxcygenTestDlg(CWnd* pParent /*=NULL*/)
	: CDialog(COxcygenTestDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(COxcygenTestDlg)
	m_recive = _T("");
	m_check = 0;
	m_style = 0;
	m_gasadc = 0;
	m_gasppm = 0.0f;
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void COxcygenTestDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(COxcygenTestDlg)
	DDX_Control(pDX, IDC_MSCOMM, m_com);
	DDX_Text(pDX, IDC_EDIT_RECIVE, m_recive);
	DDX_Text(pDX, IDC_EDIT_SEND6, m_check);
	DDX_Text(pDX, IDC_EDIT_STYLE, m_style);
	DDX_Text(pDX, IDC_EDIT_ADC, m_gasadc);
	DDX_Text(pDX, IDC_EDIT_PPM, m_gasppm);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(COxcygenTestDlg, CDialog)
	//{{AFX_MSG_MAP(COxcygenTestDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BUTTON_START, OnButtonStart)
	ON_BN_CLICKED(IDC_BUTTON_SEND, OnButtonSend)
	ON_BN_CLICKED(IDC_BUTTON_SET, OnButtonSet)
	ON_BN_CLICKED(IDC_BUTTON_ADD, OnButtonAdd)
	ON_BN_CLICKED(IDC_BUTTON_DEC, OnButtonDec)
	ON_BN_CLICKED(IDC_BUTTON_FUNC, OnButtonFunc)
	ON_BN_CLICKED(IDC_BUTTON_OK, OnButtonOk)
	ON_BN_CLICKED(IDC_BUTTON_QUIT, OnButtonQuit)
	ON_BN_CLICKED(IDC_BUTTON_INFO, OnButtonInfo)
	ON_BN_CLICKED(IDC_BUTTON_CHECK, OnButtonCheck)
	ON_EN_CHANGE(IDC_EDIT_SEND, OnChangeEditSend)
	ON_WM_TIMER()
	ON_BN_CLICKED(IDC_BUTTON_A1, OnButtonA1)
	ON_BN_CLICKED(IDC_BUTTON_A2, OnButtonA2)
	ON_BN_CLICKED(IDC_BUTTON_GAS, OnButtonGas)
	ON_BN_CLICKED(IDC_BUTTON_MEAS, OnButtonMeas)
	ON_BN_CLICKED(IDC_BUTTON_REVISE, OnButtonRevise)
	ON_BN_CLICKED(IDC_BUTTON_BAK, OnButtonBak)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// COxcygenTestDlg message handlers

BOOL COxcygenTestDlg::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
	CString str0;//判断发送编辑框中是否有数据
	GetDlgItemText(IDC_EDIT_SEND,str0);
	if(str0.GetLength() == 0) {//无,那么发送按键不可用
		GetDlgItem(IDC_BUTTON_SEND)->EnableWindow(false);
	}
	else {//有,那么发送按键能用
		GetDlgItem(IDC_BUTTON_SEND)->EnableWindow(true);
	}
	//设置相关按键不能用状态
	GetDlgItem(IDC_BUTTON_START)->EnableWindow(false);
	GetDlgItem(IDC_BUTTON_SET)->EnableWindow(false);
	GetDlgItem(IDC_BUTTON_CHECK)->EnableWindow(false);
	GetDlgItem(IDC_BUTTON_INFO)->EnableWindow(false);
	GetDlgItem(IDC_BUTTON_ADD)->EnableWindow(false);
	GetDlgItem(IDC_BUTTON_DEC)->EnableWindow(false);
	GetDlgItem(IDC_BUTTON_FUNC)->EnableWindow(false);
	GetDlgItem(IDC_BUTTON_OK)->EnableWindow(false);
	GetDlgItem(IDC_BUTTON_REVISE)->EnableWindow(false);
	GetDlgItem(IDC_BUTTON_A1)->EnableWindow(false);
	GetDlgItem(IDC_BUTTON_A2)->EnableWindow(false);
	GetDlgItem(IDC_BUTTON_GAS)->EnableWindow(false);
	GetDlgItem(IDC_BUTTON_MEAS)->EnableWindow(false);
	GetDlgItem(IDC_BUTTON_BAK)->EnableWindow(false);

	//从slaveadd.ini中获得从机地址
	extern unsigned char m_Slave_add, m_Start_char;
	char *pBuf;
	DWORD dwFileLen;
	CFile file_slaveadd("slaveadd.ini",CFile::modeRead);
	dwFileLen=file_slaveadd.GetLength();
	pBuf=new char[dwFileLen+1];
	pBuf[dwFileLen]=0;
	file_slaveadd.Read(pBuf,dwFileLen);
	file_slaveadd.Close(); 
	m_Slave_add = String2int(pBuf[2], pBuf[3]);//"0x23"
	delete [] pBuf;

	//从startch.ini中获得开始字节数据
	CFile file_startch("startch.ini",CFile::modeRead);//"0xff"
	dwFileLen=file_startch.GetLength();
	pBuf=new char[dwFileLen+1];
	pBuf[dwFileLen]=0;
	file_startch.Read(pBuf,dwFileLen);
	file_startch.Close(); 
	m_Start_char = String2int(pBuf[2], pBuf[3]);
	delete [] pBuf;
	m_check = 255;
	m_state=0;

	//初始化串口
	extern CString bodrate;//波特率
	extern CString jiaoyan;//校验位
	extern CString databit;//数据位
	extern CString stopbit;//停止位
	extern short c1;//串口位 	
	int ii[6];
	CString n;  
	CString p[6];   
	int i;
	CFile file("comset.ini",CFile::modeRead);
	dwFileLen=file.GetLength();
	pBuf=new char[dwFileLen+1];  
	pBuf[dwFileLen]=0;
	file.Read(pBuf,dwFileLen);
	file.Close();
	n=pBuf;
	p[0]=n.Mid(0,1);   
	p[1]=n.Mid(1,1); 
	p[2]=n.Mid(2,1);   
	p[3]=n.Mid(3,1); 
	p[4]=n.Mid(4,1);  
	for(i = 0; i < 5; i++) {    
		ii[i]=atoi(p[i]);
	}
	switch(ii[0]) {     //串口号	
		case 0:  c1=1; break; 
		case 1:  c1=2; break;  
		case 2:  c1=3; break;  
		case 3:  c1=4; break;  
		case 4:  c1=5; break;  
		case 5:  c1=6; break; 
		case 6:  c1=7; break;  
		case 7:  c1=8; break; 
		case 8:  c1=9; break;  
		case 9:  c1=10; break; 
		default:  c1=1;  break;
	};
	switch(ii[1]) {     //波特率
	  	case 0: bodrate="19200"; break; 
		case 1: bodrate="14400"; break;  
		case 2: bodrate="9600"; break;  
		case 3: bodrate="4800"; break;  
		case 4: bodrate="2400"; break;  
		case 5: bodrate="1800"; break;  
		default:  bodrate="9600";  break;
	}; 
	switch(ii[2]) {      //校验位设置	   	 
		case 0:   jiaoyan="n";    break; 
		case 1:   jiaoyan="n";    break;  
		case 2:   jiaoyan="n";    break;  
		default:  jiaoyan="n";    break;
	}; 
	switch(ii[3]) {     //数据位设置	   	
		case 0: databit="9"; break; 
		case 1: databit="8"; break;  
		case 2: databit="7"; break;  
		case 3: databit="6"; break;  
		case 4: databit="5"; break;  
		case 5: databit="4"; break;  
		default:  databit="8";  break;
	};	   
	switch(ii[4]) {      //数据位设置	   	
		case 0: stopbit="1.5"; break; 
		case 1: stopbit="1"; break;   
		default: stopbit="1";  break;
	};
	delete [] pBuf;
	m_com.SetCommPort(c1);               //选择COM1
    m_com.SetInBufferSize(1024);         //设置输入缓冲区的大小,字节
	m_com.SetOutBufferSize(1024);         //接收区           
	m_com.SetInputMode(1);               //输入二进制数据
	m_com.SetSettings(bodrate+","+jiaoyan+","+databit+","+stopbit);   //串口参数设置
	m_com.SetRThreshold(1);            //为1表示有一个字符引发事件
	m_com.SetInputLen(0);
	m_com.SetPortOpen(true);//打开串口*/
	SetTimer(1,100,NULL);
	UpdateData(false);	
	return TRUE;  // return TRUE  unless you set the focus to a control
}

void COxcygenTestDlg::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 COxcygenTestDlg::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	CRect rect;
    GetDlgItem(IDC_STATIC_PIC)->GetWindowRect(&rect);
    ScreenToClient(rect);  
    CDC dcMem;               //创建内存DC
    dcMem.CreateCompatibleDC (&dc);
    CBitmap MemBitmap;       
     
    MemBitmap.CreateCompatibleBitmap(&dc,rect.right,rect.bottom);
    CBitmap *OldBitmap = dcMem.SelectObject(&MemBitmap);
         
    COLORREF clrBk1(RGB(0,0,0));     //背景颜色         
    CBrush brush(clrBk1);
    dcMem.FillRect(rect,&brush);
    CPen pen3(PS_DASH,2,RGB(255,0,0));   
	//UpdateData(true);

	extern unsigned long a1_info, a2_info;
	extern float ppmdata[324];
	extern int t, k;
	if(t == 324) {
		for(int i = 323; i > 0; i--) {
			ppmdata[i] = ppmdata[i - 1];
		}
		ppmdata[0] = m_gasppm;
	}
    else {
		t = t + 1;
		ppmdata[323 - t] = m_gasppm;   //氧气含量数据
	}
//----------------------------------------------------------------------------
	//CPen pen(0,1,RGB(0,0,255));
    //dcMem.SelectObject(&pen);
	//dcMem.MoveTo(rect.left-25,rect.bottom-35-(a1_info % 100)-20);
	//dcMem.LineTo(rect.right-25,rect.bottom-35-(a1_info % 100)-20);
	int c=0;
	int b, d;
	int aa=8;//纵坐标
    for(d=0;d<101;d++) {
		c=c+2;
        dc.MoveTo(rect.left-15,rect.top+4+c);     //OXCYGEN
		dc.LineTo(rect.left,rect.top+4+c);
	}
	for(b=0;b<11;b++) {  
		aa=aa+20;
        dc.MoveTo(rect.left-22,rect.top-22+aa);    //OXCYGEN
		dc.LineTo(rect.left,rect.top-22+aa);
	}
	//横坐标
	c = 0;
	for(d=0;d<150;d++) {
		c=c+2;
        dc.MoveTo(rect.left+c,rect.bottom);     //OXCYGEN
		dc.LineTo(rect.left+c,rect.bottom+15);
	}
	for(b=0;b<16;b++) {  
		aa=aa+20;
        dc.MoveTo(rect.left-246+aa,rect.bottom);    //OXCYGEN
		dc.LineTo(rect.left-246+aa,rect.bottom+22);
	}
	
	if(t == 324) {
		for(k = t - 1; k >= 0; k--) {
			CPen pen(0,1,RGB(0,255,0));     //气体浓度          
			dcMem.SelectObject(&pen);
			dcMem.MoveTo(rect.left+(t-1-k)-52,rect.bottom-int(ppmdata[323 - k])-35);
			dcMem.LineTo(rect.left+(t-k)-52,rect.bottom-int(ppmdata[323 - k + 1])-35);
		}
	}
	else {
		for(k = t - 1; k >= 0; k--) {
			CPen pen(0,1,RGB(0,255,0));     //气体      
			dcMem.SelectObject(&pen);
	 		dcMem.MoveTo(rect.left+(t-1-k)-52,rect.bottom-int(ppmdata[323 - k - 1])-35);
			dcMem.LineTo(rect.left+(t-k)-52,rect.bottom-int(ppmdata[323 - k])-35);		
		}
	}
//-------------------------------------------------------------------------------------
	dc.BitBlt(rect.left,rect.top+8,rect.right-57,rect.bottom-34,&dcMem,0,0,SRCCOPY);
    dcMem.SelectObject(OldBitmap);  			
    dcMem.DeleteDC();
    UpdateData(false);

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

BEGIN_EVENTSINK_MAP(COxcygenTestDlg, CDialog)
    //{{AFX_EVENTSINK_MAP(COxcygenTestDlg)
	ON_EVENT(COxcygenTestDlg, IDC_MSCOMM, 1 /* OnComm */, OnOnCommMscomm, VTS_NONE)
	//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()

void COxcygenTestDlg::OnOnCommMscomm() 
{
	// TODO: Add your control notification handler code here
	UpdateData(true);

    VARIANT variant_inp;
    COleSafeArray safearray_inp;
    
	LONG len,k;
    extern unsigned char m1,m2,m3,m4,m5,m6;
	unsigned char tempdata;

	extern CString flag;//从机命令

	extern unsigned long slavetype_info;//从机型号
	extern unsigned long gasmeaur_info;//气体量程
	extern unsigned long protype_info;//程序版本
	extern unsigned long gasnum_info;//从机序号
	extern unsigned long a1_info;
	extern unsigned long a2_info;

	static CString str_recive = " ";

    CString p[5];
    BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.
    CString strtemp1,strtemp2;
    if(m_com.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
	{
		variant_inp=m_com.GetInput(); //读缓冲区
        safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量

⌨️ 快捷键说明

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