墨桃夭夭 2013-11-28 09:04 采纳率: 0%
浏览 802

MFC串口通信问题,求解

在基于单文档的MFC中能不能点击菜单项弹出对话框,再点击对话框中的按钮开始串口通信呢?如果不能的话,要怎样变通来实现这个功能呢?

  • 写回答

1条回答

  • CSDN-Ada助手 CSDN-AI 官方账号 2022-10-25 18:42
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:
    • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/237201
    • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:MFC的信号机制
    • 除此之外, 这篇博客: MFC多进程的创建及通信中的 第一部分: 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

      1.使用VS2017搭建基于对话框的MFC应用程序,名为“MainProcess”。并放置一个EDIT控件和两个BUTTON控件并将对话框Caption命名为“MainProcess”,如图。
      在这里插入图片描述
      2.右键“解决方案“MainProcess””->添加->新建项目
      在这里插入图片描述
      3.选择“MFC应用程序”并命名为“ChildProcess
      在这里插入图片描述
      4.打开ChildProcess的对话框编辑页,添加一个EDIT控件并将对话框Caption命名为“ChildProcess”
      在这里插入图片描述
      5. 右键“解决方案“MainProcess””->属性->启动项目,选择单项目启动“MainProcess”
      6.在MainProcessDlg.cpp实现文件中添加宏定义:

      //自定义用户消息
      #define WM_MYMESSAGE WM_USER + 1
      

      7.双击MainProcessDlg按钮添加按钮响应函数:

      //启动子程序按钮响应函数
      void CMainProcessDlg::OnBnClickedButton1()
      {
      	PROCESS_INFORMATION pi = { 0 };//进程信息结构
      	STARTUPINFO si = { 0 };//启动信息结构
      	si.cb = sizeof(si);
      	si.wShowWindow = SW_SHOW;//显示窗口
      	si.dwFlags = STARTF_USESHOWWINDOW;//启动标志,显示窗口
      	::CreateProcess(
      		TEXT("F:/Test/MainProcess/Debug/ChildProcess.exe"),//可执行文件(exe)或模块路径
      		nullptr,//命令行参数 
      		nullptr,//默认进程安全性 
      		nullptr,//默认线程安全性
      		FALSE,  //指定当前进程内局部不可以被子进程继承 
      		CREATE_DEFAULT_ERROR_MODE,      //创建进程的标志,这里设为0,不需要
      		nullptr,//使用本进程的环境变量
      		nullptr,//使用本进程的驱动器和目录
      		&si, &pi);
      }
      //发送指令按钮
      void CMainProcessDlg::OnBnClickedButton2()
      {
      	HWND hWnd = ::FindWindow(_T("#32770"), _T("ChildProcess"));//目标进程的窗口类名(可通过Spy++工具查看)和窗口名
      	if (NULL != hWnd)
      	{
      		::PostMessage(hWnd, WM_MYMESSAGE, NULL, NULL);//发送用户消息
      		SetDlgItemText(IDC_EDIT1, _T("指令1已发送!"));
      	}
      }
      

      8.在ChildProcessDlg.h头文件里添加函数声明:

      protected:
      afx_msg LRESULT OnMyMessage(WPARAM wp, LPARAM lp);
      

      9.在ChildProcessDlg.cpp实现文件中添加自定义消息宏定义:

      #define WM_MYMESSAGE WM_USER + 1
      

      10.在ChildProcessDlg.cpp实现文件中添加自定义消息处理声明:

      BEGIN_MESSAGE_MAP(CChildProcessDlg, CDialogEx)
      	ON_WM_SYSCOMMAND()
      	ON_WM_PAINT()
      	ON_WM_QUERYDRAGICON()
      	ON_MESSAGE(WM_MYMESSAGE, OnMyMessage)//只添加这一句,其他为示意位置
      END_MESSAGE_MAP()
      

      11.最后在ChildProcessDlg.cpp实现文件末尾添加自定义消息响应函数:

      LRESULT CChildProcessDlg::OnMyMessage(WPARAM wp, LPARAM lp)
      {
      	SetDlgItemText(IDC_EDIT1, _T("收到指令1"));
      	return 0;
      }
      
      1. 右键“解决方案“下的“ChildProcess”->生成
        在这里插入图片描述
        13.编译运行,先点击“启动子进程”,可以看到“ChildProcess.exe”被启动,点击“发送指令”,可以看到子进程对话框上显示。
        在这里插入图片描述
        14.注意:修改ChildProcess后需要重新生成项目解决方案。另外PostMessge或者SendMessage()实现进程间通讯只能发生消息而不能发生内容,由于两个进程使用的是相互独立的两个虚拟内存空间,同一地址对不同的进程来说并不一定指向同一物理内存,内容也就不一定一样,因此不同进程无法通过传地址的方式传递字符串。

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

悬赏问题

  • ¥15 本题的答案是不是有问题
  • ¥15 关于#r语言#的问题:(svydesign)为什么在一个大的数据集中抽取了一个小数据集
  • ¥15 C++使用Gunplot
  • ¥15 这个电路是如何实现路灯控制器的,原理是什么,怎么求解灯亮起后熄灭的时间如图?
  • ¥15 matlab数字图像处理频率域滤波
  • ¥15 在abaqus做了二维正交切削模型,给刀具添加了超声振动条件后输出切削力为什么比普通切削增大这么多
  • ¥15 ELGamal和paillier计算效率谁快?
  • ¥15 蓝桥杯单片机第十三届第一场,整点继电器吸合,5s后断开出现了问题
  • ¥15 file converter 转换格式失败 报错 Error marking filters as finished,如何解决?
  • ¥15 Arcgis相交分析无法绘制一个或多个图形