2016-09-20 38 views
0

我正在研究需要使用控制檯應用程序獲取相同輸出的MFC應用程序。控制檯應用程序可以顯示來自串行端口的輸入數據。我想用MFC對話框應用程序獲取輸入並將其顯示到編輯控制框中。由於我還是C++的新手,對我來說這似乎頗具挑戰性。有關解決方法的任何建議?提前致謝!如何使用控制檯應用程序獲取輸出並將其顯示到MFC對話框中StaticText

控制檯應用程序代碼:

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; 
} 
+1

你正在超越自己。如果您想使用MFC,則必須先學習C++ **和** Windows API(有關基本原理,請參閱[學習MFC編程的先決條件](http://stackoverflow.com/q/18165076/1889329))。 – IInspectable

+0

@IInspectable感謝您的建議,我正在評論winAPI,但這需要一段時間。你能幫我一些關於MFC編程的哪些部分應該更注意解決我的問題的建議嗎?謝謝 ! – NguyenHai

+0

此時您在MFC上投資的任何東西都將浪費時間。沒有什麼是合理的,你將繼續基於儀式化的觀察來編寫代碼。在某些時候,你將不得不**再次從你的[貨物崇拜節目](https://en.wikipedia.org/wiki/Cargo_cult_programming)那裏學習所有這些壞習慣,浪費更多時間。建議您先[學習使用C++編程Windows](https://msdn.microsoft.com/en-us/library/windows/desktop/ff381399.aspx)(不使用MFC)。 – IInspectable

回答

0

由於我在C++知識是不夠好,所以我不知道我的問題是如何打破循環在上面的代碼&字符數組之間的轉換和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); 
    } 
相關問題