📄 sdexampledlg.cpp
字号:
/***********************************************************************
** 函数名称: 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 + -