📄 comcontrol.cpp
字号:
// Comcontrol.cpp : implementation file
//
#include "stdafx.h"
#include "st6.h"
#include "Comcontrol.h"
#include "SerialControl.h"
#include "Userset.h"
#include "md5.h"
UINT MfcThreadProc(LPVOID lpParam);
// CComcontrol dialog
IMPLEMENT_DYNAMIC(CComcontrol, CDialog)
CComcontrol::CComcontrol(CWnd* pParent /*=NULL*/)
: CDialog(CComcontrol::IDD, pParent)
, m_bAutoSend(false)
{
str_rx_data = _T("");
str_tx_data = _T("");
m_bAutoSend=FALSE;
//OpenSerialPort1();
//{{AFX_DATA_INIT(CSCommTestDlg)
m_strRXData = _T("");
m_strTXData = _T("");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
CComcontrol::~CComcontrol()
{
}
void CComcontrol::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//DDX_Text(pDX, IDC_EDIT_RX_DATA, str_rx_data);
//DDX_Text(pDX, IDC_EDIT_TX_DATA, str_tx_data);
DDX_Control(pDX, IDC_MSCOMM1, m_ctrlComm);
DDX_Text(pDX, IDC_EDIT_RX_DATA, m_strRXData);
DDX_Text(pDX, IDC_EDIT_TX_DATA, m_strTXData);
DDX_Control(pDX, IDC_CHECK_HEXSEND, m_ctrlHexSend);
DDX_Control(pDX, IDC_CHECK_HEXDISPLAY, m_ctrlHexDiaplay);
}
BEGIN_MESSAGE_MAP(CComcontrol, CDialog)
//ON_BN_CLICKED(IDC_BUTTON_TX, &CComcontrol::OnBnClickedButtonTx)
//ON_MESSAGE(COM_RECVDATA,OnRecvData)
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON_TX, &CComcontrol::OnButtonManualsend)
ON_BN_CLICKED(IDC_BUTTON_CLEAR, &CComcontrol::OnBnClickedButtonClear)
ON_WM_TIMER()
ON_BN_CLICKED(IDC_CHECK_AUTOSEND, &CComcontrol::OnBnClickedCheckAutosend)
ON_EN_CHANGE(IDC_EDIT_TX_DATA, &CComcontrol::OnEnChangeEditTxData)
ON_BN_CLICKED(IDC_BUTTON_USERSET, &CComcontrol::OnBnClickedButtonUserset)
ON_WM_SIZE()
ON_BN_CLICKED(IDOK, &CComcontrol::OnBnClickedOk)
END_MESSAGE_MAP()
// CComcontrol message handlers
void CComcontrol::OnBnClickedButtonTx()
{
// TODO: Add your control notification handler code here
}
BOOL CComcontrol::OnInitDialog()
{
CDialog::OnInitDialog();
GetClientRect(&m_rect);
// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
//CButton*pbutton = (CButton*)GetDlgItem(IDC_BUTTON1);
//pbutton->SetIcon((HICON)::LoadImage(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(IDI_ICON_HK), IMAGE_ICON, 60, 60, 0));
//pbutton->SetIcon( ::LoadIcon(NULL, IDI_QUESTION) );
m_btn1.SubclassDlgItem(IDC_BUTTON_USERSET,this);
m_btn1.SetIcon(IDI_ICON_HK);
//m_btn.SetFlat(FALSE);
m_btn2.SubclassDlgItem(IDC_BUTTON2,this);
m_btn2.SetIcon(IDI_ICON2,IDI_ICON1);
m_btn3.SubclassDlgItem(IDC_BUTTON3,this);
m_btn3.SetIcon(IDI_ICON3);
m_btn3.SetColor(CButtonST::BTNST_COLOR_BK_OUT, RGB(208,208,208));
m_btn3.SetColor(CButtonST::BTNST_COLOR_BK_FOCUS, RGB(208,208,208));
m_btn3.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
PostMessage( WM_SYSCOMMAND, SC_MAXIMIZE, 0);
//m_bmenu.LoadMenu(IDR_MENU_SYSTEM);
// TODO: 在此添加额外的初始化代码
//启动串口监视线程
/*DWORD threadID;
hCommThread = ::CreateThread((LPSECURITY_ATTRIBUTES)NULL, 0,
(LPTHREAD_START_ROUTINE)SerialPort1ThreadProcess, AfxGetMainWnd()->m_hWnd, 0, &threadID);
if (hCommThread == NULL)
{
::AfxMessageBox(_T("创建串口3处理线程失败"));
::PostQuitMessage(0);
}*/
//AfxBeginThread( MfcThreadProc,NULL);
m_ctrlHexSend.SetCheck(BST_CHECKED);
m_ctrlHexDiaplay.SetCheck(BST_CHECKED);
if(m_ctrlComm.get_PortOpen())
m_ctrlComm.put_PortOpen(FALSE);
m_ctrlComm.put__CommPort(3); //选择com1
if( !m_ctrlComm.get_PortOpen())
m_ctrlComm.put_PortOpen(TRUE);//打开串口
else
AfxMessageBox(_T("cannot open serial port"));
m_ctrlComm.put_Settings(_T("115200,n,8,1")); //波特率9600,无校验,8个数据位,1个停止位
m_ctrlComm.put_InputMode(1); //1:表示以二进制方式检取数据
m_ctrlComm.put_RThreshold(1);
//参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件
m_ctrlComm.put_InputLen(0); //设置当前接收区数据长度为0
m_ctrlComm.get_InputLen();//先预读缓冲区以清除残留数据
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
LRESULT CComcontrol::OnRecvData(WPARAM wParam, LPARAM lParam)
{
/*CString recvStr((char *)wParam);
//str_rx_data += recvStr;
CString str_tmp;
for( int i = 0; i < recvStr.GetLength(); i++ )
{
str_tmp.Format(_T("%04x"),recvStr.GetAt(i));
str_rx_data += str_tmp;
}
UpdateData(false);*/
return 1;
}
UINT MfcThreadProc(LPVOID lpParam)
{
char str[256];
DWORD wCount = 0; //读取的字节数
while(1)
{
printf("1111");
}
return TRUE;
}
BEGIN_EVENTSINK_MAP(CComcontrol, CDialog)
//{{AFX_EVENTSINK_MAP(CSCommTestDlg)
ON_EVENT(CComcontrol, IDC_MSCOMM1, 1 /* OnComm */, OnComm, VTS_NONE)
//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()
void CComcontrol::OnComm()
{
// TODO: Add your control notification handler code here
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len ,k;
BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.
CString strtemp;
if(m_ctrlComm.get_CommEvent()==2) //事件值为2表示接收缓冲区内有字符
{
variant_inp = m_ctrlComm.get_Input(); //读缓冲区
safearray_inp = variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len = safearray_inp.GetOneDimSize(); //得到有效数据长度
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
for(k=0;k<len;k++) //将数组转换为Cstring型变量
{
BYTE bt=*(char*)(rxdata+k); //字符型
if(m_ctrlHexDiaplay.GetCheck())
strtemp.Format(_T("%02X "),bt); //将字符以十六进制方式送入临时变量strtemp存放,注意这里加入一个空隔
else
strtemp.Format(_T("%c"),bt); //将字符送入临时变量strtemp存放
m_strRXData+=strtemp; //加入接收编辑框对应字符串
}
}
UpdateData(FALSE); //更新编辑框内容
((CEdit*)GetDlgItem(IDC_EDIT_RX_DATA))->PostMessage(WM_VSCROLL, SB_BOTTOM, 0);
}
void CComcontrol::OnButtonManualsend()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE); //读取编辑框内容
//m_ctrlComm.put_Output(COleVariant(m_strTXData));//发送数据
if(m_ctrlHexSend.GetCheck())
{
CByteArray hexdata;
int len=String2Hex(m_strTXData,hexdata); //此处返回的len可以用于计算发送了多少个十六进制数
m_ctrlComm.put_Output(COleVariant(hexdata)); //发送十六进制数据
}
else
m_ctrlComm.put_Output(COleVariant(m_strTXData));//发送ASCII字符数据
}
void CComcontrol::OnBnClickedButtonClear()
{
// TODO: Add your control notification handler code here
m_strRXData= _T("");
UpdateData(FALSE);
}
int CComcontrol::String2Hex(CString str, CByteArray & senddata)
{
int hexdata,lowhexdata;
int hexdatalen=0;
int len=str.GetLength();
senddata.SetSize(len/2);
for(int i=0;i<len;)
{
char lstr,hstr=str[i];
if(hstr==' ')
{
i++;
continue;
}
i++;
if(i>=len)
break;
lstr=str[i];
hexdata=ConvertHexChar(hstr);
lowhexdata=ConvertHexChar(lstr);
if((hexdata==16)||(lowhexdata==16))
break;
else
hexdata=hexdata*16+lowhexdata;
i++;
senddata[hexdatalen]=(char)hexdata;
hexdatalen++;
}
senddata.SetSize(hexdatalen);
return hexdatalen;
}
char CComcontrol::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);
}
void CComcontrol::OnTimer(UINT_PTR nIDEvent)
{
// TODO: Add your message handler code here and/or call default
OnButtonManualsend();
CDialog::OnTimer(nIDEvent);
}
void CComcontrol::OnBnClickedCheckAutosend()
{
// TODO: Add your control notification handler code here
m_bAutoSend=!m_bAutoSend;
if(m_bAutoSend)
{
SetTimer(1,1000,NULL);//时间为1000毫秒
}
else
{
KillTimer(1); //取消定时
}
}
void CComcontrol::OnEnChangeEditTxData()
{
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the CDialog::OnInitDialog()
// function and call CRichEditCtrl().SetEventMask()
// with the ENM_CHANGE flag ORed into the mask.
// TODO: Add your control notification handler code here
UpdateData(TRUE); //读取编辑框内容
}
void CComcontrol::OnBnClickedButtonUserset()
{
// TODO: Add your control notification handler code here
CUserset userset;
INT_PTR nResponse = userset.DoModal();
if (nResponse == IDOK)
{
// TODO: 在此处放置处理何时用“确定”来关闭
// 对话框的代码
}
else if (nResponse == IDCANCEL)
{
// TODO: 在此放置处理何时用“取消”来关闭
// 对话框的代码
}
}
void CComcontrol::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
//最小化不需要调整位置
if(nType == SIZE_MINIMIZED )
{
return;
}
// TODO: Add your message handler code here
CWnd* pWnd = GetWindow(GW_CHILD);
while(pWnd)
{
CRect rect; //获取控件变化前大小
pWnd->GetWindowRect(&rect);
ScreenToClient(&rect);//将控件大小转换为在对话框中的区域坐标
// cx/m_rect.Width()为对话框在横向的变化比例
rect.left = rect.left * cx / m_rect.Width();/////调整控件大小
rect.right = rect.right * cx / m_rect.Width();
rect.top=rect.top * cy / m_rect.Height();
rect.bottom=rect.bottom * cy / m_rect.Height();
pWnd->MoveWindow(rect);//设置控件大小
pWnd = pWnd->GetWindow(GW_HWNDNEXT);
}
GetClientRect(&m_rect);//将变化后的对话框大小设为旧大小
}
void CComcontrol::OnBnClickedOk()
{
// TODO: Add your control notification handler code here
//OnOK();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -