加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

读取设备信息到文件

发布时间:2020-12-15 18:31:44 所属栏目:百科 来源:网络整理
导读:由于没有设备所以在设备一栏空白,若有设备点击刷新设备就可以选择设备。 目的是从设备的nor flash地址为0000 0000 开始读取0080 0000 即8M的数据到hello.bin文件中。 代码部分: void CDataFromDevDlg::OnReadfile() {// TODO: Add your control notificati

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

目的是从设备的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="rn";
	ByteArray       baAddr;
	ByteArray		baLen;

	BYTE			array1[MAXSIZE] = "xF0x81x00x00x08";
	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,sizeof(temp));
	AddrToCharA(addr,temp);//0x78 0x56 0x34 0x12
	//将地址写入结构中
	memcpy(array1+7,temp,sizeof(temp));//下标7到10,小端传输
//	char * pAdrr = _ltoa((LONG)addr,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,MAXBYTES);
		memcpy(buf,*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,TRUE)))
			{
				MessageBox(_T("命令发送失败!"));
				g_objReader.DisConnect();
				return ;
			}
			
			memset(buf,MAXBYTES);	
			memcpy(buf,*pdwRecvLen-1);//不拷贝校验字节
			
			BYTE len = (BYTE)(dwRecvLen-1);
			CheckData(buf,&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,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,TRUE)))
		{
			MessageBox(_T("命令发送失败!"));
			g_objReader.DisConnect();
			return ;
		}

		memset(buf,MAXBYTES);	
		memcpy(buf,*pdwRecvLen-1);//不拷贝校验字节
		
		BYTE len = (BYTE)(dwRecvLen-1);
		CheckData(buf,&len);
		if ((BYTE)result != *(pbRecv+dwRecvLen-1))//要强制转换下
		{
			AfxMessageBox(_T("校验比对不正确"));
			g_objReader.DisConnect();
			return;
		}

		free(pbRecv);

		file.SeekToEnd();
		file.Write(buf,line.GetLength());
		file.Close();

		SetDlgItemText(IDC_EDIT_ADRRESS,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,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];
	}
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读