Liste der Anhänge anzeigen (Anzahl: 1)
Serielle Schnittstelle Empfangsbuffer
Hallo Community,
ich bin gerade dabei einen GPS-Empfänger über die Serielle schnittstelle auszulesen.
Immer wenn an der seriellen Schnitstelle Daten ankommen wird ein Event ausgelöst und die Schnittstelle abgefragt.
Das Problem ist hierbei jetzt, dass zwar Daten ankommen, aber die neuen Daten immer nur an die alten Daten angehängt werden.
Die alten Daten werden nicht aus dem Buffer gelöscht.
Im angehängten Bild ist die Consolen-Ausgabe zu sehen.
Immer bei Characters Recieved kommt ein neuer Datensatz.
Die erste Zahl nach GPGGA ist die Uhrzeit, die daten kommen alle 200ms.
Ich habe es mit
Code:
PurgeComm(hComm, PURGE_RXCLEAR)
versucht was allerdings nicht funktioniert hat.
Hat jemand sonst noch eine Idee?
MfG Florian
Anhang 31542
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
vielen Dank für die Hinweise und Erklärungen.
Ich habe jetzt versucht den Code etwas aufzuräumen:
Code:
//CommSeriell.cpp
#include "stdafx.h"
#include "CommSeriell.h"
CommSeriell::CommSeriell(int a)
{
m_run.store(true);
m_thread = std::thread(std::bind(&CommSeriell::theThread, this));
}
CommSeriell::~CommSeriell()
{
m_run.store(false);
if (m_thread.joinable())
{
m_thread.join();
}
}
BOOL CommSeriell::initComPort()
{
std::cout <<std::endl<<"Serial Port Reception (Win32 API)"<< std::endl;
/*---------------------------------- Opening the Serial Port -------------------------------------------*/
ComPortName = TEXT("COM2");
hComm = CreateFile(ComPortName, // Name of the Port to be Opened
GENERIC_READ | GENERIC_WRITE, // Read/Write Access
0, // No Sharing, ports cant be shared
NULL, // No Security
OPEN_EXISTING, // Open existing port only
0, // Non Overlapped I/O
NULL); // Null for Comm Devices
if (hComm == INVALID_HANDLE_VALUE)
std::wcout <<"\n Error! - Port "<<ComPortName<<" can't be opened\n";
else
std::wcout <<"\n Port "<<ComPortName<<" Opened\n ";
/*------------------------------- Setting the Parameters for the SerialPort ------------------------------*/
DCB dcbSerialParams = { 0 }; // Initializing DCB structure
dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
Status = GetCommState(hComm, &dcbSerialParams); //retreives the current settings
if (Status == FALSE){
std::cout <<"\n Error! in GetCommState()";
error = 10;
}
dcbSerialParams.BaudRate = CBR_19200; // Setting BaudRate = 9600
dcbSerialParams.ByteSize = 8; // Setting ByteSize = 8
dcbSerialParams.StopBits = ONESTOPBIT; // Setting StopBits = 1
dcbSerialParams.Parity = NOPARITY; // Setting Parity = None
Status = SetCommState(hComm, &dcbSerialParams); //Configuring the port according to settings in DCB
if (Status == FALSE)
{
std::cout <<std::endl<<"\n Error! in Setting DCB Structure"<<std::endl;
error = 1;
}
else //If Successfull display the contents of the DCB Structure
{
std::cout << "\n\n Setting DCB Structure Successfull" << std::endl
<<"\n Baudrate = " << dcbSerialParams.BaudRate
<<"\n ByteSize = %d" << dcbSerialParams.ByteSize
<<"\n StopBits = %d" << dcbSerialParams.StopBits
<<"\n Parity = %d" << dcbSerialParams.Parity;
}
return Status;
}
BOOL CommSeriell::setRecieveMask() {
/*------------------------------------ Setting Receive Mask ----------------------------------------------*/
Status = SetCommMask(hComm, EV_RXCHAR); //Configure Windows to Monitor the serial device for Character Reception
if (Status == FALSE)
std::cout << "\n\n Error! in Setting CommMask";
else
std::cout << "\n\n Setting CommMask successfull";
return Status;
}
BOOL CommSeriell::recieveComPort(){
/*------------------------------------ Setting WaitComm() Event ----------------------------------------*/
std::cout <<"\n\n Waiting for Data Reception";
do {
Status = WaitCommEvent(hComm, &dwEventMask, NULL); //Wait for the character to be received
/*-------------------------- Program will Wait here till a Character is received ------------------------*/
if (Status == FALSE)
{
std::cout <<"\n Error! in Setting WaitCommEvent()";
error = 10;
}
else //If WaitCommEvent()==True Read the RXed data using ReadFile();
{
readbuf = ReceiveData();
std::cout <<"\n Print input\n";
std::cout << readbuf << std::endl;
}
error++; //nur 10 mal ausführen
} while (error <10);
return Status;
}
std::string CommSeriell::ReceiveData()
{
const int nReadSize = 256;
std::vector<char> Buffer(nReadSize);
unsigned long nDataRead;
if (!ReadFile(hComm, &Buffer[0], nReadSize, &nDataRead, NULL))
{
std::cout<<"General Read Error";
}
return std::string(Buffer.begin(), Buffer.begin() + nDataRead);
}
void CommSeriell::theThread()
{
initComPort();
setRecieveMask();
recieveComPort();
CloseHandle(hComm);//Closing the Serial Port
printf("\n +==========================================+\n");
}
Code:
// CommSeriell.h
#pragma once
class CommSeriell
{
public:
CommSeriell(int a);
~CommSeriell();
private:
std::atomic<bool> m_run;
std::thread m_thread;
//Variablendeklarationen
HANDLE hComm; // Handle to the Serial port
TCHAR *ComPortName; // Name of the Serial port(May Change) to be opened,
BOOL Status; // Status of the various operations
DWORD dwEventMask; // Event mask to trigger
int error = 0; //
std::string readbuf; //
//Funktiosdeklarationen
void theThread();
BOOL initComPort();
BOOL setRecieveMask();
BOOL recieveComPort();
std::string ReceiveData();
};
Anbei auch die Variablen-Deklarationen.
Die von dir einen Thread vorher genannten Punkte habe ich hoffentlich soweit alle herausgenommen.
Anbei noch ein Bild wie die Daten jetzt ausgegeben werden.
MfG Florian
Anhang 31549