CSerialPort问题:一个对话框怎么调用另一个对话框里的写串口函数?

网安驿站 2017-02-23 09:50:33
我做了一个MFC工程,其中包含多个按钮弹出对话框。我把CSerialPort类在其中一个对话框里:
创建对象CSerialPort m_Port;
并加入串口数据接收响应函数afx_msg LONG OnCommunication(WPARAM ch, LPARAM port);
现在,我需要在另一个对话框里完成对串口的写操作,使用的是m_Port.WriteToPort(strdata, strlen);可是总是出错?请问前辈们是什么原因出错?怎么入手解决?万分感谢!
下图为报错情况:
...全文
597 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_36634306 2017-03-21
  • 打赏
  • 举报
回复
你new的Mainfram 是不是你程序运行的那个Mainfram指针,你要用AfxGetMainWnd()得到。 如果是两个对话框直接用FindWindow得到串口窗口的句柄,然后fromhandle得到对象指针。
摩登码农 2017-03-21
  • 打赏
  • 举报
回复
使用this指针: 在你的串口函数所在的对话框了定义一个public全局变量 CSerialPort m_Port; 在你的想要使用的对话框里: CYourDlg *pDlg = (CYourDlg*)this->GetParent();//这个CYourDlg就是你的串口函数在的那个对话框; 然后使用时候pDlg ->m_Port.WriteToPort(...);
走好每一步 2017-02-27
  • 打赏
  • 举报
回复
引用 16 楼 janehx 的回复:
[quote=引用 12 楼 tajon1226 的回复:] 我那个只是伪代码,只是举个例子,你不能照搬的,我讲详细点吧 如果你的A对话框是主对话框 (就是最先弹出的那个) DlgA.cpp文件============ DlgA *g_pDlg = NULL; OnitDialog() { g_pDlg = this; } DlgA.h文件===================== extern DlgA *g_pDlg DlgB.cpp==================== #include "DlgA.h" Function { g_pDlg->m_port->WritePort(); }
是的,我明白您的意思了,现在可以调用m_port了,调用后出现断言: 我是不是可以把这句断言删掉,因为很明显,m_Comm我确实已经让它出现了。[/quote] 不可以,这句断言是用来调试的,帮你定位错误。 你这里出现断言是因为m_Comm这个句柄为空指针,是因为是在写串口之前没有打开串口。
网安驿站 2017-02-25
  • 打赏
  • 举报
回复
引用 12 楼 tajon1226 的回复:
我那个只是伪代码,只是举个例子,你不能照搬的,我讲详细点吧
如果你的A对话框是主对话框 (就是最先弹出的那个)

DlgA.cpp文件============

DlgA *g_pDlg = NULL;

OnitDialog()
{
g_pDlg = this;
}

DlgA.h文件=====================
extern DlgA *g_pDlg


DlgB.cpp====================
#include "DlgA.h"

Function
{
g_pDlg->m_port->WritePort();
}

是的,我明白您的意思了,现在可以调用m_port了,调用后出现断言:

我是不是可以把这句断言删掉,因为很明显,m_Comm我确实已经让它出现了。
网安驿站 2017-02-25
  • 打赏
  • 举报
回复
引用 11 楼 zgl7903 的回复:
串口还没有打开
在对话框A中已经打开了
网安驿站 2017-02-25
  • 打赏
  • 举报
回复
引用 10 楼 a393062456 的回复:
[quote=引用 4 楼 janehx 的回复:] [quote=引用 3 楼 a393062456 的回复:] 定义个对话框指针,然后传对应的对话框指针进去,再调用指针调用m_port写。 另外,你为什么要把写放到另外一个对话框里面去呢,有啥必要么。
所有对串口的操作都放在一个对话框里不好吧,有通信、读卡、定位、各种读写操作。你说的是二楼的方法吗?[/quote] 不是,就比如单文档程序,你的view和doc指针对象都是定义在CMainFrame里面的是吧,如果你在不同的view里面要操作其他view的里面的变量怎么办。你可以先获主窗口的指针,通过主窗口的指针访问你要操作的view指针,你在通过这个view指针操作你要操作的变量。 这里也是一样,你是要在别的对话框操作你的m_port,那你就要访问这个m_port吧,而这个m_port你定义在另外一个对话框里面,你把m_port对话框的句柄获取了,然后通过这个句柄操作m_port变量在你这个对话框里面发送就可以了。[/quote] 是的,我就是这么写的, CMainFrame *pmf; pmf=new CMainFrame(); CString strsd; strsd="24 49 43 4A 43 00 0C 00 00 00 00 2B"; char data[512]; int strlen = pmf->pSysSetdlg->Str2Hex(strsd, data); pmf->pSysSetdlg->m_Port.WriteToPort(data, strlen); 结果是CSerialPort这个类报错了
Pingo520 2017-02-24
  • 打赏
  • 举报
回复
定义个对话框指针,然后传对应的对话框指针进去,再调用指针调用m_port写。 另外,你为什么要把写放到另外一个对话框里面去呢,有啥必要么。
三岁、就很帅 2017-02-24
  • 打赏
  • 举报
回复
CSerialPort m_Port; //另外类里面用你是不是定义的全局的啊 你描述的里面看不出问题 上代码跟调试信息
走好每一步 2017-02-24
  • 打赏
  • 举报
回复
头文件如果是比较新VS编译器 要避免被重复包含 xx.h=============== #ifndef xxxxx_H #define xxxxx_H -- #endif 或者 #pragma once
走好每一步 2017-02-24
  • 打赏
  • 举报
回复
我那个只是伪代码,只是举个例子,你不能照搬的,我讲详细点吧 如果你的A对话框是主对话框 (就是最先弹出的那个) DlgA.cpp文件============ DlgA *g_pDlg = NULL; OnitDialog() { g_pDlg = this; } DlgA.h文件===================== extern DlgA *g_pDlg DlgB.cpp==================== #include "DlgA.h" Function { g_pDlg->m_port->WritePort(); }
zgl7903 2017-02-24
  • 打赏
  • 举报
回复
串口还没有打开
Pingo520 2017-02-24
  • 打赏
  • 举报
回复
引用 4 楼 janehx 的回复:
[quote=引用 3 楼 a393062456 的回复:] 定义个对话框指针,然后传对应的对话框指针进去,再调用指针调用m_port写。 另外,你为什么要把写放到另外一个对话框里面去呢,有啥必要么。
所有对串口的操作都放在一个对话框里不好吧,有通信、读卡、定位、各种读写操作。你说的是二楼的方法吗?[/quote] 不是,就比如单文档程序,你的view和doc指针对象都是定义在CMainFrame里面的是吧,如果你在不同的view里面要操作其他view的里面的变量怎么办。你可以先获主窗口的指针,通过主窗口的指针访问你要操作的view指针,你在通过这个view指针操作你要操作的变量。 这里也是一样,你是要在别的对话框操作你的m_port,那你就要访问这个m_port吧,而这个m_port你定义在另外一个对话框里面,你把m_port对话框的句柄获取了,然后通过这个句柄操作m_port变量在你这个对话框里面发送就可以了。
网安驿站 2017-02-24
  • 打赏
  • 举报
回复
引用 5 楼 janehx 的回复:
[quote=引用 1 楼 tajon1226 的回复:] 你要这样看: 类函数 { 类变量->函数( ) 实际上等于 this->类变量->函数(); } 你的第二个对话框并没有对应的this指针。 下面是伪代码 方法一: class A { public: m_port; }; A g_DlgA; B::Test { g_DlgA.m_port->WritePort(); } 方法二: class A { private: m_port; public WritePort() { m_port.WritePort(); } }; A g_DlgA; B::Test { g_DlgA.WritePort(); }
感谢回复,我按你的方法一写的,出现重定义的错误。[/quote] 重定义问题已解决,还是现在问题还是m_hComm!=0;的问题
网安驿站 2017-02-24
  • 打赏
  • 举报
回复
问题补充,出问题的代码为:m_hComm!=0;如下图所示:
  • 打赏
  • 举报
回复
串口是否打开,在另一个对话框发送,就需要在另一个对话框打开串口,关闭之前的串口
网安驿站 2017-02-24
  • 打赏
  • 举报
回复
引用 2 楼 swwllx 的回复:
CSerialPort m_Port; //另外类里面用你是不是定义的全局的啊
你描述的里面看不出问题 上代码跟调试信息

是这样的,我在对话框A中有一个函数On_ICJC();这个函数使用了CSerialPort类的一个写串口函数WriteToPort,即
我想在对话框B完成同样的写串口操作,然后出现了问题中的错误。
网安驿站 2017-02-24
  • 打赏
  • 举报
回复
引用 1 楼 tajon1226 的回复:
你要这样看:
类函数
{
类变量->函数( ) 实际上等于 this->类变量->函数();
}
你的第二个对话框并没有对应的this指针。

下面是伪代码
方法一:
class A
{


public:
m_port;

};

A g_DlgA;


B::Test
{

g_DlgA.m_port->WritePort();

}


方法二:

class A
{


private:
m_port;

public WritePort()
{
m_port.WritePort();
}

};

A g_DlgA;


B::Test
{

g_DlgA.WritePort();

}

感谢回复,我按你的方法一写的,出现重定义的错误。
网安驿站 2017-02-24
  • 打赏
  • 举报
回复
引用 3 楼 a393062456 的回复:
定义个对话框指针,然后传对应的对话框指针进去,再调用指针调用m_port写。 另外,你为什么要把写放到另外一个对话框里面去呢,有啥必要么。
所有对串口的操作都放在一个对话框里不好吧,有通信、读卡、定位、各种读写操作。你说的是二楼的方法吗?
走好每一步 2017-02-24
  • 打赏
  • 举报
回复
你要这样看: 类函数 { 类变量->函数( ) 实际上等于 this->类变量->函数(); } 你的第二个对话框并没有对应的this指针。 下面是伪代码 方法一: class A { public: m_port; }; A g_DlgA; B::Test { g_DlgA.m_port->WritePort(); } 方法二: class A { private: m_port; public WritePort() { m_port.WritePort(); } }; A g_DlgA; B::Test { g_DlgA.WritePort(); }

3,248

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧