由于没有设备所以在设备一栏空白,若有设备点击刷新设备就可以选择设备。
目的是从设备的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]; } }