如何使用控制台应用程序获取输出并将其显示到MFC对话框中StaticText

阮海

我正在使用需要与控制台应用程序获得相同输出的MFC应用程序。控制台应用程序可以显示来自串行端口的输入数据。我想使用MFC对话框应用程序获取输入,并将其显示在编辑控制框中。由于我还是C ++的新手,所以对我来说似乎很有挑战性。有任何解决方法的建议吗?提前致谢!

控制台应用程序代码:

enum { EOF_Char = 27 };

int ShowError (LONG lError, LPCTSTR lptszMessage)
{
    // Generate a message text
    TCHAR tszMessage[256];
    wsprintf(tszMessage,_T("%s\n(error code %d)"), lptszMessage, lError);
    return 1;
}

int __cdecl _tmain (int /*argc*/, char** /*argv*/)
{
    CSerial serial;
    LONG    lLastError = ERROR_SUCCESS;
    lLastError = serial.Open(_T("COM1"), 0, 0, false);
    lLastError = serial.Setup(CSerial::EBaud9600, CSerial::EData8,CSerial::EParNone, CSerial::EStop1);
    lLastError = serial.SetupHandshaking(CSerial::EHandshakeHardware);

    // ** The query command to get input data **
    lLastError = serial.Write(":MEAS:FREQuency?\n");

    // Register only for the receive event
    lLastError = serial.SetMask(CSerial::EEventBreak |
                                CSerial::EEventCTS   |
                                CSerial::EEventDSR   |
                                CSerial::EEventError |
                                CSerial::EEventRLSD  |
                                CSerial::EEventRecv);
    if (lLastError != ERROR_SUCCESS)
         return ::ShowError(serial.GetLastError(), _T("Unable to set COM-port event mask"));

    // Use 'non-blocking' reads,cuz we don't know how many bytes will be received. 
    lLastError = serial.SetupReadTimeouts(CSerial::EReadTimeoutNonblocking);

    if (lLastError != ERROR_SUCCESS)
        return ::ShowError(serial.GetLastError(), _T("Unable to set COM-port read timeout."));

    // Keep reading data, until an EOF (CTRL-Z) has been received
    bool fContinue = true;

    do
    {
        // Wait for an event
        lLastError = serial.WaitEvent();

        if (lLastError != ERROR_SUCCESS)
            return ::ShowError(serial.GetLastError(), _T("Unable to wait for a COM-port event."));

        // Save event
        const CSerial::EEvent eEvent = serial.GetEventType();

    // Handle break event
    if (eEvent & CSerial::EEventBreak)
    {   printf("\n### BREAK received ###\n");  }
    // Handle CTS event
    if (eEvent & CSerial::EEventCTS)
    {   printf("\n### Clear to send %s ###\n", serial.GetCTS()?"on":"off");           }
    // Handle error event
    if (eEvent & CSerial::EEventError)
    {
        printf("\n### ERROR: ");
        switch (serial.GetError())
        {
        case CSerial::EErrorBreak:      printf("Break condition");          break;
        case CSerial::EErrorMode:       printf("Unsupported mode");         break;
        case CSerial::EErrorOverrun:    printf("Buffer overrun");           break;
        case CSerial::EErrorTxFull:     printf("Output buffer full");       break;
        default:                        printf("Unknown");                  break;
        }
        printf(" ###\n");
    }
    // Handle RLSD/CD event
    if (eEvent & CSerial::EEventRLSD)
    {   printf("\n### RLSD/CD %s ###\n", serial.GetRLSD()?"on":"off"); }

    // Handle data receive event
    if (eEvent & CSerial::EEventRecv)
    {
        // Read data, until there is nothing left
        DWORD dwBytesRead = 0;
        char szBuffer[101];
        do
        {
            // Read data from the COM-port
            lLastError = serial.Read(szBuffer,sizeof(szBuffer)-1,&dwBytesRead);
            if (lLastError != ERROR_SUCCESS)
                return ::ShowError(serial.GetLastError(), _T("Unable to read from COM-port."));

            if (dwBytesRead > 0)
            {
                // Finalize the data, so it is a valid string
                szBuffer[dwBytesRead] = '\0';

                // **Display the data/Need the same output for EditBox**
                printf("%s", szBuffer);
                // Check if EOF (CTRL+'[') has been specified
                if (strchr(szBuffer,EOF_Char))
                    fContinue = false;
            }
        }
        while (dwBytesRead == sizeof(szBuffer)-1);
    }
}
while (fContinue);

// Close the port again
serial.Close();
return 0;
}
阮海

由于我对C ++的了解还不够好,所以我不知道我的问题是如何打破上述代码中的循环以及char数组和CString之间的转换。这是我的答案:

 void Singlemode::OnBnClickedButton3()
 {
     CString str3;
    // TODO: Add your control notification handler code here
    CSerial serial;
    LONG    lLastError = ERROR_SUCCESS;
    lLastError = serial.Open(_T("COM1"), 0, 0, false);
    lLastError = serial.Setup(CSerial::EBaud9600, CSerial::EData8, CSerial::EParNone, CSerial::EStop1);
    lLastError = serial.SetupHandshaking(CSerial::EHandshakeHardware);
    lLastError = serial.Write(":MEAS:FREQuency?\n");

    // Register only for the receive event

    // Use 'non-blocking' reads, because we don't know how many bytes
    // will be received. This is normally the most convenient mode
    // (and also the default mode for reading data).
  bool fContinue = true;
   do
    {
        // Wait for an event
       lLastError = serial.WaitEvent();
       // Save event
      const CSerial::EEvent eEvent = serial.GetEventType();
      // Handle data receive event
      if (eEvent & CSerial::EEventRecv)
        {
        // Read data, until there is nothing left
        DWORD dwBytesRead = 0;
        char szBuffer[101];
        do
        {
            // Read data from the COM-port
            lLastError = serial.Read(szBuffer, sizeof(szBuffer) - 1, &dwBytesRead);

            if (dwBytesRead > 0)
              {
                // Finalize the data, so it is a valid string
                szBuffer[dwBytesRead] = '\0';

                // Display the data
                str3 = CString(szBuffer); // conversion to display
                show_result.SetWindowText(str3);
                fContinue = false;   // break the loop
                }
            } while (dwBytesRead == sizeof(szBuffer) - 1);
         }
    } while (fContinue);
  }

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在C ++中从控制台应用程序显示MFC对话框?

来自分类Dev

如何在C ++中从控制台应用程序显示MFC对话框?

来自分类Dev

如何从带有Windows 7样式按钮的控制台应用程序中显示对话框?

来自分类Dev

Delphi控制台应用程序:如何在消息对话框中添加OnHelp?

来自分类Dev

如何在服务中获取IHostApplicationLifetime并将其注入到容器中(控制台应用程序)

来自分类Dev

如何在控制台应用程序中读取txt文件并将其显示为表格?

来自分类Dev

通过 Power shell 如何启动控制台应用程序并将其保留在新实例中

来自分类Dev

如何在Windows下使用cmake在qt GUI应用程序中显示控制台

来自分类Dev

如何使用 React 在浏览器中显示控制台应用程序?

来自分类Dev

如何在MFC应用程序中动态创建对话框?

来自分类Dev

如何在 MFC Dialog 应用程序中插入更多对话框?

来自分类Dev

无法在PowerShell中将控制台应用程序的输出传递到自身中

来自分类Dev

在.net控制台应用程序中显示消息框

来自分类Dev

如何显示/隐藏控制台窗口应用程序?

来自分类Dev

从Ubuntu中的Qt GUI应用程序运行多个命令行应用程序并获取控制台输出

来自分类Dev

从Ubuntu中的Qt GUI应用程序运行多个命令行应用程序并获取控制台输出

来自分类常见问题

在控制台应用程序中显示图像

来自分类Dev

在C#中的控制台应用程序中使用的信息如何在消息框中写入相同的信息

来自分类Dev

在控制台应用程序中获取表名称

来自分类Dev

Powershell在控制台而不是对话框中显示Regsvr32结果

来自分类Dev

Powershell在控制台而不是对话框中显示Regsvr32结果

来自分类Dev

如何在Symfony2控制台应用程序中添加辅助输出?

来自分类Dev

如何在Elastic Beanstalk应用程序中监视控制台输出(stdout)?

来自分类Dev

如何在Xamarin.iOS自己的应用程序中捕获控制台日志输出?

来自分类Dev

如何在Elastic Beanstalk应用程序中监视控制台输出(stdout)?

来自分类Dev

如何在控制台应用程序中仅输出日期?

来自分类Dev

控制台应用程序如何在 Windows 10 核心输出包中添加?

来自分类Dev

如何在应用程序android中的任何活动之上显示警报对话框

来自分类Dev

如何在应用程序android中的任何活动之上显示警报对话框

Related 相关文章

  1. 1

    如何在C ++中从控制台应用程序显示MFC对话框?

  2. 2

    如何在C ++中从控制台应用程序显示MFC对话框?

  3. 3

    如何从带有Windows 7样式按钮的控制台应用程序中显示对话框?

  4. 4

    Delphi控制台应用程序:如何在消息对话框中添加OnHelp?

  5. 5

    如何在服务中获取IHostApplicationLifetime并将其注入到容器中(控制台应用程序)

  6. 6

    如何在控制台应用程序中读取txt文件并将其显示为表格?

  7. 7

    通过 Power shell 如何启动控制台应用程序并将其保留在新实例中

  8. 8

    如何在Windows下使用cmake在qt GUI应用程序中显示控制台

  9. 9

    如何使用 React 在浏览器中显示控制台应用程序?

  10. 10

    如何在MFC应用程序中动态创建对话框?

  11. 11

    如何在 MFC Dialog 应用程序中插入更多对话框?

  12. 12

    无法在PowerShell中将控制台应用程序的输出传递到自身中

  13. 13

    在.net控制台应用程序中显示消息框

  14. 14

    如何显示/隐藏控制台窗口应用程序?

  15. 15

    从Ubuntu中的Qt GUI应用程序运行多个命令行应用程序并获取控制台输出

  16. 16

    从Ubuntu中的Qt GUI应用程序运行多个命令行应用程序并获取控制台输出

  17. 17

    在控制台应用程序中显示图像

  18. 18

    在C#中的控制台应用程序中使用的信息如何在消息框中写入相同的信息

  19. 19

    在控制台应用程序中获取表名称

  20. 20

    Powershell在控制台而不是对话框中显示Regsvr32结果

  21. 21

    Powershell在控制台而不是对话框中显示Regsvr32结果

  22. 22

    如何在Symfony2控制台应用程序中添加辅助输出?

  23. 23

    如何在Elastic Beanstalk应用程序中监视控制台输出(stdout)?

  24. 24

    如何在Xamarin.iOS自己的应用程序中捕获控制台日志输出?

  25. 25

    如何在Elastic Beanstalk应用程序中监视控制台输出(stdout)?

  26. 26

    如何在控制台应用程序中仅输出日期?

  27. 27

    控制台应用程序如何在 Windows 10 核心输出包中添加?

  28. 28

    如何在应用程序android中的任何活动之上显示警报对话框

  29. 29

    如何在应用程序android中的任何活动之上显示警报对话框

热门标签

归档