由于没有设备所以在设备一栏空白,若有设备点击刷新设备就可以选择设备。
目的是从设备的nor flash地址为0000 0000 开始读取0080 0000 即8M的数据到hello.bin文件中。
代码部分:
void CDataFromDevDlg::OnReadfile()
{
// TODO: Add your control notification handler code here
CPCSCReader g_objReader;
//连接设备
CString strTemp1;
GetDlgItemText(IDC_COMBO_DEV_FORMAT,strTemp1);
if (strTemp1.IsEmpty())
{
AfxMessageBox(_T("没有找到的设备!"));
return;
}
if (!g_objReader.Init(strTemp1))
{
AfxMessageBox(_T("初始化设备失败!"));
return;
}
if (!g_objReader.Connect(TRUE))
{
AfxMessageBox(_T("连接设备失败!"));
return;
}
CString strTemp,strLength;
CString line="\r\n";
ByteArray baAddr;
ByteArray baLen;
BYTE array1[MAXSIZE] = "\xF0\x81\x00\x00\x08";
char buf[MAXBYTES];
char zeroArray[]={0};
PDWORD pBaLen;
PDWORD pBaAddr;
CFile file;
char temp[4];
LPBYTE pcCmdHead = array1;
DWORD dwDataLen = (DWORD)13;
LPBYTE pbRecv;
LPDWORD pdwRecvLen;
DWORD dwRecvLen;
LPWORD pwSW;
WORD sW;
array1[5] = '\x00';
array1[6] = '\x00';
array1[12] = '\x00';
//输入地址值00000000
GetDlgItemText(IDC_EDIT_ADRRESS,strTemp);
GetDlgItemText(IDC_EDIT_LENGTH,strLength);
StrToHex(strTemp.GetBuffer(0),strTemp.GetLength(),baAddr);
StrToHex(strLength.GetBuffer(0),strLength.GetLength(),baLen);
if (strTemp.GetLength() != 8)
{
MessageBox(_T("请输入四个字节的正确地址"));
return;
}
if (strLength.GetLength() != 8)
{
MessageBox(_T("请输入四个字节的正确地址"));
return;
}
// int len = baLen.GetSize();//4个字节
//大小端搞错了
// for (int i = 0; i < baAddr.GetSize(); i++)
// {
// array[i+2] = *((BYTE*)(baAddr.GetData()+i));
// }
//输入地址12345678,长度00001000
pBaAddr = ((DWORD*)baAddr.GetData());//0x78563412
DWORD addr = reverse(*pBaAddr);//0x12345678
pBaLen = ((DWORD*)baLen.GetData());//0x00100000
DWORD length = reverse(*pBaLen);//大小端转换0x00001000
memset(temp,0,sizeof(temp));
AddrToCharA(addr,temp);//0x78 0x56 0x34 0x12
//将地址写入结构中
memcpy(array1+7,temp,sizeof(temp));//下标7到10,小端传输
// char * pAdrr = _ltoa((LONG)addr,temp,2);
if (length>0xFFFFFFFF || length < 0x00000000)
{
AfxMessageBox(_T("长度不合法"));
return;
}
if(length <= 0x000000FD)
{
file.Open(filename,CFile::modeCreate |CFile::modeWrite|CFile::modeNoTruncate);
dwRecvLen = (DWORD)MAXBYTES;
sW = (WORD)0;
char result = 0x00;
pbRecv = (BYTE*) malloc(dwRecvLen*sizeof(BYTE));
pdwRecvLen = &dwRecvLen;
pwSW = &sW;
array1[11] = length;
if(!(g_objReader.SendCommandI(pcCmdHead,dwDataLen,pbRecv,pdwRecvLen,pwSW,TRUE)))
{
MessageBox(_T("命令发送失败!"));
g_objReader.DisConnect();
return ;
}
//
// if(!file.Open(filename,CFile::modeReadWrite))
// {
// file.Open(filename,CFile::modeCreate|CFile::modeReadWrite);
// }
/
//向文件中写数据
memset(buf,0,MAXBYTES);
memcpy(buf,pbRecv,*pdwRecvLen-1);//不拷贝校验字节
BYTE len = (BYTE)(dwRecvLen-1);
CheckData(buf,&result,&len);
if ((BYTE)result != *(pbRecv+dwRecvLen-1))//要强制转换下
{
AfxMessageBox(_T("校验比对不正确"));
g_objReader.DisConnect();
return;
}
free(pbRecv);
file.SeekToEnd();
file.Write(buf,*pdwRecvLen-1);
file.Write(line,line.GetLength());
file.Close();
SetDlgItemText(IDC_EDIT_ADRRESS,zeroArray);
SetDlgItemText(IDC_EDIT_LENGTH,zeroArray);
MessageBox(_T("读取成功!"));
if (!g_objReader.DisConnect())
{
MessageBox(_T("断开连接失败!"));
return;
}
}
else
{
file.Open(filename,CFile::modeCreate |CFile::modeWrite|CFile::modeNoTruncate);
while(length > 0x000000FD)
{
dwRecvLen = (DWORD)MAXBYTES;
sW = (WORD)0;
char result = 0x00;
pbRecv = (BYTE*) malloc(dwRecvLen*sizeof(BYTE));
pdwRecvLen = &dwRecvLen;
pwSW = &sW;
array1[11] = 0x000000FD;
if(!(g_objReader.SendCommandI(pcCmdHead,dwDataLen,pbRecv,pdwRecvLen,pwSW,TRUE)))
{
MessageBox(_T("命令发送失败!"));
g_objReader.DisConnect();
return ;
}
memset(buf,0,MAXBYTES);
memcpy(buf,pbRecv,*pdwRecvLen-1);//不拷贝校验字节
BYTE len = (BYTE)(dwRecvLen-1);
CheckData(buf,&result,&len);
if ((BYTE)result != *(pbRecv+dwRecvLen-1))//要强制转换下
{
AfxMessageBox(_T("校验比对不正确"));
g_objReader.DisConnect();
return;
}
free(pbRecv);
file.SeekToEnd();
file.Write(buf,*pdwRecvLen-1);
addr += 0x000000FD;
AddrToCharA(addr,temp);
memcpy(array1+7,temp,sizeof(temp));//下标7到10
length -= 0x000000FD;
}
dwRecvLen = (DWORD)MAXBYTES;
sW = (WORD)0;
char result = 0x00;
pbRecv = (BYTE*) malloc(dwRecvLen*sizeof(BYTE));
pdwRecvLen = &dwRecvLen;
pwSW = &sW;
array1[11] = length;
if(!(g_objReader.SendCommandI(pcCmdHead,dwDataLen,pbRecv,pdwRecvLen,pwSW,TRUE)))
{
MessageBox(_T("命令发送失败!"));
g_objReader.DisConnect();
return ;
}
memset(buf,0,MAXBYTES);
memcpy(buf,pbRecv,*pdwRecvLen-1);//不拷贝校验字节
BYTE len = (BYTE)(dwRecvLen-1);
CheckData(buf,&result,&len);
if ((BYTE)result != *(pbRecv+dwRecvLen-1))//要强制转换下
{
AfxMessageBox(_T("校验比对不正确"));
g_objReader.DisConnect();
return;
}
free(pbRecv);
file.SeekToEnd();
file.Write(buf,*pdwRecvLen-1);
file.Write(line,line.GetLength());
file.Close();
SetDlgItemText(IDC_EDIT_ADRRESS,zeroArray);
SetDlgItemText(IDC_EDIT_LENGTH,zeroArray);
MessageBox(_T("读取成功!"));
if (!g_objReader.DisConnect())
{
MessageBox(_T("命令发送失败!"));
return;
}
}
}
//打开文件
void CDataFromDevDlg::OnSelectfile()
{
// TODO: Add your control notification handler code here
char filter[] = "文本 (*.txt)|*.txt|All Files (*.*)|*.*||";
CFileDialog fdlg(true,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,filter);
fdlg.m_ofn.lpstrInitialDir = "c:\\";
if (fdlg.DoModal() == IDOK)
{
filename = fdlg.GetFileName();
//打开和创建filename文件
CFile f(filename,CFile::modeCreate | CFile :: modeReadWrite);
SetDlgItemText(IDC_EDIT_FILE_PATH,filename);
// MessageBox(_T("打开或创建文件成功!"));
}
else
MessageBox(_T("打开文件失败!"));
}
//地址转换成char数组addr=0x12345678
void CDataFromDevDlg:: AddrToCharA(DWORD addr,char str[])
{
// char str[5];
str[0] = (BYTE)((0x000000FF & addr));
str[1] = (BYTE)((0x0000FF00 & addr) >> 8);
str[2] = (BYTE)((0x00FF0000 & addr) >> 16);
str[3] = (BYTE)((0xFF000000 & addr) >> 24);
// return str;
}
//异或校验
void CDataFromDevDlg:: CheckData(char array[],char * result,BYTE * len)
{
*result = array[0];
for ( int i = 1; i < (*len); i++)//长度有问题
{
*result ^= array[i];
}
}