Hallo,
ich will Peter nicht vorgreifen, vielleicht kennt er sich da besser aus. Das Problem ist, dass die Windows Funktionen für die serielle Schnittstelle so vielfältig sind, dass man sein Programm sehr unterschiedlich aufbauen kann.
Ist der Code irgendwie zusammenkopiert oder selber geschrieben ?
Das zeichenweise Lesen über ReadFile ist sehr ineffizient. Nicht umsonst hat ReadFile einen Parameter, der angibt wie viele Zeichen gelesen wurden. Wenn man schon die COMMTIMEOUTS setzt, kann man sie auch gleich so setzen, dass ReadFile mit dem zurückkommt, was im Eingangspuffer steht.
Ein funktionsfähiges Beispiel für Eventbasiertes Lesen ohne asynchrones IO habe ich mit Google auf die Schnelle nicht gefunden. Ich hätte erwartet, dass man die Schnittstelle dann mit Overlapped öffnet, so wie hier
http://www.codeguru.com/cpp/i-n/netw...in-Windows.htm
Das mache ich normalerweise nicht, ist mir zu kompliziert. Sollte ich das mal brauchen, würde ich wohl eine fertige Klasse dafür nehmen, so wie die hier
http://www.naughter.com/serialport.html
Wenn man schon in einem Thread arbeitet, das mache ich bei seriellen Schnittstellen normalerweise auch, dann kann man da auch einfach pollen, ob was da ist, sonst eine Weile schlafen. Ist was da, liest man alles was da ist und nimmt das dann auseinander.
Ungefähr so
Code:
//
// Anzahl der Bytes im Eingangspuffer
//
DWORD SensorInterface::InputSize()
{
DWORD PortErrors;
COMSTAT PortStatus;
if ( ClearCommError(m_hComm, &PortErrors, &PortStatus) )
{
return PortStatus.cbInQue;
}
else
{
return 0;
}
}
und so
Code:
std::string SensorInterface::Receive()
{
if ( !m_bOpen )
{
throw std::runtime_error("port not open");
}
const int nReadSize = 128;
std::vector<char> Buffer(nReadSize);
unsigned long nDataRead;
if ( !ReadFile( m_hComm, &Buffer[0], nReadSize, &nDataRead, NULL) )
{
throw std::runtime_error("General Read Error");
}
return std::string(Buffer.begin(), Buffer.begin() + nDataRead);
}
Lesezeichen