上位机调试记录之Debug Assertion Failed!

1. Bug现象还原

使用Debug模式调试USB上位机时,出现了下方错误提示,使用Release模式却不会出现!

上位机调试记录之Debug Assertion Failed!_第1张图片

2.问题定位

将下方代码进行屏蔽后,错误提示消失

Display_data_512x8bit(data);

data_receive_512x8bit +=_T("USB接收端点无数据输出!\r\n");

UpdateData(false);

可以猜测变量data_receive_512x8bit是引起报错的原因

void CUSBprojDlg:: Creat_file(UCHAR * data,bool success)
{
	CString str;
	LONG nLen=512;
	CTime t=CTime::GetCurrentTime();
	if(success)
	{
		str=t.Format(_T("D:\\USB_file_recevie\\file_%Y%m%d%H%M%S.hex")); 
		mFile.Open(str,CFile::modeWrite|CFile::modeCreate);         //打开文件
		mFile.SetLength(0);                                          //清空文件
		mFile.SeekToEnd();
		mFile.Write(data,nLen);	
		mFile.Flush();//强制将缓冲区数据写入磁盘文件						
		mFile.Close();//关闭文件
		//Display_data_512x8bit(data);
		str=t.Format(_T("Saved to file_%Y%m%d%H%M%S.hex"));
		SetDlgItemText(IDC_DATAIN,str);	 
		
	}
	else
	{
		//data_receive_512x8bit +=_T("USB接收端点无数据输出!\r\n");
		SetDlgItemText(IDC_DATAIN,_T("请先向FPGA发送数据!"));
		//UpdateData(false);
	}
}

data_receive_512x8bit为一CString全局Public变量,用于显示接收的512字节数据,与之相关的代码如下,在界面显示时使用UpdateData(false)来刷新。

CString data_receive_512x8bit;

	
DDX_Text(pDX, IDC_data_receive_display, data_receive_512x8bit);

data_receive_512x8bit +=_T("USB接收端点无数据输出!\r\n");
SetDlgItemText(IDC_DATAIN,_T("请先向FPGA发送数据!"));
UpdateData(false);
void CUSBprojDlg::Display_data_512x8bit(UCHAR * data_512)
{
	int i=0;
	int j=0;
	int line=1;
	CString str=_T("512x8bit data receive from USB: \r\nline00:  ");
	CString tmp_str=_T("");

	for(i=0;i<512;i++)
	{
	tmp_str.Format(_T("%02X"),data_512[i]);
	tmp_str+=_T(" ");
	str+=tmp_str;
	if((j!=0)&&(j!=511)&&((j+1)%16==0)) 
	{
		str+=_T(" \r\n");
		tmp_str.Format(_T("line%02d:  "),line);
		str+=tmp_str;
		line++;
	}
	j++;
	
	}
	data_receive_512x8bit =str;
	data_receive_512x8bit +=_T(" \r\n \r\n");
    UpdateData(false);
}

3. 解决思路

去掉全局变量data_receive_512x8bit,直接使用函数SetDlgItemTextW()对文本控件IDC_data_receive_display进行操作,

代码修改方法如下:

SetDlgItemTextW(IDC_data_receive_display,data_receive_512x8bit);
void CUSBprojDlg::Display_data_512x8bit(UCHAR * data_512)
{
	int i=0;
	int j=0;
	int line=1;
	CTime t=CTime::GetCurrentTime();
	CString str=_T("512x8bit data receive from USB: \r\nline00:  ");
	CString tmp_str=_T("");

	for(i=0;i<512;i++)
	{
		tmp_str.Format(_T("%02X "),data_512[i]);	
		str+=tmp_str;
		if((j!=0)&&(j!=511)&&((j+1)%16==0)) 
		{
			str+=_T(" \r\n");
			tmp_str.Format(_T("line%02d:  "),line);
			str+=tmp_str;
			line++;
		}
		j++;
	}
	data_receive_512x8bit =str;
	data_receive_512x8bit +=_T(" \r\n \r\n");
	data_receive_512x8bit +=t.Format(_T("Saved to D:\\USB_file_recevie\\file_%Y%m%d%H%M%S.hex!\r\n"));
	SetDlgItemTextW(IDC_data_receive_display,data_receive_512x8bit);  
}

4. 参考:

[1] File: f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\winocc.cpp的子窗口初始化问题 - xiaoshengforever的专栏 - CSDN博客
https://blog.csdn.net/xiaoshengforever/article/details/11882027

你可能感兴趣的:(Debug,Assertion,Failed,MFC)