2015-06-15 3 views
-1

Я пытаюсь читать RS232 с последовательным соединением с помощью последовательных библиотек для C++ C++ и некоторые образцы найдены в: http://www.codeproject.com/Articles/992/Serial-library-for-CRead после перезагрузки - последовательный порт RS232 связи с использованием последовательной библиотеки -

Есть ли обнаружение сигнала метод или событие, которое позволяет мне знать. Я подключил Rx и Нейтрально ТОЛЬКО к плате с использованием последовательного разъема USB и использованию последовательных библиотек в Visual studio 2013 и написанию кода на C++.

Я хочу, чтобы данные ASCII, переданные с моей доски, когда они перезапускаются вручную, в текстовый файл, поэтому я могу разбирать данные из текстового файла, будет легко для меня.

Мое бортовое устройство передает данные отправки только при его перезапуске. Я новичок в серийных соединениях, и я не смог понять, как позволить моей программе понять, когда данные будут сброшены.

Я использую программу слушателя:

#define STRICT 
#include <tchar.h> 
#include <windows.h> 
#include <stdio.h> 
#include <string.h> 
#include "Serial.h" 

//C++ headers 
#include <iostream> 
#include <fstream> 
#include <string> 

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); 

    // Display message-box and return with an error-code 
    ::MessageBox(0,tszMessage,_T("Listener"), MB_ICONSTOP|MB_OK); 
    return 1; 
} 

//int __cdecl _tmain (int /*argc*/, char** /*argv*/) 
int WINAPI _tWinMain(HINSTANCE /*hInst*/, HINSTANCE /*hInstPrev*/, LPTSTR /*lptszCmdLine*/, int /*nCmdShow*/) 
{ 
    CSerial serial; 
    LONG lLastError = ERROR_SUCCESS; 

    const char* Port_name = "COM3"; 

    // Attempt to open the serial port (COM1) 
    lLastError = serial.Open(_T(Port_name),0,0,false); 
    if (lLastError != ERROR_SUCCESS) 
     return ::ShowError(serial.GetLastError(), _T("Unable to open COM-port")); 

    // Setup the serial port (9600,8N1, which is the default setting) 
    lLastError = serial.Setup(CSerial::EBaud9600,CSerial::EData8,CSerial::EParNone,CSerial::EStop1); 
    if (lLastError != ERROR_SUCCESS) 
     return ::ShowError(serial.GetLastError(), _T("Unable to set COM-port setting")); 

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

    // 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). 
    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.")); 
     else 
      return ::ShowError(serial.GetLastError(), _T("Waiting 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 DSR event 
     if (eEvent & CSerial::EEventDSR) 
     { 
      printf("\n### Data set ready %s ###\n", serial.GetDSR()?"on":"off"); 
     } 

     // Handle error event 
     if (eEvent & CSerial::EEventError) 
     { 
      printf("\n### ERROR: "); 
      switch (serial.GetError()) 
      { 
      case CSerial::EErrorBreak:  printf("Break condition");   break; 
      case CSerial::EErrorFrame:  printf("Framing error");   break; 
      case CSerial::EErrorIOE:  printf("IO device error");   break; 
      case CSerial::EErrorMode:  printf("Unsupported mode");   break; 
      case CSerial::EErrorOverrun: printf("Buffer overrun");   break; 
      case CSerial::EErrorRxOver:  printf("Input buffer overflow"); break; 
      case CSerial::EErrorParity:  printf("Input parity error");  break; 
      case CSerial::EErrorTxFull:  printf("Output buffer full");  break; 
      default:      printf("Unknown");     break; 
      } 
      printf(" ###\n"); 
     } 

     // Handle ring event 
     if (eEvent & CSerial::EEventRing) 
     { 
      printf("\n### RING ###\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'; 

        //writing data to text file 
        std::ofstream o("save.txt"); 
        o << "Data: " << szBuffer << std::endl << "BytesRead: " <<dwBytesRead <<std::endl; 

        // Display the data 
        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; 
} 

Я сделал некоторые установки точек останова на мои заявления в то время и пытается перезапустить доску. Затем я получаю данные, записанные в мой текстовый файл следующим образом.

Trail 1:

данных: «Н ¢ ~A, В ™ Zx
BytesRead: 100

Trail 2:

данных: х] Assy $ ¢ œŒ2Y¶SIeó1ñ \ @ ó8¬!) Þ
BytesRead: 30

Я знаю, что эти данные неверны, я должен получить данные ASCII. Существуют ли библиотеки, которые поддерживают решение моей проблемы?

Мне нужно прочитать данные после перезапуска UART и после прекращения приема данных, он должен записать все данные в текстовый файл.

Пожалуйста, помогите мне с этим, большое вам спасибо.

+0

Используйте любое из множества приложений с последовательным интерфейсом, чтобы проверить правильность настроек вашей проводки и порта, и вы получаете данные в ожидаемом формате. –

+0

Да @BenVoigt, я сделал это, я использовал программное обеспечение терминального терминала Eltima Advanced. Я получаю данные после перезапуска платы после открытия порта. Но цель состоит в том, чтобы написать программу на C++ для проблемы. –

+0

Но вы не указали параметры, используемые в существующем программном обеспечении, и данные, которые вы ожидаете получить. Ваш вопрос даже не стал упоминать, что проводка и плата отправителя были протестированы с использованием существующего программного обеспечения. В частности, настройки управления потоком, как правило, очень важны, и ваш код полностью игнорирует их. –

ответ

-1

Настройка неправильной скорости передачи в функции настройки дает неправильный выход.

lLastError = serial.Setup(CSerial::EBaud115200,CSerial::EData8,CSerial::EParNone,CSerial::EStop1); 

, а также

std::ofstream output_file; 
     //Creating a text file 
     output_file.open("save_test.txt", std::ios_base::app); 
      //writing data to text file 
       output_file /*<< "Data: "*/ << szBuffer; 

вместо этого ниже код (который будет переписывать текстовый файл каждый раз, и никакие данные не видно)

//writing data to text file 
        std::ofstream o("save.txt"); 
        o << "Data: " << szBuffer << std::endl << "BytesRead: " <<dwBytesRead <<std::endl; 

будет добавлять данные в текстовый файл , который даст полные данные, которые передаются через RS232, можно увидеть в текстовом файле.

Смежные вопросы