📄 commtestdlg.cpp
字号:
// CommTestDlg.cpp : implementation file
//
#include "stdafx.h"
#include "CommTest.h"
#include "CommTestDlg.h"
#include "string.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define BUF_SIZE 1024
#define MAX_LEN 512
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
char ConvertHexChar(char ch)
{
if((ch>='0')&&(ch<='9'))
return ch-0x30;
else if((ch>='A')&&(ch<='F'))
return ch-'A'+10;
else if((ch>='a')&&(ch<='f'))
return ch-'a'+10;
else return (-1);
}
int HexToStr(CString str,CByteArray &senddata)
{ //将一个字符串作为十六进制串转化为一个字节数组,字节间可用空格分隔,返回转换后的字节数组长度,同时字节数组长度自动设置。
int hexdata,lowhexdata;
int hexdatalen=0;
str+=' '; // 保证将类似 123 的输入 能转换成 12 03 的形式;
int len=str.GetLength();
senddata.SetSize(len/2); // 将一串16进制数 转换成字符串如:61 73 64 66 67 在转换成 “asdfg “ ;
// 两位16进制数 代表一个字符 如:61 是字符 a ;
for(int i=0;i<len;) // "123" -> 12 03
{
char lstr,hstr=str[i];
if(hstr==' '||hstr=='\n'||hstr=='\r')
{
i++;
continue;
}
i++;
if(i>=len)
break;
lstr=str[i];
if (lstr==' ') // 当低位是' '时,说明只有一位 16进制数,此时高位=0 ,低位=高位;
{
hexdata=ConvertHexChar('0');
lowhexdata=ConvertHexChar(hstr);
}
else
{
hexdata=ConvertHexChar(hstr);
lowhexdata=ConvertHexChar(lstr);
}
if ((hexdata==-1)||(lowhexdata==-1)) return ( -1);
if((hexdata==16)||(lowhexdata==16))
break;
else
hexdata=hexdata*16+lowhexdata;
i++;
senddata[hexdatalen]=(char)hexdata;
hexdatalen++;
}
senddata.SetSize(hexdatalen);
return hexdatalen;
}
void MesBox(LPCSTR str) //::AfxGetApp()->m_pMainWnd->m_hWnd
{
::MessageBox(NULL, str,"Error",MB_OK|MB_ICONINFORMATION);
}
int HexToChar(CString &str)
{ //将一个字符串作为十六进制串转化为一个字节数组,字节间可用空格分隔,返回转换后的字节数组长度,同时字节数组长度自动设置。
int hexdata,lowhexdata;
int hexdatalen=0;
CString d_str;
str+=' '; // 保证将类似 123 的输入 能转换成 12 03 的形式;
int len=str.GetLength();
// 将一串16进制数 转换成字符串如:61 73 64 66 67 在转换成 “asdfg “ ;
// 两位16进制数 代表一个字符 如:61 是字符 a ;
for(int i=0;i<len;) // "123" -> 12 03
{
char lstr,hstr=str[i];
if(hstr==' ')
{
i++;
continue;
}
i++;
if(i>=len)
break;
lstr=str[i];
if (lstr==' ') // 当低位是' '时,说明只有一位 16进制数,此时高位=0 ,低位=高位;
{
hexdata=ConvertHexChar('0');
lowhexdata=ConvertHexChar(hstr);
}
else
{
hexdata=ConvertHexChar(hstr);
lowhexdata=ConvertHexChar(lstr);
}
if ((hexdata==-1)||(lowhexdata==-1)) return ( -1);
if((hexdata==16)||(lowhexdata==16))
break;
else
hexdata=hexdata*16+lowhexdata;
i++;
d_str.Insert(i,(char)hexdata);
hexdatalen++;
}
str=d_str;
return 1;
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
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()
/////////////////////////////////////////////////////////////////////////////
// CCommTestDlg dialog
CCommTestDlg::CCommTestDlg(CWnd* pParent /*=NULL*/)
: CDialog(CCommTestDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CCommTestDlg)
m_maxLen = 0;
m_ReceiveData = _T("");
m_sendTime = 0;
m_SendData = _T("");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CCommTestDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CCommTestDlg)
DDX_Control(pDX, IDC_HEX_RECEIVE, m_hexreceive);
DDX_Control(pDX, IDC_HEX_SEND,m_hexsend);
DDX_Control(pDX, IDC_MSCOMM1, m_comm);
DDX_Text(pDX, IDC_MAXLEN, m_maxLen);
DDX_Text(pDX, IDC_RECEIVE, m_ReceiveData);
DDX_Text(pDX, IDC_TIME, m_sendTime);
DDX_Text(pDX, IDC_SEND, m_SendData);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CCommTestDlg, CDialog)
//{{AFX_MSG_MAP(CCommTestDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_COMMAND(ID_CLEAR, OnClear)
ON_COMMAND(ID_CLOSE_PORT, OnClosePort)
ON_COMMAND(ID_OPEN_FILE, OnOpenFile)
ON_COMMAND(ID_OPEN_PORT, OnOpenPort)
ON_COMMAND(ID_SEND, OnSend)
ON_COMMAND(ID_SET_PORT, OnSetPort)
ON_BN_CLICKED(IDC_ASCII_RECEIVE, OnAsciiReceive)
ON_BN_CLICKED(IDC_HEX_RECEIVE, OnHexReceive)
ON_BN_CLICKED(IDC_ASCII_SEND, OnAsciiSend)
ON_BN_CLICKED(IDC_HEX_SEND, OnHexSend)
ON_BN_CLICKED(IDC_AUTOSEND, OnAutosend)
ON_EN_CHANGE(IDC_SEND, OnChangeSend)
ON_WM_TIMER()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CCommTestDlg message handlers
BOOL CCommTestDlg::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
//if(!m_wndToolBar.Create(this,
// WS_CHILD|WS_VISIBLE|CBRS_TOP|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_HIDE_INPLACE|CBRS_SIZE_DYNAMIC)
// ||!m_wndToolBar.LoadToolBar(IDR_MAINFRAME)){
// TRACE0("Failed to create the tool bar!\n");
// return -1;
//}
if (!m_wndToolBar.CreateEx(this,TBSTYLE_FLAT|TBSTYLE_LIST, WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("Failed to create toolbar\n");
return -1; // fail to create
}
// LPCTSTR lpszWindow;
// HWND hwnd=NULL;
// hwnd=FindWindowEx(::AfxGetApp()->m_pMainWnd->m_hWnd,NULL,"CToolBar",lpszWindow);
// ::SetWindowPos(hwnd,wndNoTopMost ,0,0,455,40,SWP_NOSIZE);
//::SetParent(::AfxGetApp()->m_pMainWnd->m_hWnd,hwnd);
m_wndToolBar.GetToolBarCtrl().ModifyStyle(0,TBSTYLE_FLAT);
m_wndToolBar.MoveWindow(0,0,585,43);
DWORD dwExStyle = TBSTYLE_EX_DRAWDDARROWS;
m_wndToolBar.GetToolBarCtrl().SendMessage(TB_SETEXTENDEDSTYLE, 0, (LPARAM)dwExStyle);
DWORD dwStyle = m_wndToolBar.GetButtonStyle(m_wndToolBar.CommandToIndex(ID_OPEN_PORT));
//dwStyle |= TBSTYLE_DROPDOWN;
m_wndToolBar.SetButtonStyle(m_wndToolBar.CommandToIndex(ID_OPEN_PORT), dwStyle);
m_wndToolBar.SetButtonText( 0, "打开" );
m_wndToolBar.SetButtonText( 1, "关闭" );
m_wndToolBar.SetButtonText( 2, "设置" );
m_wndToolBar.SetButtonText( 4, "调入" );
m_wndToolBar.SetButtonText( 5, "发送" );
m_wndToolBar.SetButtonText( 6, "清除" );
dwStyle=TBBS_SEPARATOR ;
m_wndToolBar.SetButtonStyle(m_wndToolBar.CommandToIndex(ID_SEP), dwStyle);
//m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
// EnableDocking(CBRS_ALIGN_ANY);
// DockControlBar(&m_wndToolBar);
// 生成状态栏;
HWND hDlg=GetSafeHwnd();
HINSTANCE hInstance=AfxGetInstanceHandle();
hStatusWindow=CreateStatusWindow(WS_CHILD|WS_VISIBLE|WS_BORDER| CBRS_BOTTOM|SBARS_SIZEGRIP ,
TEXT(""),//显示在状态栏上的信息
hDlg, //父窗口句柄
AFX_IDW_STATUS_BAR); //预定义的资源ID
initParams(); // 初始化参数
int pint[5]={60,140,240,380,-1};//110,250,300设定间隔
::SendMessage(hStatusWindow,SB_SETPARTS,5,(LPARAM)pint);
SetSBtext(0," ",1);
SetSBtext(1," ",1);
SetSBtext(2," ",1);
SetSBtext(3," ",1);
return TRUE; // return TRUE unless you set the focus to a control
}
void CCommTestDlg::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 CCommTestDlg::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();
}
//WHITE_BRUSH
OnWRdraw();
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CCommTestDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CCommTestDlg::OnClear()
{
m_ReceiveData.Empty();
Len_Receive=0;
UpdateData(FALSE);
SetSBtext(3," ",1); // 更新状态栏
}
void CCommTestDlg::OnClosePort()
{
if(m_AutoSend==TRUE)
{
HWND hwnd= ::GetDlgItem(this ->m_hWnd,IDC_AUTOSEND);
::SendMessage(hwnd, BM_SETCHECK, 0, 0);
m_AutoSend=FALSE;
KillTimer(1);
}
if( m_comm.GetPortOpen())
{
PortIsOpen=FALSE;
m_comm.SetPortOpen(FALSE);
//置绘制标志;关闭串口--白色
drawPortSet=PORTCLOSE;
InvalidateRect(&m_regin,TRUE);
}
SetSBtext(1," ",1); // 更新状态栏
//工具栏按钮:关闭,清除,发送 为禁止状态
OnUpdateTBottonStatus(ID_CLOSE_PORT,FALSE);
OnUpdateTBottonStatus(ID_OPEN_PORT,TRUE);
OnUpdateTBottonStatus(ID_SEND,FALSE);
//OnUpdateTBottonStatus(ID_CLEAR,FALSE);
}
void CCommTestDlg::OnOpenPort()
{
CString m_strSettings;
m_strSettings.Format( "%d,%c,%d,%d",PortInfo.BaudRate, PortInfo.Parity ,\
PortInfo.ByteSize,PortInfo.StopBits );
//m_strSettings = _T("9600,n,8,1");
if(m_comm.GetPortOpen())
m_comm.SetPortOpen(FALSE);
m_comm.SetCommPort(CurrentPort); //选择com1
if( !m_comm.GetPortOpen())
{
m_comm.SetPortOpen(TRUE); //打开串口
PortIsOpen=TRUE; //置打开标志
SetSBtext(1," ",1); // 更新状态栏
//更新工具栏
OnUpdateTBottonStatus(ID_CLOSE_PORT,TRUE);
OnUpdateTBottonStatus(ID_OPEN_PORT,FALSE);
if (SendMode==ASCII && !m_SendData.IsEmpty())
OnUpdateTBottonStatus(ID_SEND,TRUE);
else if(SendMode==HEX && !(m_Sendhexdata.GetSize()<=0))
OnUpdateTBottonStatus(ID_SEND,TRUE);
}
else
AfxMessageBox("cannot open serial port");
m_comm.SetSettings(m_strSettings); //波特率9600,无校验,8个数据位,1个停止位
m_comm.SetRThreshold(1);
m_comm.SetInputMode(1); //参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件
m_comm.SetInputLen(0); //设置当前接收区数据长度为0
m_comm.GetInput(); //先预读缓冲区以清除残留数据
// 如果当前设置为 自动发送方式 则设置timer();
if (m_AutoSend)
SetTimer(1,m_sendTime,NULL);
drawPortSet=PORTOPEN; //置绘制标志;
InvalidateRect(&m_regin,FALSE);
//InvalidateRect(NULL,FALSE);
}
void CCommTestDlg::OnSend()
{
drawPortSet=WRITE;
InvalidateRect(&m_w,TRUE);//&m_regin
// 如果发送数据>512字节,就把数据分成n块大小512的数据块
if(SendMode==ASCII)
{
if(m_SendData.GetLength()<512 && m_SendData.GetLength()>0 )
{
m_comm.SetOutput(COleVariant(m_SendData));
}else if(m_SendData.GetLength()>512)
{
int n = m_SendData.GetLength() /MAX_LEN ; // 将数据分t次读入;
if(MAX_LEN * n <m_SendData.GetLength()) n+=1;
int j=0;
while(1)
{
//if(m_comm.GetInBufferCount()==0 && m_comm.GetOutBufferCount()==0 )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -