📄 hk-cantesterdlg.cpp
字号:
// HK-CANTesterDlg.cpp : 实现文件
//
#include "stdafx.h"
#include "HK-CANTester.h"
#include "HK-CANTesterDlg.h"
#include ".\hk-cantesterdlg.h"
#include "GoalVar.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
//read thread
UINT ReadThreadProc(LPVOID pParam)
{
HWND hWnd=((CHKCANTesterDlg *)pParam)->m_hWnd;
UCHAR temp[10];
UCHAR temp2[5];//gao
UCHAR RecId[2];
char sBuffer[128];
CString sreaddata;
FILE * in;
in=fopen("can_gao.dat","wb");
temp2[0]=0x99;
temp2[1]=0x99;
temp2[2]=0x99;
temp2[3]=0x99;
temp2[4]=0x99;
//RecId[0]=0x20;//107h biao left
//RecId[1]=0xe0;
//RecId[0]=0x20;//speed old
//RecId[1]=0x60;
RecId[0]=0x6c;//lampe 363h
RecId[1]=0x60;
//RecId[0]=0x20;//speed new
//RecId[1]=0x0;
//RecId[0]=0xa4;//water tempreature
//RecId[1]=0x20;
//RecId[0]=0xd6;//tank
//RecId[1]=0xe0;
do{
if(g_RecMode==0)//事件接收方式
{
if(WaitForSingleObject(g_hReadEvent_port[g_RecPortNo],500)==WAIT_OBJECT_0)
{
ResetEvent(g_hReadEvent_port[g_RecPortNo]);
while(HKCanReadFrame(&g_devicehandle,g_RecPortNo,&g_RecFrame)>=0)
{
g_RecCount ++;
if(40000==g_RecCount)
{
fclose(in);
exit(0);
}
if(g_ShowProcess)
{
memcpy(temp,&g_RecFrame.mFrame[2],8);
temp[8]='\0';
sreaddata.Format("%s",temp);
//sreaddata.Format("%x",temp);
((CHKCANTesterDlg *)pParam)->m_sReadFram=sreaddata;
((CHKCANTesterDlg *)pParam)->m_ullRecCount = g_RecCount;
((CHKCANTesterDlg *)pParam)->SetDlgItemText(IDC_RecFrameEDIT,sreaddata);//事件
((CHKCANTesterDlg *)pParam)->SetDlgItemText(IDC_ReCountEDIT,_ui64toa(g_RecCount,sBuffer,10));
if((g_RecFrame.mFrame[0]==RecId[0]) && ((g_RecFrame.mFrame[1]&0xf0)==RecId[1]))
{
fwrite(&g_RecFrame,sizeof(g_RecFrame),1,in);
fwrite(temp2,5,1,in);
}
}
}
}
}
else//轮询接收方式
{
while(HKCanReadFrame(&g_devicehandle,g_RecPortNo,&g_RecFrame)>=0)
{
g_RecCount ++;
if(g_ShowProcess)
{
memcpy(temp,&g_RecFrame.mFrame[2],8);
temp[8]='\0';
//sreaddata.Format("%s",temp);
sreaddata.Format("%x",temp);
((CHKCANTesterDlg *)pParam)->m_sReadFram=sreaddata;
((CHKCANTesterDlg *)pParam)->m_ullRecCount = g_RecCount;
((CHKCANTesterDlg *)pParam)->SetDlgItemText(IDC_RecFrameEDIT,sreaddata); //轮询sreaddata
((CHKCANTesterDlg *)pParam)->SetDlgItemText(IDC_ReCountEDIT,_ui64toa(g_RecCount,sBuffer,10));
}
}
Sleep(20);//以防止过多占用CPU的资源
}
}while(g_ReadThreadFlag);
fclose(in);
return 0L;
}
//send frame thread
UINT SendThreadProc(LPVOID pParam)
{
int i;
int Status=-1;
char sBuffer[128];
do{
if(WaitForSingleObject(g_hStartSendEvent,500)==WAIT_OBJECT_0)
{
//非循环发送时复位发送事件
if(!g_blCycleSend)
ResetEvent(g_hStartSendEvent);
for(i=0;i<g_TryCount;i++)
{
Status = HKCanSendFrame(&g_devicehandle,&g_SendFrame);
if(Status==0)
break;
else
{
HKCanAbortSend(&g_devicehandle,(int)g_SendFrame.nPort);
}
}
g_SendTotalCount++;
if(Status !=0)
g_SendFailCount++;
else
g_SendOKCount++;
if(g_ShowProcess)
{
((CHKCANTesterDlg *)pParam)->m_ullSendTotalCount = g_SendTotalCount;
((CHKCANTesterDlg *)pParam)->m_ullSendOKCount = g_SendOKCount;
((CHKCANTesterDlg *)pParam)->m_ullSendFailCount = g_SendFailCount;
((CHKCANTesterDlg *)pParam)->SetDlgItemText(IDC_SdTotalCountEDIT,_ui64toa(g_SendTotalCount,sBuffer,10));
((CHKCANTesterDlg *)pParam)->SetDlgItemText(IDC_SdOKCountEDIT,_ui64toa(g_SendOKCount,sBuffer,10));
((CHKCANTesterDlg *)pParam)->SetDlgItemText(IDC_SdFaileCountEDIT,_ui64toa(g_SendFailCount,sBuffer,10));
}
//((CHKCANTesterDlg *)pParam)->UpdateData(FALSE);
}
}while(g_SendThreadFlag);
return 0L;
}
// 用于应用程序“关于”菜单项的 CAboutDlg 对话框
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// 对话框数据
enum { IDD = IDD_ABOUTBOX };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()
// CHKCANTesterDlg 对话框
CHKCANTesterDlg::CHKCANTesterDlg(CWnd* pParent /*=NULL*/)
: CDialog(CHKCANTesterDlg::IDD, pParent)
, m_sBoardType(_T("HKCAN30"))
, m_iDrvType(0)
, m_iCanBPS(0)
, m_iSendPort(0)
, m_iRecPort(1)
, m_iRecMode(0)
, m_sSendFrame(_T(""))
, m_sBoardStatus(_T("CAN卡已关闭!"))
, m_sReadFram(_T(""))
, m_ullRecCount(0)
, m_ullSendTotalCount(0)
, m_ullSendOKCount(0)
, m_ullSendFailCount(0)
, m_blCycleSend(TRUE)
, m_iTryCount(1)
, m_uiSendFreq(0)
, m_blShowProcess(TRUE)
, m_DevStatus(0)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CHKCANTesterDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_CBString(pDX, IDC_COMBO_BoardType, m_sBoardType);
DDX_CBIndex(pDX, IDC_COMBO_DrType, m_iDrvType);
DDX_CBIndex(pDX, IDC_COMBO_Baud, m_iCanBPS);
DDX_CBIndex(pDX, IDC_COMBO_SdPort, m_iSendPort);
DDX_CBIndex(pDX, IDC_COMBO_RecPort, m_iRecPort);
DDX_CBIndex(pDX, IDC_COMBO_RecType, m_iRecMode);
DDX_Text(pDX, IDC_SdFrameEDIT, m_sSendFrame);
DDV_MaxChars(pDX, m_sSendFrame, 8);
DDX_Text(pDX, IDC_BoardStatus, m_sBoardStatus);
DDX_Text(pDX, IDC_RecFrameEDIT, m_sReadFram);
DDX_Text(pDX, IDC_ReCountEDIT, m_ullRecCount);
DDX_Text(pDX, IDC_SdTotalCountEDIT, m_ullSendTotalCount);
DDX_Text(pDX, IDC_SdOKCountEDIT, m_ullSendOKCount);
DDX_Text(pDX, IDC_SdFaileCountEDIT, m_ullSendFailCount);
DDX_Check(pDX, IDC_CycleCHECK, m_blCycleSend);
DDX_Text(pDX, IDC_TryCountEDIT, m_iTryCount);
DDV_MinMaxInt(pDX, m_iTryCount, 1, INT_MAX);
DDX_Text(pDX, IDC_SdFreqEDIT, m_uiSendFreq);
DDX_Check(pDX, IDC_ProcessCHECK, m_blShowProcess);
DDX_Text(pDX, IDC_DevStatus, m_DevStatus);
}
BEGIN_MESSAGE_MAP(CHKCANTesterDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDC_OpenBoardBT, OnBnClickedOpenboardbt)
ON_BN_CLICKED(IDC_CloseBoardBT, OnBnClickedCloseboardbt)
ON_CBN_SELCHANGE(IDC_COMBO_BoardType, OnCbnSelchangeComboBoardtype)
ON_BN_CLICKED(IDC_StartSendBT, OnBnClickedStartsendbt)
ON_BN_CLICKED(IDC_StopSendBT, OnBnClickedStopsendbt)
ON_WM_DESTROY()
ON_BN_CLICKED(IDC_ClearSendCount, OnBnClickedClearsendcount)
ON_BN_CLICKED(IDC_ClearRecCount, OnBnClickedClearreccount)
ON_BN_CLICKED(IDC_ProcessCHECK, OnBnClickedProcesscheck)
ON_BN_CLICKED(IDC_RdDevStatus, OnBnClickedRddevstatus)
END_MESSAGE_MAP()
// CHKCANTesterDlg 消息处理程序
BOOL CHKCANTesterDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// 将\“关于...\”菜单项添加到系统菜单中。
// IDM_ABOUTBOX 必须在系统命令范围内。
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);
}
}
// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
// TODO: 在此添加额外的初始化代码
if(g_hReadEvent_port[0]==HANDLE(0))
g_hReadEvent_port[0] = CreateEvent(NULL,TRUE,FALSE,NULL);
if(g_hReadEvent_port[1]==HANDLE(0))
g_hReadEvent_port[1] = CreateEvent(NULL,TRUE,FALSE,NULL);
if(g_hStartSendEvent==HANDLE(0))
g_hStartSendEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
//创建接收线程
if(g_hReadFrameThread==HANDLE(0))
{
g_hReadFrameThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ReadThreadProc,this,CREATE_SUSPENDED,&g_dwReadThreadID);
//SetThreadPriority(g_hReadFrameThread,THREAD_PRIORITY_TIME_CRITICAL );
}
//创建发送线程
if(g_hSendFrameThread==HANDLE(0))
{
g_hSendFrameThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)SendThreadProc,this,CREATE_SUSPENDED,&g_dwSendThreadId);
//SetThreadPriority(g_hSendFrameThread,THREAD_PRIORITY_TIME_CRITICAL );
}
return TRUE; // 除非设置了控件的焦点,否则返回 TRUE
}
void CHKCANTesterDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// 如果向对话框添加最小化按钮,则需要下面的代码
// 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
// 这将由框架自动完成。
void CHKCANTesterDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 使图标在工作矩形中居中
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;
// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -