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

📄 serialportdlg.cpp

📁 在Windows CE上用串口采集数据并绘制成曲线,适合于数据采集,硬件平台是ARM开发板
💻 CPP
📖 第 1 页 / 共 2 页
字号:
const DWORD DataBitTbl[2] = {7, 8};
const BYTE  StopBitTbl[3] = {ONESTOPBIT, ONE5STOPBITS, TWOSTOPBITS};
const BYTE  ParityTbl[4] = {NOPARITY, ODDPARITY, EVENPARITY, MARKPARITY};


/*******************************************************************************************
函数名称: CSerialPortDlg::OnOpenCom
描    述: "打开端口" 按键单击事件代码
输入参数: 无
输出参数: 无
返    回: 无
********************************************************************************************/
void CSerialPortDlg::OnOpenCom() 
{
	DWORD IDThread;
	HANDLE hRecvThread;												/* 接收线程句柄 */
	UpdateData(TRUE);

	CString strPort = PorTbl[m_ComboPort.GetCurSel()];				/* 查表获取参数值 */
	DWORD baud		= BaudTbl[m_ComboBaud.GetCurSel()];
	DWORD databit   = DataBitTbl[m_ComboData.GetCurSel()];
	BYTE stopbit    = StopBitTbl[m_ComboStop.GetCurSel()];
	BYTE parity		= ParityTbl[m_ComboParity.GetCurSel()];

	BOOL ret = OpenPort(strPort, baud, databit, stopbit, parity);	/* 打开串口 */
	if (ret == FALSE)
		return;

	m_ExitThreadEvent = CreateEvent(NULL, TRUE, FALSE, NULL);		/* 创建串口接收线程退出事件*/

	// 创建串口接收线程
	hRecvThread = CreateThread(0, 0, CommRecvTread, this, 0, &IDThread);
	if (hRecvThread == NULL) 
	{
		MessageBox(_T("创建接收线程失败!"));
		return;
	}	
	CloseHandle(hRecvThread);

	m_ButOpen.EnableWindow(FALSE);									/* 打开端口按键禁止 */				
	m_ButClose.EnableWindow(TRUE);									/* 关闭端口按键使能 */
	

	CWnd *pWnd=GetDlgItem(IDC_REC_DISP);    /*绘制方格*/
	CDC *pDC=pWnd->GetDC ( );
	CRect rc;
	pWnd->GetClientRect(rc);
	rc.DeflateRect (1,1);
		int gridXnums=10,gridYnums=10;
		int dx=rc.Width()/gridXnums;
		int dy=rc.Height()/gridYnums;
		CRect gridRect(rc.left,rc.top,rc.left+dx*gridXnums,rc.top +dy*gridYnums);
		CPen *gridPen=new CPen( );
	    gridPen->CreatePen(0,0,RGB(0,100,200));
		CPen *oldPen=pDC->SelectObject (gridPen);
		for(int i=0;i<=gridXnums;i++)
		{
			pDC->MoveTo (gridRect.left +i*dx,gridRect.bottom );
			pDC->LineTo (gridRect.left +i*dx,gridRect.top  );
		}
		for(int j=0;j<=gridYnums;j++)
		{
			pDC->MoveTo (gridRect.left ,gridRect.top+j*dy);
			pDC->LineTo (gridRect.right  ,gridRect.top+j*dy);/*绘制方格代码结束*/
		}
		pDC->SelectObject (oldPen);
	    gridPen->DeleteObject ( );
		delete gridPen;
	    count=0;      //每次打开串口后丢掉保存在数组中的数据,但已绘出曲线的数据没有丢掉
		bb=FALSE;  
		select=0;     //确保每次打开串口后,处理数据正确
//	MessageBox(_T("打开") + strPort + _T("成功!"));

	 
}


/*******************************************************************************************
函数名称: CSerialPortDlg::OnOpenCom
描    述: "关闭端口" 按键单击事件代码
输入参数: 无
输出参数: 无
返    回: 无
********************************************************************************************/
void CSerialPortDlg::OnCloseCom() 
{
	if (m_ExitThreadEvent != NULL)
	{
		SetEvent(m_ExitThreadEvent);					/* 通知线程退出 */
		Sleep(1000);
		CloseHandle(m_ExitThreadEvent);
		m_ExitThreadEvent = NULL;
	}

	m_ButOpen.EnableWindow(TRUE);						/* 打开端口按键禁止 */				
	m_ButClose.EnableWindow(FALSE);						/* 关闭端口按键使能 */	
	ClosePort();
}


/*******************************************************************************************
函数名称: CSerialPortDlg::OnOpenCom
描    述: "关闭端口" 按键单击事件代码
输入参数: 无
输出参数: 无
返    回: 无
********************************************************************************************/
void CSerialPortDlg::OnSend() 
{
	DWORD dwactlen;

	if (m_hComm == INVALID_HANDLE_VALUE)
	{
		MessageBox(_T("串口未打开!"));
		return;
	}

	UpdateData(TRUE);
	int len = m_strSendEdit.GetLength();				 /* 取得输入字符串长度 */
	char *psendbuf = new char[len];

	for(int i = 0; i < len;i++)
		psendbuf[i] = (char)m_strSendEdit.GetAt(i);		 /* 转换为单字节字符 */

	WriteFile(m_hComm, psendbuf, len, &dwactlen, NULL);	 /* 从串口发送数据 */
	
	delete[] psendbuf;
}


/*******************************************************************************************
函数名称: CSerialPortDlg::OnClearSend
描    述: "清除发送缓冲区" 按键单击事件代码
输入参数: 无
输出参数: 无
返    回: 无
********************************************************************************************/
void CSerialPortDlg::OnClearSend() 
{
	m_strSendEdit = _T("");							/* 清除发送区的字符 */
	UpdateData(FALSE);
}


/*******************************************************************************************
函数名称: CSerialPortDlg::OnClearRec
描    述: "清除接收缓冲区" 按键单击事件代码
输入参数: 无
输出参数: 无
返    回: 无
********************************************************************************************/
void CSerialPortDlg::OnClearRec() 
{

	m_strRecDisp = _T("");					
	SetDlgItemText(IDC_REC_DISP,m_strRecDisp);		/* 清除接收区的字符 */
}


/*******************************************************************************************
函数名称: CSerialPortDlg::OnDestroy
描    述: 窗口销毁事件处理函数
输入参数: 无
输出参数: 无
返    回: 无
********************************************************************************************/
void CSerialPortDlg::OnDestroy() 
{
	CDialog::OnDestroy();
	
	if (m_ExitThreadEvent != NULL)
	{
		SetEvent(m_ExitThreadEvent);				/* 通知串口接收线程退出 */
		Sleep(1000);
		CloseHandle(m_ExitThreadEvent);				/* 关闭接收线程退出事件句柄 */
		m_ExitThreadEvent = NULL;
	}

	ClosePort();									/* 关闭串口 */
}

void CSerialPortDlg::MyInit()

{
	HWND lpTaskBar;
	lpTaskBar = ::FindWindow (_T("HHTaskBar"),NULL);
	::ShowWindow (lpTaskBar,SW_HIDE);
	CRect m_FullScreenRect; //全屏区域
	CRect WindowRect; 
	GetWindowRect(&WindowRect); 
	CRect ClientRect;
	RepositionBars(0, 0xffff, AFX_IDW_PANE_FIRST, reposQuery, &ClientRect);
	ClientToScreen(&ClientRect); 
	int nFullWidth=GetSystemMetrics(SM_CXSCREEN);
	int nFullHeight=GetSystemMetrics(SM_CYSCREEN);
	m_FullScreenRect.left = WindowRect.left-ClientRect.left;
	m_FullScreenRect.top=WindowRect.top-ClientRect.top;
	m_FullScreenRect.right=WindowRect.right-ClientRect.right+nFullWidth;
	m_FullScreenRect.bottom=WindowRect.bottom-ClientRect.bottom+nFullHeight;
	this->SetWindowPos(&wndBottom,m_FullScreenRect.left,
		m_FullScreenRect.top,m_FullScreenRect.Width(),
		m_FullScreenRect.Height(),SWP_SHOWWINDOW);//全屏区域代码结束
	
     count=0;                 //用于数组员素的记数
	 for(int i=0;i<512;i++)   //初始化存储点的数组
	 {
		 Aa[i]=0;
		 Ba[i]=0;
	 }
	 aa=TRUE;               //点的数据先存在Aa,后存在Ba
     bb=FALSE;              //决定是否保存点的逻辑变量



}











void CSerialPortDlg::Huaquxian(int data[])
{
	CWnd *pWnd=GetDlgItem(IDC_REC_DISP);    /*绘制方格*/
	CDC *pDC=pWnd->GetDC ( );
	CRect rc;
	pWnd->GetClientRect(rc);
	rc.DeflateRect (1,1);
		int gridXnums=10,gridYnums=10;
		int dx=rc.Width()/gridXnums;
		int dy=rc.Height()/gridYnums;
		CRect gridRect(rc.left,rc.top,rc.left+dx*gridXnums,rc.top +dy*gridYnums);
		CPen *gridPen=new CPen( );
	    gridPen->CreatePen(0,0,RGB(0,100,200));
		CPen *oldPen=pDC->SelectObject (gridPen);
		for(int i=0;i<=gridXnums;i++)
		{
			pDC->MoveTo (gridRect.left +i*dx,gridRect.bottom );
			pDC->LineTo (gridRect.left +i*dx,gridRect.top  );
		}
		for(int j=0;j<=gridYnums;j++)
		{
			pDC->MoveTo (gridRect.left ,gridRect.top+j*dy);
			pDC->LineTo (gridRect.right  ,gridRect.top+j*dy);/*绘制方格代码结束*/
		}
		pDC->SelectObject (oldPen);
		gridPen->Detach ( );
		gridPen->CreatePen (0,0,RGB(255,0,0));
		pDC->SelectObject (gridPen);
		int deta;
		POINT pt[512];             //把点转化成屏幕坐标的数据
		int nCount=512;
		deta=gridRect.Width ( )/nCount;
		for( i=0;i<nCount;i++)
		{
			pt[i].x =gridRect.left +i*deta;
			pt[i].y =gridRect.bottom/2 -(int)(data[i]/4096.0*gridRect.Height ( ));//确保Y轴拉升在显示	区域范围之内
	
		}
		pDC->Polyline (pt,nCount);
		pDC->SelectObject (oldPen);
		gridPen->DeleteObject ( );
		delete gridPen;

}

void CSerialPortDlg::DeleteHuaquxian(int data[])
{
	CWnd *pWnd=GetDlgItem(IDC_REC_DISP);    /*绘制方格*/
	CDC *pDC=pWnd->GetDC ( );
	CRect rc;
	pWnd->GetClientRect(rc);
	rc.DeflateRect (1,1);
		int gridXnums=10,gridYnums=10;
		int dx=rc.Width()/gridXnums;
		int dy=rc.Height()/gridYnums;
		CRect gridRect(rc.left,rc.top,rc.left+dx*gridXnums,rc.top +dy*gridYnums);
		CPen *gridPen=new CPen( );
	    gridPen->CreatePen(0,0,RGB(255,255,255));
		CPen *oldPen=pDC->SelectObject (gridPen);
			int deta;
		POINT pt[512];
		int nCount=512;           //要显示的点数
		deta=gridRect.Width ( )/nCount;
		for( int i=0;i<nCount;i++)
		{
			pt[i].x =gridRect.left +i*deta;
			pt[i].y =gridRect.bottom/2 -(int)(data[i]/4096.0*gridRect.Height ( ));//确保Y轴拉升在显示区域范围之内

		}
		pDC->Polyline (pt,nCount);
			pDC->SelectObject (oldPen);
			gridPen->Detach ( );
		gridPen->CreatePen (0,0,RGB(0,100,200));
        	pDC->SelectObject (gridPen);
		for( i=0;i<=gridXnums;i++)
		{
			pDC->MoveTo (gridRect.left +i*dx,gridRect.bottom );
			pDC->LineTo (gridRect.left +i*dx,gridRect.top  );
		}
		for(int j=0;j<=gridYnums;j++)
		{
			pDC->MoveTo (gridRect.left ,gridRect.top+j*dy);
			pDC->LineTo (gridRect.right  ,gridRect.top+j*dy);/*绘制方格代码结束*/
		}
		pDC->SelectObject (oldPen);
	
		gridPen->DeleteObject ( );
		delete gridPen;


}

⌨️ 快捷键说明

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