父窗口是 ETXTV23Dlg.cpp和ETXTV23Dlg.h
子窗口是 Tab_Data_DCData.cpp和Tab_Data_DCData.h
父窗口里有个函数
void CETXTV23Dlg::MSCommSend(unsigned char * data, unsigned int len)
{
CByteArray array; //定义一个字节集
array.RemoveAll(); //清空数组
if (0 != len)
{
array.SetSize(len); //设定数组长度
//将发送数据写入到临时数组
for (UINT i = 0; i < len; i++)
{
array.SetAt(i, *data++);
}
//调用mscomm发送数据,COleVariant类自查百度吧
m_MsComm.put_Output(COleVariant(array));
}
}
在子窗口里有个按钮要调用这个串口发动函数
void Tab_Data_DCData::OnBnClickedButtonMcutopc()//从终端读取数据
{
// TODO: 在此添加控件通知处理程序代码
CETXTV23Dlg *pDlg = (CETXTV23Dlg*)this->GetParent();
int i=0;
sendBuf1[i++] = 1;
sendBuf1[i++] = 2;
sendBuf1[i++] = 3;
sendBuf1[i++] = 4;
sendBuf1[i++] = 5;
sendBuf1[i++] = 6;
sendBuf1[i++] = 7;
sendBuf1[i++] = 8;
pDlg->MSCommSend(sendBuf1,8);
}
这样编译能通过 运行到这报错,大虾帮我看看
根据您提供的错误信息,可以看出是由于子窗口调用父窗口的函数时,无法找到父窗口指针而导致的错误。这可能是因为您的子窗口并没有正确获取父窗口指针。
在您的代码中,您使用了以下代码来获取父窗口指针:
CETXTV23Dlg *pDlg = (CETXTV23Dlg*)this->GetParent();
这个方法是获取当前窗口的父窗口指针。但是,如果当前窗口并不是直接嵌套在父窗口中,而是通过其他窗口嵌套进来的,那么这个方法可能会返回一个错误的指针。
为了解决这个问题,您可以尝试使用以下方法来获取父窗口指针:
CETXTV23Dlg *pDlg = (CETXTV23Dlg*)AfxGetMainWnd();
这个方法可以获取主窗口的指针,即您的父窗口的指针。请尝试修改您的代码并使用这个方法来获取父窗口指针,并重新编译和运行程序。如果问题仍然存在,请提供更多的错误信息以便我们更好地帮助您解决问题。
引用gpt
该回答引用ChatGPT
这个错误通常是由访问无效的指针或释放已经被释放的内存等问题引起的。在这个特定的情况下,可能是由于在调用 MSCommSend 函数时使用了无效的指针。
可以尝试添加一些调试信息来定位问题。例如,在 OnBnClickedButtonMcutopc 函数中,可以添加一些打印语句来检查变量的值是否正确。例如:
void Tab_Data_DCData::OnBnClickedButtonMcutopc()//从终端读取数据
{
// TODO: 在此添加控件通知处理程序代码
CETXTV23Dlg *pDlg = (CETXTV23Dlg*)this->GetParent();
int i=0;
sendBuf1[i++] = 1;
sendBuf1[i++] = 2;
sendBuf1[i++] = 3;
sendBuf1[i++] = 4;
sendBuf1[i++] = 5;
sendBuf1[i++] = 6;
sendBuf1[i++] = 7;
sendBuf1[i++] = 8;
TRACE("sendBuf1: ");
for (int j = 0; j < 8; j++) {
TRACE("%d ", sendBuf1[j]);
}
TRACE("\n");
pDlg->MSCommSend(sendBuf1,8);
}
这将在输出窗口中打印出 sendBuf1 的值,以便检查是否正确。
如果问题仍然存在,建议使用调试器进行调试,查看哪个指针或内存访问引起了异常。
以下答案基于ChatGPT与GISer Liu编写:
根据您提供的信息,我无法确定问题的具体原因。但是,根据您提供的错误信息和代码,我可以给出以下几点建议供您参考:
检查指针是否为空:在子窗口里调用父窗口的函数时,需要先确保父窗口的指针是有效的,否则会导致访问冲突。您可以在子窗口的代码中添加断点,然后逐步调试,查看父窗口的指针是否为空。
检查数组长度是否正确:在调用MSCommSend函数时,需要传递正确的数组长度。您可以在子窗口的代码中添加断点,然后逐步调试,查看数组长度是否正确。
检查串口参数是否正确:在调用MSCommSend函数时,需要确保串口参数设置正确。您可以在父窗口的代码中添加调试输出,查看串口参数是否正确。
检查其他可能的错误:除了上述问题外,还有可能存在其他问题,如内存泄漏、类型不匹配等。您可以在代码中添加调试输出,逐步排查问题所在。
希望这些建议能够帮助您解决问题。如果您仍然遇到困难,请提供更多的信息,我将尽力帮助您。
参考GPT和自己的思路,根据您提供的代码和错误提示,很可能是因为在子窗口的 OnBnClickedButtonMcutopc() 函数中使用了一个未初始化的数组 sendBuf1,导致访问内存时发生了冲突。您可以在子窗口的头文件 Tab_Data_DCData.h 中定义该数组:
#define SEND_BUF_SIZE 8 //定义数组长度为8
class Tab_Data_DCData : public CDialogEx
{
// ...
private:
unsigned char sendBuf1[SEND_BUF_SIZE]; //声明数组
};
然后在函数中初始化数组,可以使用以下方式:
void Tab_Data_DCData::OnBnClickedButtonMcutopc() //从终端读取数据
{
// TODO: 在此添加控件通知处理程序代码
CETXTV23Dlg* pDlg = (CETXTV23Dlg*)this->GetParent();
int i = 0;
memset(sendBuf1, 0, SEND_BUF_SIZE); //将数组初始化为0
sendBuf1[i++] = 1;
sendBuf1[i++] = 2;
sendBuf1[i++] = 3;
sendBuf1[i++] = 4;
sendBuf1[i++] = 5;
sendBuf1[i++] = 6;
sendBuf1[i++] = 7;
sendBuf1[i++] = 8;
pDlg->MSCommSend(sendBuf1, 8);
}
另外,也需要确认在父窗口中是否正确实例化了子窗口,并将其添加到了父窗口中。
不知道你这个问题是否已经解决, 如果还没有解决的话: