сериализация — чтение после перезапуска — последовательная связь RS232 с использованием последовательной библиотеки

Я пытаюсь читать с RS-232 с последовательными соединениями, используя последовательные библиотеки для C ++, и некоторые примеры можно найти по адресу:
http://www.codeproject.com/Articles/992/Serial-library-for-C

Есть ли какой-либо метод обнаружения сигнала или событие, которое дает мне знать.
Я подключил 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;
}

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

Тропа 1:

Данные: «H ¢ ˜A, B ™ žX
BytesRead: 100

Тропа 2:

Данные: x] ÿßÿ $ ¢ œŒ2Y¶S Ieó1ñ \ @ ó8¬!) Þ
BytesRead: 30

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

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

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

-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, можно увидеть в текстовом файле.

-1

Другие решения


По вопросам рекламы [email protected]