2016-07-29 10 views
0

Mit dieser Anleitung/Klasse (http://playground.arduino.cc/Interfacing/CPPWindows) habe ich eine kleine Anwendung geschrieben, um Daten über die serielle Schnittstelle an einen Arduino zu senden. (Dies wird in einem größeren Projekt hinzugefügt wird später)C++ - Anwendung sendet Daten nur seriell, wenn sie geschlossen ist

int _tmain(int argc, _TCHAR* argv[]) { 

    Serial* SP = new Serial(argv[1]); 

    char outcomingData[256]; 
    int dataLength = 255; 
    int sendData; 

    while (SP->IsConnected()) { 

     strcpy_s(outcomingData, argv[2]); 
     sendData = SP->WriteData(outcomingData, dataLength); 
     printf("%s", outcomingData); 

    } 

    return 0; 
} 

Das Problem ist, dass die Daten nur gesendet werden, wenn ich die Anwendung schließen oder SP durch den destructor lösche. Wie kann ich das beheben? Gibt es eine Problemumgehung oder eine andere Methode, die ich der Klasse hinzufügen kann?

+0

Ich nehme an, Sie rund um die Arduino-Website geschaut? –

+0

Gibt es in der Dokumentation zu 'Serial * SP = new Serial (argv [1]);' oder 'SP-> IsConnected()', ob es blockiert, bis ein Handshake oder eine Verbindung hergestellt wurde? – M4rc

+0

Ja, ich habe im Forum gesucht, aber in den meisten Beiträgen geht es um die Kommunikation zwischen Linux und Arduino. Ich habe nichts gefunden, was helfen könnte – Champ

Antwort

1

Es ist wahrscheinlich, dass Ihre Daten zwischengespeichert werden, sodass sie nicht wirklich auf Ihr serielles Gerät geschrieben werden, bis CloseHandle in ~Serial aufgerufen wird. Sie können durch die Angabe FILE_FLAG_WRITE_THROUGH in Ihrem Aufruf zum CreateFile, dieses Caching-Verhalten vermeiden, so dass die Erstellung der Datei etwas aussehen würde:

//Try to connect to the given port throuh CreateFile 
this->hSerial = CreateFile(portName, 
     GENERIC_READ | GENERIC_WRITE, 
     0, 
     NULL, 
     OPEN_EXISTING, 
     FILE_ATTRIBUTE_NORMAL | FILE_FLAG_WRITE_THROUGH, 
     NULL); 

Wenn das nicht funktioniert, gibt es auch FILE_FLAG_NO_BUFFERING, aber das kann mit Einschränkungen auf dem verhängen Ausrichtung der Daten, die Sie auf das Gerät schreiben.


Wenn Sie das normale Pufferung Verhalten beibehalten möchten, können Sie eine Serial::Flush Methode hinzufügen, die FlushFileBuffers ruft Windows zu zwingen, alle Daten zu schreiben, es in das Gerät zwischengespeichert aus hat:

void Serial::Flush() 
{ 
    FileFlushBuffers(this->hSerial); 
} 

Sie würde dann SP->Flush() nach SP->WriteData(...) aufrufen, um sicherzustellen, dass Windows-Puffer auf das Gerät gespült werden. Dies würde es Ihnen ermöglichen, mehrere kleine Schreibvorgänge durchzuführen, ohne jeden einzelnen zu leeren, was möglicherweise die Leistung verbessert.


Als Randbemerkung, würde ich Ihre Benutzung new hier in Frage stellen. Es scheint nicht, wie es wirklich gebraucht wird, und SP konnte nur lokal konstruiert werden:

Serial SP(argv[1]); 
+0

Vielen Dank !! Ich habe beide Lösungen getestet und es funktioniert perfekt! Kann ich dich fragen, warum ich dort nicht "neu" benutzen soll? – Champ

+0

Die Verwendung von 'new' führt zu einer dynamischen Zuweisung und erfordert, dass Sie das Objekt später löschen. Wenn Sie das Objekt lokal erstellen, wird es automatisch gelöscht, wenn es den Gültigkeitsbereich verlässt. Im Allgemeinen ist es am besten, "neu" zu vermeiden, wenn es nicht benötigt wird, und einen intelligenten Zeiger wie "std :: unique_ptr" zu verwenden, wenn es benötigt wird. –

Verwandte Themen