📄 uartdlg.cpp
字号:
///////////Head Files///////////////
#include "stdafx.h"
#include "Macro.h"
#include "Global.h"
#include "Functions.h"
#include "Uart.h"
#include "UartDlg.h"
#include "DlgOption.h"
#include "PICDlg.h"
#include "PICDlg2.h"
///////////////////////////////////
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CUartDlg dialog
CUartDlg::CUartDlg(CWnd* pParent /*=NULL*/)
: CDialog(CUartDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CUartDlg)
m_iCountRxByte = 0;
m_iCountTxByte = 0;
m_iErrCycleNum = 0;
m_bErrDetect = FALSE;
m_iErrBitNum = 0;
m_fErrBitRate = 0.0f;
m_strRxEdit = _T("");
m_bRxHex = FALSE;
m_bTxAutoSpan = FALSE;
m_iTxAutoSpan = 0;
m_bTxAutoCts = FALSE;
m_bTxCycle = FALSE;
m_iTxCycleNum = 0;
m_strTxEdit = _T("");
m_bTxHex = FALSE;
m_iTxStopByte = 0;
m_bStatusBreak = FALSE;
m_bStatusCts = FALSE;
m_bStatusDcd = FALSE;
m_bStatusDsr = FALSE;
m_bStatusDtr = FALSE;
m_bStatusRing = FALSE;
m_bStatusRts = FALSE;
m_bTxStopAuto = FALSE;
m_fErrPacketRate = 0.0f;
m_iErrPacketNum = 0;
m_iRxBitNum = 0;
m_iRxPacketNum = 0;
m_strPicPath = _T("");
m_bTxPicAutoCts = FALSE;
m_strPicSavePath = _T("");
m_strPicLength = _T("");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_ICON_STONE);
}
void CUartDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CUartDlg)
DDX_Text(pDX, IDC_COUNT_RX_BYTE, m_iCountRxByte);
DDX_Text(pDX, IDC_COUNT_TX_BYTE, m_iCountTxByte);
DDX_Text(pDX, IDC_ERR_CYCLE_NUM, m_iErrCycleNum);
DDX_Check(pDX, IDC_ERR_DETECT, m_bErrDetect);
DDX_Text(pDX, IDC_ERR_BIT_NUM, m_iErrBitNum);
DDX_Text(pDX, IDC_ERR_BIT_RATE, m_fErrBitRate);
DDX_Text(pDX, IDC_RX_EDIT, m_strRxEdit);
DDX_Check(pDX, IDC_RX_HEX, m_bRxHex);
DDX_Check(pDX, IDC_TX_AUTO_SPAN_SEL, m_bTxAutoSpan);
DDX_Text(pDX, IDC_TX_AUTO_SPAN, m_iTxAutoSpan);
DDX_Check(pDX, IDC_TX_AUTO_CTS, m_bTxAutoCts);
DDX_Check(pDX, IDC_TX_CYCLE, m_bTxCycle);
DDX_Text(pDX, IDC_TX_CYCLE_NUM, m_iTxCycleNum);
DDX_Text(pDX, IDC_TX_EDIT, m_strTxEdit);
DDX_Check(pDX, IDC_TX_HEX, m_bTxHex);
DDX_Text(pDX, IDC_TX_STOP_BYTE, m_iTxStopByte);
DDX_Check(pDX, IDC_STATUS_BREAK, m_bStatusBreak);
DDX_Check(pDX, IDC_STATUS_CTS, m_bStatusCts);
DDX_Check(pDX, IDC_STATUS_DCD, m_bStatusDcd);
DDX_Check(pDX, IDC_STATUS_DSR, m_bStatusDsr);
DDX_Check(pDX, IDC_STATUS_DTR, m_bStatusDtr);
DDX_Check(pDX, IDC_STATUS_RING, m_bStatusRing);
DDX_Check(pDX, IDC_STATUS_RTS, m_bStatusRts);
DDX_Check(pDX, IDC_TX_STOP_AUTO, m_bTxStopAuto);
DDX_Control(pDX, IDC_MSCOMM, m_mscomm);
DDX_Text(pDX, IDC_ERR_PACKET_RATE, m_fErrPacketRate);
DDX_Text(pDX, IDC_ERR_PACKET_NUM, m_iErrPacketNum);
DDX_Text(pDX, IDC_RX_BIT_NUM, m_iRxBitNum);
DDX_Text(pDX, IDC_RX_PACKET_NUM, m_iRxPacketNum);
DDX_Text(pDX, IDC_EDIT_PIC_PATH, m_strPicPath);
DDX_Check(pDX, IDC_TX_PIC_CTS, m_bTxPicAutoCts);
DDX_Text(pDX, IDC_PIC_SAVE_PATH, m_strPicSavePath);
DDX_Text(pDX, IDC_EDIT_PIC_LENGTH, m_strPicLength);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CUartDlg, CDialog)
//{{AFX_MSG_MAP(CUartDlg)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_OPEN_PORT, OnOpenPort)
ON_BN_CLICKED(IDC_RX_FRESH, OnRxFresh)
ON_BN_CLICKED(IDC_TX_CYCLE, OnTxCycle)
ON_WM_TIMER()
ON_WM_CTLCOLOR()
ON_BN_CLICKED(IDC_RX_SHOW_PAUSE, OnRxShowPause)
ON_BN_CLICKED(IDC_TX_AUTO_SPAN_SEL, OnTxModeTimer)
ON_BN_CLICKED(IDC_TX_MANUAL, OnTxModeManual)
ON_BN_CLICKED(IDC_COUNT_CLR, OnCountClr)
ON_BN_CLICKED(IDC_ERR_DETECT, OnErrDetect)
ON_BN_CLICKED(IDC_ERR_CLR, OnErrClr)
ON_BN_CLICKED(IDC_ERR_CYCLE_RST, OnErrCycleRst)
ON_BN_CLICKED(IDC_TX_SHOW_CLR, OnTxShowClr)
ON_BN_CLICKED(IDC_STATUS_RTS, OnStatusRts)
ON_BN_CLICKED(IDC_STATUS_DTR, OnStatusDtr)
ON_BN_CLICKED(IDC_STATUS_BREAK, OnStatusBreak)
ON_BN_CLICKED(IDC_TX_CYCLE_RST, OnTxCycleRst)
ON_BN_CLICKED(IDC_RX_SHOW_CLR, OnRxShowClr)
ON_BN_CLICKED(IDC_TX_AUTO_CTS, OnTxModeCts)
ON_BN_CLICKED(IDC_RESET, OnReset)
ON_BN_CLICKED(IDC_OPTION, OnOption)
ON_BN_CLICKED(IDC_BUTTON_STORE_FILE_NAME, OnButtonSaveFile)
ON_BN_CLICKED(IDC_BUTTON_STORE_RESULT, OnButtonStoreResult)
ON_WM_CLOSE()
ON_BN_CLICKED(IDC_BUTTON_PICBROWSE, OnButtonPicbrowse)
ON_BN_CLICKED(IDC_BUTTON_SENDPIC, OnButtonSendPic)
ON_BN_CLICKED(IDC_BUTTON_SAVEPIC, OnButtonSavepic)
ON_BN_CLICKED(IDC_BUTTON_PIC_SAVE_PATH, OnButtonPicSavePath)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CUartDlg message handlers
void CUartDlg::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 CUartDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
BEGIN_EVENTSINK_MAP(CUartDlg, CDialog)
//{{AFX_EVENTSINK_MAP(CUartDlg)
ON_EVENT(CUartDlg, IDC_MSCOMM, 1 /* OnComm */, OnOnCommMscomm, VTS_NONE)
//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()
HBRUSH CUartDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
COLORREF ColorRGB;
ColorRGB = RGB(255,0,0);
if( pWnd->GetDlgCtrlID() == IDC_STATIC_OPEN || //修改IDC_STATIC_OPEN对应控件的颜色
pWnd->GetDlgCtrlID() == IDC_STATIC_RUN || //修改IDC_STATIC_RUN对应控件的颜色
pWnd->GetDlgCtrlID() == IDC_STATIC_BIT_RATE_SHOW ) //修改IDC_STATIC_BIT_RATE_SHOW对应控件的颜色
pDC->SetTextColor(ColorRGB);
ColorRGB = RGB(128,64,64);
if( pWnd->GetDlgCtrlID() == IDC_STATIC_INI_PORT_NUM ||
pWnd->GetDlgCtrlID() == IDC_STATIC_INI_BAUD_RATE ||
pWnd->GetDlgCtrlID() == IDC_STATIC_INI_DATA_BIT ||
pWnd->GetDlgCtrlID() == IDC_STATIC_INI_CHECK_BIT ||
pWnd->GetDlgCtrlID() == IDC_STATIC_INI_STOP_BIT ||
pWnd->GetDlgCtrlID() == IDC_STATIC_INI_FRAME )
pDC->SetTextColor(ColorRGB);
ColorRGB = RGB(128,64,0);
if( pWnd->GetDlgCtrlID() == IDC_STATIC_COUNT_TX_BYTE ||
pWnd->GetDlgCtrlID() == IDC_STATIC_COUNT_RX_BYTE ||
//pWnd->GetDlgCtrlID() == IDC_COUNT_CLR ||
pWnd->GetDlgCtrlID() == IDC_STATIC_COUNT_FRAME )
pDC->SetTextColor(ColorRGB);
ColorRGB = RGB(0,128,64);
if( pWnd->GetDlgCtrlID() == IDC_STATIC_ERR_DETECT ||
pWnd->GetDlgCtrlID() == IDC_STATIC_ERR_CYCLE_NUM ||
pWnd->GetDlgCtrlID() == IDC_STATIC_RX_BIT_NUM ||
pWnd->GetDlgCtrlID() == IDC_STATIC_ERR_BIT_NUM ||
pWnd->GetDlgCtrlID() == IDC_STATIC_ERR_BIT_RATE ||
pWnd->GetDlgCtrlID() == IDC_STATIC_RX_PACKET_NUM ||
pWnd->GetDlgCtrlID() == IDC_STATIC_ERR_PACKET_NUM ||
pWnd->GetDlgCtrlID() == IDC_STATIC_ERR_PACKET_RATE ||
//pWnd->GetDlgCtrlID() == IDC_ERR_CLR ||
//pWnd->GetDlgCtrlID() == IDC_ERR_CYCLE_RST ||
pWnd->GetDlgCtrlID() == IDC_STATIC_ERR_FRAME )
pDC->SetTextColor(ColorRGB);
ColorRGB = RGB(64,128,128);
if( pWnd->GetDlgCtrlID() == IDC_STATIC_RTS ||
pWnd->GetDlgCtrlID() == IDC_STATIC_CTS ||
pWnd->GetDlgCtrlID() == IDC_STATIC_DTR ||
pWnd->GetDlgCtrlID() == IDC_STATIC_DSR ||
pWnd->GetDlgCtrlID() == IDC_STATIC_RING ||
pWnd->GetDlgCtrlID() == IDC_STATIC_DCD ||
pWnd->GetDlgCtrlID() == IDC_STATIC_BREAK ||
pWnd->GetDlgCtrlID() == IDC_STATIC_STATUS_FRAME )
pDC->SetTextColor(ColorRGB);
ColorRGB = RGB(128,0,128);
if( pWnd->GetDlgCtrlID() == IDC_STATIC_TX_HEX ||
//pWnd->GetDlgCtrlID() == IDC_TX_SHOW_CLR ||
pWnd->GetDlgCtrlID() == IDC_STATIC_TX_CYCLE ||
pWnd->GetDlgCtrlID() == IDC_STATIC_TX_CYCLE_NUM ||
//pWnd->GetDlgCtrlID() == IDC_TX_CYCLE_RST ||
pWnd->GetDlgCtrlID() == IDC_STATIC_TX_AUTO_SPAN_SEL ||
pWnd->GetDlgCtrlID() == IDC_STATIC_AUTO_SPAN_UNIT ||
pWnd->GetDlgCtrlID() == IDC_STATIC_TX_AUTO_CTS ||
//pWnd->GetDlgCtrlID() == IDC_TX_MANUAL ||
pWnd->GetDlgCtrlID() == IDC_STATIC_TX_STOP_AUTO ||
pWnd->GetDlgCtrlID() == IDC_STATIC_RX_HEX
//pWnd->GetDlgCtrlID() == IDC_RX_SHOW_PAUSE ||
//pWnd->GetDlgCtrlID() == IDC_RX_SHOW_CLR ||
//pWnd->GetDlgCtrlID() == IDC_RX_FRESH
)
pDC->SetTextColor(ColorRGB);
// TODO: Return a different brush if the default is not desired
return hbr;
}
BOOL CUartDlg::OnInitDialog()
{
int i;
CDialog::OnInitDialog();
// 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
SetWindowText( _T("串口程序V3.5") );
g_iTxThreadPriority = 3;
m_pThread = NULL;
m_bOpen = false;
m_bRxShowPause = true;
m_cTxCycleIndex = 0;
m_cErrCycleIndex = 0;
m_iPicIndex = 0; //============
for(i=0;i<RX_BUF_SIZE;i++) m_RxBuf[i] = 0; //将发送接收缓冲区置为空 其中RX_BUF_SIZE = 1024 *31
for(i=0;i<TX_BUF_SIZE;i++) m_TxBuf[i] = 0; // TX_BUF_SIZE = 1024*4;
m_iTxByteCounterConv = 0;
m_hEventTxCts = CreateEvent(NULL, // default security attributes
TRUE, // auto reset event
FALSE, // not signaled
NULL
);
/*
m_font.CreateFont(
12, // nHeight
0, // nWidth
0, // nEscapement
0, // nOrientation
FW_NORMAL, // nWeight
FALSE, // bItalic
FALSE, // bUnderline
0, // cStrikeOut
ANSI_CHARSET, // nCharSet
OUT_DEFAULT_PRECIS, // nOutPrecision
CLIP_DEFAULT_PRECIS, // nClipPrecision
DEFAULT_QUALITY, // nQuality
DEFAULT_PITCH | FF_SWISS, // nPitchAndFamily
"Arial"); // lpszFacename
//m_tx_cyclerst.SetFont(&font);
//m_brush.CreateSolidBrush(RGB(0, 255, 0));
*/
m_iIniPortNum = 0;
m_iIniBaudRate = 1;
m_iIniDataBit = 4;
m_iIniCheckBit = 0;
m_iIniStopBit = 0;
m_iIniPicStyle = 0; //88888888888888888888888888
m_iCountRxByte = 0;
m_iCountTxByte = 0;
m_bErrDetect = true;
m_iErrCycleNum = 180;
m_iRxBitNum = 0;
m_iErrBitNum = 0;
m_fErrBitRate = 0.0;
m_iRxPacketNum = 0;
m_iErrPacketNum = 0;
m_fErrPacketRate = 0.0;
m_strRxEdit.Empty();
m_bRxHex = true;
m_strTxEdit.Empty();
m_bTxHex = true;
m_bTxCycle = true;
m_iTxCycleNum = 180;
m_bTxAutoSpan = false;
m_iTxAutoSpan = 1000;
m_bTxAutoCts = false;
m_bTxStopAuto = true;
m_iTxStopByte = 100000;
m_bStatusBreak = false;
m_bStatusCts = false;
m_bStatusDcd = false;
m_bStatusDsr = false;
m_bStatusDtr = false;
m_bStatusRing = false;
m_bStatusRts = false;
char var_string[256] = {0};
GetEnvironmentVariable("TEMP", var_string, 256);
m_strIniFileName = strcat(var_string, _T("\\Uart.ini") );
CFileFind fFind;
if( fFind.FindFile(m_strIniFileName) )
{
IniFileLoad(m_strIniFileName);
}
m_strFileName.Empty();
((CComboBox*)GetDlgItem(IDC_INI_PORT_NUM))->SetCurSel(m_iIniPortNum);//设置串口号
((CComboBox*)GetDlgItem(IDC_INI_BAUD_RATE))->SetCurSel(m_iIniBaudRate);//设置波特率
((CComboBox*)GetDlgItem(IDC_INI_DATA_BIT))->SetCurSel(m_iIniDataBit);//设置数据位
((CComboBox*)GetDlgItem(IDC_INI_CHECK_BIT))->SetCurSel(m_iIniCheckBit);//2 Even parity. 3 Mark parity. 0 No parity. 1 Odd parity. 4 Space parity.
((CComboBox*)GetDlgItem(IDC_INI_STOP_BIT))->SetCurSel(m_iIniStopBit);//0=1 stop bit. 1=1.5 stop bits. 2=2 stop bits.
((CComboBox*)GetDlgItem(IDC_INI_PIC_STYLE))->SetCurSel(m_iIniPicStyle);
GetDlgItem(IDC_STATIC_OPEN)->ShowWindow(SW_HIDE);
((CEdit *)GetDlgItem(IDC_STATUS_RTS))->EnableWindow(false);
((CEdit *)GetDlgItem(IDC_STATUS_DTR))->EnableWindow(false);
((CEdit *)GetDlgItem(IDC_STATUS_BREAK))->EnableWindow(false);
((CEdit *)GetDlgItem(IDC_STATUS_CTS))->EnableWindow(false);
((CEdit *)GetDlgItem(IDC_STATUS_DSR))->EnableWindow(false);
((CEdit *)GetDlgItem(IDC_STATUS_RING))->EnableWindow(false);
((CEdit *)GetDlgItem(IDC_STATUS_DCD))->EnableWindow(false);
((CEdit *)GetDlgItem(IDC_TX_EDIT))->EnableWindow(false);
((CEdit *)GetDlgItem(IDC_TX_HEX))->EnableWindow(false);
((CEdit *)GetDlgItem(IDC_TX_AUTO_SPAN_SEL))->EnableWindow(false);
((CEdit *)GetDlgItem(IDC_TX_AUTO_CTS))->EnableWindow(false);
((CEdit *)GetDlgItem(IDC_TX_MANUAL))->EnableWindow(false);
((CEdit *)GetDlgItem(IDC_RX_FRESH))->EnableWindow(false);
/////
UpdateData(false);
return TRUE; // return TRUE unless you set the focus to a control
}
void CUartDlg::OnOpenPort()
{
if(!m_bOpen)
{//open port
m_bOpen = true;
CString setstr;
UpdateData(true);
m_iIniPortNum = ((CComboBox*)GetDlgItem(IDC_INI_PORT_NUM))->GetCurSel();//设置串口号
m_iIniBaudRate = ((CComboBox*)GetDlgItem(IDC_INI_BAUD_RATE))->GetCurSel();//设置波特率
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -