📄 cat1025dlg.cpp
字号:
// CAT1025Dlg.cpp : implementation file
//
#include "stdafx.h"
#include "CAT1025.h"
#include "CAT1025Dlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CCAT1025Dlg dialog
CCAT1025Dlg::CCAT1025Dlg(CWnd* pParent /*=NULL*/)
: CDialog(CCAT1025Dlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CCAT1025Dlg)
m_strRecDisp = _T("");
m_StartAddr = 0;
m_EndAddr = 0;
m_WriteByte = _T("");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CCAT1025Dlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CCAT1025Dlg)
DDX_Text(pDX, IDC_REC_DISP, m_strRecDisp);
DDX_Text(pDX, IDC_START_ADDR, m_StartAddr);
DDX_Text(pDX, IDC_END_ADDR, m_EndAddr);
DDX_Text(pDX, IDC_WRITE_BYTE, m_WriteByte);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CCAT1025Dlg, CDialog)
//{{AFX_MSG_MAP(CCAT1025Dlg)
ON_BN_CLICKED(IDC_READ_CAT1025, OnReadCat1025)
ON_BN_CLICKED(IDC_OPEN_IIC1, OnOpenIIC1)
ON_BN_CLICKED(IDC_CLOSE_IIC1, OnCloseIIC1)
ON_BN_CLICKED(IDC_WRITE_CAT1025, OnWriteCat1025)
ON_WM_DESTROY()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CCAT1025Dlg message handlers
BOOL CCAT1025Dlg::OnInitDialog()
{
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
CenterWindow(GetDesktopWindow()); // center to the hpc screen
// TODO: Add extra initialization here
m_StartAddr = 0; // 起始地址
m_EndAddr = 255; // 结束地址
m_WriteByte = "AA"; // 写入字节
UpdateData(FALSE); // 更新显示
return TRUE; // return TRUE unless you set the focus to a control
}
/***************************************************
实 验 代 码
****************************************************/
#include "I2C.h" /* 包含 I2C 命令代码头文件 */
#define I2C_ADDR 0xA0 /* CAT1025 的I2C地址 */
#define PAGE_SIZE_CAT1025 16 /* CAT1025 的页面大小:16字节 */
HANDLE hFile = INVALID_HANDLE_VALUE; /* 驱动程序设备句柄 */
// "打开驱动" 按键单击事件代码
void CCAT1025Dlg::OnOpenIIC1()
{
BYTE I2cSla = I2C_ADDR;
BOOL ret;
// 打开 IIC 驱动
hFile = CreateFile(TEXT("IIC1:"), GENERIC_READ | GENERIC_WRITE, 0,
NULL, OPEN_EXISTING, 0, 0);
if (hFile == INVALID_HANDLE_VALUE)
{
MessageBox(_T("打开 IIC 驱动失败!"));
return;
}
else
MessageBox(_T("打开 IIC 驱动成功!"));
// 设置 I2C 从机器件地址
ret = ::DeviceIoControl(hFile, IOCTL_SET_I2C_SLAVE, &I2cSla, 1, NULL, 0, NULL, NULL);
if (ret != TRUE)
{
OnCloseIIC1();
MessageBox(_T("设置 I2C从机地址失败!"));
return;
}
CButton *pOpenButton = (CButton*)GetDlgItem(IDC_OPEN_IIC1); /* 取得控件指针 */
CButton *pCloseButton = (CButton*)GetDlgItem(IDC_CLOSE_IIC1);
pOpenButton->EnableWindow(FALSE); /* 禁止按键 */
pCloseButton->EnableWindow(TRUE); /* 使能按键 */
}
// "关闭驱动" 按键单击事件代码
void CCAT1025Dlg::OnCloseIIC1()
{
if (hFile != INVALID_HANDLE_VALUE)
{
CloseHandle(hFile);
hFile = INVALID_HANDLE_VALUE;
}
CButton *pOpenButton = (CButton*)GetDlgItem(IDC_OPEN_IIC1); /* 取得控件指针 */
CButton *pCloseButton = (CButton*)GetDlgItem(IDC_CLOSE_IIC1);
pOpenButton->EnableWindow(TRUE); /* 使能按键 */
pCloseButton->EnableWindow(FALSE); /* 禁止按键 */
}
// 对话框关闭退出处理函数
void CCAT1025Dlg::OnDestroy()
{
CDialog::OnDestroy();
OnCloseIIC1();
}
/*******************************************************************************************
函数名称: ReadCAT1025
描 述: 从 CAT1025 读取数据
输入参数: HANDLE hFile: 驱动程序文件句柄
DWORD offset: 从机子地址
DWORD len : 要读取的字节长度
输出参数: recbuff : 接收缓冲区
返 回: < 0: 操作失败; > 0: 成功读取的字节数
********************************************************************************************/
int ReadCAT1025(HANDLE hFile, DWORD offset, DWORD len, BYTE *recbuff)
{
DWORD actlen;
BOOL ret;
if ((len + offset) > 256) return -1; /* 输入参数检查 */
/* 先发送从机子地址 */
ret = ::WriteFile(hFile, (BYTE *)&offset, 1, &actlen, NULL);
if ((actlen != 1) || (ret == FALSE)) return -1;
ret = ::ReadFile(hFile, recbuff, len, &actlen, NULL); /* 读取数据 */
if (ret == FALSE) return -1;
return actlen; /* 返回实际读到的字节数 */
}
/*******************************************************************************************
函数名称: WriteCAT1025
描 述: 向 CAT1025 写入数据
输入参数: HANDLE hFile : 驱动程序文件句柄
DWORD offset : 从机子地址
DWORD len : 要写入的字节长度
BYTE *sendbuff: 发送缓冲区
输出参数: 无
返 回: < 0: 操作失败; > 0: 成功写入的字节数
********************************************************************************************/
int WriteCAT1025(HANDLE hFile, DWORD offset, DWORD len, BYTE *sendbuff)
{
DWORD align;
DWORD ret = 0, actlen = 0, writelen;
unsigned char buff[PAGE_SIZE_CAT1025 + 1]; /* 写操作缓冲区 */
if ((len + offset) > 256) return -1; /* 参数检查 */
while(1)
{
if (len > 0)
{
align = offset % PAGE_SIZE_CAT1025;
if (align == 0) /* 当前地址与页对齐 */
{
if (len >= PAGE_SIZE_CAT1025) /* 写入长度大于一页 */
writelen = PAGE_SIZE_CAT1025;
else
writelen = len;
}
else
{
if (len > (PAGE_SIZE_CAT1025 - align)) /* 写入长度大于可写空间 */
writelen = PAGE_SIZE_CAT1025 - align;
else
writelen = len;
}
buff[0] = (BYTE)offset; /* buff[0]为从机子地址 */
memcpy(&buff[1], sendbuff, writelen); /* 复制写入数据到写操作缓冲区 */
/* 执行写 CAT1025 操作 */
::WriteFile(hFile, buff, writelen + 1, &actlen, NULL);
if (actlen < 1) return -1;
Sleep(6); /* 延时6ms以执行内部写操作 */
sendbuff += writelen;
offset += writelen;
actlen = actlen - 1;
ret += actlen; /* 记录已成功写入的字节数 */
len = len - actlen;
}
else
break;
}
return ret; /* 返回实际写入的字节数 */
}
// "写" 按键单击事件代码: 写 CAT1025
void CCAT1025Dlg::OnWriteCat1025()
{
BYTE sendbuff[256], writebyte;
int tmp, writelen;
if (hFile == INVALID_HANDLE_VALUE) /* 检查驱动是否已打开 */
{
MessageBox(_T("IIC驱动未打开!"));
return;
}
UpdateData(TRUE);
if ((m_WriteByte.GetLength() != 2) ||
(_stscanf(m_WriteByte, _T("%x"), &tmp) != 1)) /* 检查输入参数是否正确 */
{
MessageBox(_T("写入字节必须是1个字节的16进制数!"));
return;
}
if ((m_StartAddr > 255) || (m_EndAddr > 255)) /* 检查输入地址是否正确*/
{
MessageBox(_T("起始地址或结束地址错误!"));
return;
}
writebyte = (BYTE)tmp;
writelen = m_EndAddr - m_StartAddr + 1; /* 计算要写入的长度 */
memset(sendbuff, writebyte, writelen); /* 填充发送缓冲区 */
tmp = WriteCAT1025(hFile, m_StartAddr, writelen, sendbuff); /* 将数据写入 CAT1025 */
if (tmp == writelen)
MessageBox(_T("写 CAT1025 成功!"));
else
MessageBox(_T("写 CAT1025 失败!"));
}
// "读" 按键单击事件代码: 读 CAT1025
void CCAT1025Dlg::OnReadCat1025()
{
DWORD i, len;
BYTE recbuf[256];
CString tmp;
if (hFile == INVALID_HANDLE_VALUE) /* 检查驱动是否已打开 */
{
MessageBox(_T("IIC驱动未打开!"));
return;
}
UpdateData(TRUE);
if ((m_StartAddr > 255) || (m_EndAddr > 255)) /* 检查输入参数是否正确 */
{
MessageBox(_T("起始地址或结束地址错误!"));
return;
}
len = m_EndAddr - m_StartAddr + 1; /* 计算要读取的字节数 */
m_strRecDisp = "";
i = ReadCAT1025(hFile, m_StartAddr, len, recbuf); /* 从 CAT1025 读出数据 */
if (i != len)
{
MessageBox(_T("读CAT1025失败!"));
return;
}
for (i = 0; i < len; i++)
{
tmp.Format(_T("%x"), recbuf[i]); /* 格式化读取到的数据为字符串 */
if (recbuf[i] < 0x10)
tmp.Insert(0, _T("0")); /* 加上前缀'0' */
m_strRecDisp += tmp + " ";
}
UpdateData(FALSE); /* 更新显示 */
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -