⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dlgcat1025.cpp

📁 周立功WinCE光盘资料
💻 CPP
字号:
// DLGCAT1025.cpp : implementation file
//

#include "stdafx.h"
#include "Magic2410.h"
#include "DLGCAT1025.h"
#include "I2C.h"

#define I2C_ADDR_1025			 0xA0		 /* CAT1025 的I2C地址 */
#define PAGE_SIZE_CAT1025	 16			 /* CAT1025 的页面大小:16字节 */

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

extern CRITICAL_SECTION critical_section_iic;
	HANDLE hFileIIC;
	HANDLE m_hFileGpio;
/////////////////////////////////////////////////////////////////////////////
// DLGCAT1025 dialog


DLGCAT1025::DLGCAT1025(CWnd* pParent /*=NULL*/)
	: CDialog(DLGCAT1025::IDD, pParent)
{
	//{{AFX_DATA_INIT(DLGCAT1025)
	m_WriteByte = _T("");
	m_strRecDisp = _T("");
	m_StartAddr = 0;
	m_EndAddr = 0;
	//}}AFX_DATA_INIT
}


void DLGCAT1025::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(DLGCAT1025)
	DDX_Text(pDX, IDC_WRITE_BYTE, m_WriteByte);
	DDX_Text(pDX, IDC_REC_DISP, m_strRecDisp);
	DDX_Text(pDX, IDC_START_ADDR, m_StartAddr);
	DDX_Text(pDX, IDC_END_ADDR, m_EndAddr);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(DLGCAT1025, CDialog)
	//{{AFX_MSG_MAP(DLGCAT1025)
	ON_WM_DESTROY()
	ON_BN_CLICKED(IDC_READ_CAT1025, OnReadCat1025)
	ON_BN_CLICKED(IDC_WRITE_CAT1025, OnWriteCat1025)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// DLGCAT1025 message handlers

void DLGCAT1025::OnDestroy() 
{
	CDialog::OnDestroy();
	
	// TODO: Add your message handler code here
	if (hFileIIC != NULL)
	{
		CloseHandle(hFileIIC);
		hFileIIC = NULL;
	}	
}

/*******************************************************************************************
函数名称: ReadCAT1025
描    述: 从 CAT1025 读取数据
输入参数: HANDLE hFile: 驱动程序文件句柄
		  DWORD offset: 从机子地址
		  DWORD len   : 要读取的字节长度
输出参数: recbuff : 接收缓冲区
返    回: < 0: 操作失败;   > 0: 成功读取的字节数  
********************************************************************************************/
int DLGCAT1025::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 DLGCAT1025::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 DLGCAT1025::OnReadCat1025() 
{
	// TODO: Add your control notification handler code here
	DWORD i, len;
	BYTE recbuf[256];
	BYTE I2cSla = I2C_ADDR_1025;
	CString tmp;
	BOOL ret;

	if (hFileIIC == NULL)									/* 检查驱动是否已打开 */
	{
		MessageBox(_T("IIC驱动未打开!"));
		return;
	}
	
	// 设置 I2C 从机器件地址
	EnterCriticalSection(&critical_section_iic);
	ret = ::DeviceIoControl(hFileIIC, IOCTL_SET_I2C_SLAVE, &I2cSla, 1, NULL, 0, NULL, NULL);
	if (ret != TRUE)
	{
		CloseHandle(hFileIIC);
		hFileIIC = NULL;
		MessageBox(_T("Set I2C slave address fail!"));
		return;
	}

	UpdateData(TRUE);
	if ((m_StartAddr > 255) || (m_EndAddr > 255))		/* 检查输入参数是否正确 */
	{
		MessageBox(_T("起始地址或结束地址错误!"));
		return;
	}
	len = m_EndAddr - m_StartAddr + 1;					/* 计算要读取的字节数 */

	m_strRecDisp = "";
	i = ReadCAT1025(hFileIIC, m_StartAddr, len, recbuf);	/* 从 CAT1025 读出数据 */
	LeaveCriticalSection(&critical_section_iic);
	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);									/* 更新显示 */
}

// "写" 按键单击事件代码: 写 CAT1025
void DLGCAT1025::OnWriteCat1025() 
{
	// TODO: Add your control notification handler code here
	BYTE sendbuff[256], writebyte;
	int tmp, writelen;
	BYTE I2cSla = I2C_ADDR_1025;
	BOOL ret;

	if (hFileIIC == NULL)											/* 检查驱动是否已打开 */
	{
		MessageBox(_T("IIC驱动未打开!"));
		return;
	}

	// 设置 I2C 从机器件地址
	EnterCriticalSection(&critical_section_iic);
	ret = ::DeviceIoControl(hFileIIC, IOCTL_SET_I2C_SLAVE, &I2cSla, 1, NULL, 0, NULL, NULL);
	if (ret != TRUE)
	{
		CloseHandle(hFileIIC);
		hFileIIC = NULL;
		MessageBox(_T("Set I2C slave address fail!"));
		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(hFileIIC, m_StartAddr, writelen, sendbuff); /* 将数据写入 CAT1025 */
	LeaveCriticalSection(&critical_section_iic);

	if (tmp == writelen)
		MessageBox(_T("写 CAT1025 成功!"));
	else
		MessageBox(_T("写 CAT1025 失败!"));
}

BOOL DLGCAT1025::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
		// TODO: Add extra initialization here
	m_StartAddr = 0;			    // 起始地址
	m_EndAddr = 255;				// 结束地址
	m_WriteByte = "AA";				// 写入字节
	UpdateData(FALSE);				// 更新显示

	BYTE I2cSla = I2C_ADDR_1025;

	// 打开 IIC 驱动
	hFileIIC = CreateFile(TEXT("IIC1:"), GENERIC_READ | GENERIC_WRITE, 0, 
							NULL, OPEN_EXISTING, 0, 0);
	if (hFileIIC == INVALID_HANDLE_VALUE)
	{
		MessageBox(_T("Cannot Open IIC1!"));
		return FALSE;
	}
		//MessageBox(_T("Open IIC1 sucessed!"));
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -