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