读取设备信息到文件

来源:互联网 发布:穆迪下调中国评级知乎 编辑:程序博客网 时间:2024/05/22 14:06

由于没有设备所以在设备一栏空白,若有设备点击刷新设备就可以选择设备。

目的是从设备的nor flash地址为0000 0000 开始读取0080 0000 即8M的数据到hello.bin文件中。

代码部分:

void CDataFromDevDlg::OnReadfile() {// TODO: Add your control notification handler code hereCPCSCReader 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;}CStringstrTemp,strLength;CStringline="\r\n";ByteArray       baAddr;ByteArraybaLen;BYTEarray1[MAXSIZE] = "\xF0\x81\x00\x00\x08";charbuf[MAXBYTES];charzeroArray[]={0};PDWORDpBaLen;PDWORDpBaAddr;CFile file;chartemp[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';//输入地址值00000000GetDlgItemText(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,长度00001000pBaAddr = ((DWORD*)baAddr.GetData());//0x78563412DWORD addr = reverse(*pBaAddr);//0x12345678pBaLen = ((DWORD*)baLen.GetData());//0x00100000DWORD length = reverse(*pBaLen);//大小端转换0x00001000memset(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到10length -= 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 herechar 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("打开或创建文件成功!"));}elseMessageBox(_T("打开文件失败!"));}//地址转换成char数组addr=0x12345678void 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];}}