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

📄 sdexampledlg.cpp

📁 周立功基础实验教程二中的ucos综合操作实验,这是其中的读写U盘扇区实验的源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/***********************************************************************
** 函数名称:  int SD_EraseBlock()		
** 功能描述:  命令下位机,将 blockaddr 开始的 num 块擦除								
** 输   入:  UINT32 blockaddr: 块地址
			  UINT32 num:		擦除的块数量		
** 输   出:  0:   正确    0xFF: 通信错误   > 0: 错误码	  		
***********************************************************************/
int SD_EraseBlock(UINT32 blockaddr, UINT32 num)
{
	BYTE sendBuf[UART_BUFF_LEN];
	
	sendBuf[0] = CMD_SD_ERASE;						//擦除命令
	sendBuf[1] = (BYTE)(blockaddr >> 24);				//块地址
	sendBuf[2] = (BYTE)(blockaddr >> 16);
	sendBuf[3] = (BYTE)(blockaddr >> 8);
	sendBuf[4] = (BYTE)blockaddr;
	
	//块数量
	sendBuf[5] = (BYTE)(num >> 16);
	sendBuf[6] = (BYTE)(num >> 8);
	sendBuf[7] = (BYTE)num;
	
	int ret;
	ret = Comm.SendData(sendBuf, NULL, UART_BUFF_LEN, 1000, 1, 0, FALSE);	
	if (ret != 0)  return ERROR_COMM;
	
	ret = Comm.ReadBlock(sendBuf, 8, 5000);
	if (ret != 0)								return ERROR_COMM;		//接收错误
	if (sendBuf[0] != CMD_SD_ERASE)				return ERROR_COMM;		//响应错误
	if (sendBuf[1] != 0)						return sendBuf[1];		//擦除操作错误
	
	return 0;
}

/***********************************************************************
** 函数名称:  int WriteSDBuffer()		
** 功能描述:  发送长度为 len 的数据 psend 到下位机的 sd_buf 中								
** 输   入:  int len     :  长度
			  BYTE *psend :  数据, 长度为len	
** 输   出:  0:   正确    < 0:   通信错误		  		
***********************************************************************/
int WriteSDBuffer(int len, BYTE *psend)
{	
	unsigned char sendBuf[UART_BUFF_LEN];
	
	int i,j,k;
	int ret;
	int offset = 0;
	
	i = len / FRAME_LEN_SEND;								//计算有多少个整数包(每包64字节)
	j = len % FRAME_LEN_SEND;								//剩余包数
	
	for (k = 0; k < i; k++)
	{
		sendBuf[0] = CMD_DATA_TRANS;						//命令
		sendBuf[1] = offset / 256;							//下位机接收缓冲区偏移offset
		sendBuf[2] = offset % 256;
		memcpy(&sendBuf[3], psend, FRAME_LEN_SEND);

		ret = Comm.SendData(sendBuf, NULL, UART_BUFF_LEN, 500, 1, 0, FALSE);
		if (ret != 0)
			return -1;
		
		ret = Comm.ReadBlock(sendBuf, 8, 500);
		if (ret != 0)								return -1;			//接收错误
		if (sendBuf[0] != CMD_DATA_TRANS)			return -1;			//响应错误
		
		psend = psend + FRAME_LEN_SEND;			
		offset = offset + FRAME_LEN_SEND;
	}
	
	if (j != 0)		
	{	
		sendBuf[0] = CMD_DATA_TRANS;									//命令
		sendBuf[1] = offset / 256;										//下位机接收缓冲区偏移offset
		sendBuf[2] = offset % 256;
		memcpy(&sendBuf[3], psend, j);
		
		ret = Comm.SendData(sendBuf, NULL, UART_BUFF_LEN, 500, 1, 0, FALSE);
		if (ret != 0)
			return -1;
		
		ret = Comm.ReadBlock(sendBuf, 8, 500);
		if (ret != 0)								return -1;			//接收错误
		if (sendBuf[0] != CMD_DATA_TRANS)			return -1;			//响应错误
	}
	
	return 0;		//正确
}

/***********************************************************************
** 函数名称:  int ReadSDBuffer()		
** 功能描述:  将下位机的 sd_buf 中的数据读上来, 放入 prec 中								
** 输   入:  int len     :  长度
			  BYTE *psend :  数据, 长度为len	
** 输   出:  0:   正确    < 0:   通信错误	  		
***********************************************************************/
int ReadSDBuffer(int len, BYTE *prec)
{
	unsigned char sendBuf[UART_BUFF_LEN];
	
	int i,j,k;
	int ret;
	int offset = 0;
	
	i = len / FRAME_LEN_RECV;								//计算有多少个整数包(每包64字节)
	j = len % FRAME_LEN_RECV;								//剩余包数
	
	for (k = 0; k < i; k++)
	{
		sendBuf[0] = CMD_DATA_RECV;							//命令
		sendBuf[1] = offset / 256;							//下位机接收缓冲区偏移offset
		sendBuf[2] = offset % 256;

		ret = Comm.SendData(sendBuf, NULL, UART_BUFF_LEN, 500, 1, 0, FALSE);
		if (ret != 0)
			return -1;
		
		ret = Comm.ReadBlock(sendBuf, 8, 500);
		if (ret != 0)								return -1;			//接收错误
		if (sendBuf[0] != CMD_DATA_RECV)			return -1;			//响应错误
		
		memcpy(prec, &sendBuf[1], FRAME_LEN_RECV);
		prec = prec + FRAME_LEN_RECV;			
		offset = offset + FRAME_LEN_RECV;
	}
	
	if (j != 0)		
	{	
		sendBuf[0] = CMD_DATA_RECV;									//命令
		sendBuf[1] = offset / 256;							//下位机接收缓冲区偏移offset
		sendBuf[2] = offset % 256;
		
		ret = Comm.SendData(sendBuf, NULL, UART_BUFF_LEN, 500, 1, 0, FALSE);
		if (ret != 0)
			return -1;
		
		ret = Comm.ReadBlock(sendBuf, 8, 500);
		if (ret != 0)								return -1;			//接收错误
		if (sendBuf[0] != CMD_DATA_RECV)			return -1;			//响应错误
		memcpy(prec, &sendBuf[1], j);	
	}
	
	return 0;		//正确
}



/***********************************************************************
** 函数名称:  OnOpenComm()		
** 功能描述:  打开串口							
** 输   入:  无	
** 输   出:  无		  		
***********************************************************************/
void CSDExampleDlg::OnOpenComm() 
{
	int ret;
	BOOL bret;

	int comnum = 0;
	comnum = m_SelComm.GetCurSel() + 1;
	
	Comm.ClosePort();
	bret = Comm.SetCommPort(comnum);							//设置串口号
	if (bret == FALSE)
	{
		MessageBox("打开串口失败!");
		return;
	}

	UINT32 baudtable[5] = {9600, 19200, 38400, 57600, 115200};
	UINT32 baudvalue = baudtable[m_SelBaud.GetCurSel()];
	
	bret = Comm.SetCommBaud(baudvalue);					     //设置波特率		
	if (bret == FALSE)
	{
		MessageBox("设置波特率失败!");
		return;
	}

	ret = Comm.OpenPort();									  //打开串口
	if (bret == 0)
	{
		MessageBox("打开串口失败!");
		return;
	}

	/* 下面尝试连接LPC2200 */
	BYTE sendbuff[8] = {0x77,0x88,0x99,0xAA,0xBB,0xCC,0xEE,0xFF};
	ret = Comm.SendData(sendbuff, NULL, 8, 500, 1, 0, FALSE);  //发送数据
	if (ret != 0)
	{
		MessageBox("与LPC2200 连接失败,请检查硬件!");
		m_DispResult = "与LPC2200 通信失败!";
		UpdateData(FALSE);
		return;
	}
	
	BYTE recbuf[8] = {0,0,0,0,0,0,0,0};
	ret = Comm.ReadBlock(recbuf, 8, 500);					   //读出数据
	if (ret != 0)
	{
		MessageBox("与LPC2200 连接失败,请检查硬件连接、串口号、波特率!");
		m_DispResult = "与LPC2200 通信失败!";
		UpdateData(FALSE);
		return;
	}

	if (memcmp(sendbuff,recbuf,8)!=0)						//判断收到的数据是否成功
	{	
		MessageBox("连接失败,请检查波特率!");
		m_DispResult = "与LPC2200 通信失败!";
		UpdateData(FALSE);
		return;
	}
	
	/* 执行到此,说明连接成功 */
	m_DispResult = "与LPC2200 通信成功!";
	UpdateData(FALSE);

	m_InitSD.EnableWindow(TRUE);
}

/***********************************************************************
** 函数名称:  OnReadBlock()		
** 功能描述:  读U盘的一个块						
** 输   入:  无	
** 输   出:  无		  		
***********************************************************************/
void CSDExampleDlg::OnReadBlock() 
{
	int ret;
	BYTE recbuff[512];
	CString strError;

	UpdateData(TRUE);
	if (m_BlockAddr > 8388608)
	{
		MessageBox("U盘最多块为8388608");
		m_DispResult = "输入参数有错!操作没执行";
		UpdateData(FALSE);
		return;
	}

	ret = SD_ReadBlock(m_BlockAddr);		/* 命令下位机,读U盘的m_BlockAddr块到sd_buf中 */
	if (ret == ERROR_COMM)
	{
		m_DispResult = "通信错误!";
		UpdateData(FALSE);
		return;
	}

	if (ret != 0)
	{
		m_DispResult = "U盘读单块失败,错误码为:" + IntToASCII(ret);
		UpdateData(FALSE);
		return;
	}	

	ret = ReadSDBuffer(512, recbuff);		/* 将下位机读到的数据sd_buf传输到PC机 */
	if (ret != 0)
	{
		m_DispResult = "通信错误!";
		UpdateData(FALSE);
		return;
	}	
	
	m_Edit.SetData(recbuff, 512);			/* 显示出来 */
	
	m_DispResult = "U盘读单块成功!";
	UpdateData(FALSE);
}

/***********************************************************************
** 函数名称:  OnWriteBlock()		
** 功能描述:  写U盘的一个块						
** 输   入:  无	
** 输   出:  无		  		
***********************************************************************/
void CSDExampleDlg::OnWriteBlock() 
{
	BYTE sendbuf[512];
	int ret;
	CString strError;

	UpdateData(TRUE);
	if (m_BlockAddr > 8388608)
	{
		MessageBox("U盘最多块为8388608");
		m_DispResult = "输入参数有错!,操作没有执行";
		UpdateData(FALSE);
		return;
	}
	
	m_Edit.GetData(sendbuf, 512);

	ret = WriteSDBuffer(512, sendbuf);		/* 发送数据到下位机的 sd_buf */
	if (ret != 0)
	{
		m_DispResult = "通信错误!";
		UpdateData(FALSE);
		return;
	}	

	ret = SD_WriteBlock(m_BlockAddr);					/* 将下位机sd_buf中的数据写入U盘 */
	if (ret == ERROR_COMM)
	{
		m_DispResult = "通信错误!";
		UpdateData(FALSE);
		return;
	}

	if (ret != 0)
	{
		m_DispResult = "U盘写单块失败,错误码为:" + IntToASCII(ret);
		UpdateData(FALSE);
		return;
	}

	m_DispResult = "U盘写单块成功!";
	UpdateData(FALSE);
	Sleep(1);	
}

/***********************************************************************
** 函数名称:  OnErase()		
** 功能描述:  擦除块操作						
** 输   入:  无	
** 输   出:  无		  		
***********************************************************************/
void CSDExampleDlg::OnErase() 
{
	CEraseBlkDlg  EraseDlg;
	CString strError;
	
	EraseDlg.DoModal();
	if (EraseDlg.bOK == TRUE)
	{	
		if ((EraseDlg.m_StartAddr + EraseDlg.m_BlkNum) > 8388608)
		{																//参数错误
			MessageBox("U盘最多块为8388608");
			m_DispResult = "输入参数有错!操作没执行";
			UpdateData(FALSE);
			return;
		}

		if (EraseDlg.m_BlkNum > 5000)
		{
			m_DispResult = "块数多于5000!操作无执行!";
			UpdateData(FALSE);
			return;		
		}
			
		/* 命令擦除块 */
		int ret = SD_EraseBlock(EraseDlg.m_StartAddr, EraseDlg.m_BlkNum);
		if (ret == ERROR_COMM)
		{
			m_DispResult = "通信错误!";
			UpdateData(FALSE);
			return;
		}

		if (ret != 0)
		{	
			m_DispResult = "U盘擦除失败,错误码为:" + IntToASCII(ret);
			UpdateData(FALSE);
			return;	
		}
	
		m_DispResult = "U盘擦除成功!";
		UpdateData(FALSE);
	}
	else
	{
		m_DispResult = "擦除操作已取消";
		UpdateData(FALSE);
	}
}

⌨️ 快捷键说明

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