天天看點

上位機調試記錄之Debug Assertion Failed!

1. Bug現象還原

使用Debug模式調試USB上位機時,出現了下方錯誤提示,使用Release模式卻不會出現!

上位機調試記錄之Debug Assertion Failed!

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