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