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

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