2017-02-06 4 views
0

Vor allem - ich bin ein Student aus Deutschland, bitte entschuldige mein schlechtes Englisch. Im Moment arbeite ich an einem Projekt welches Ziel ist, Servomotoren auf einer Arduino-Platine durch serielle Kommunikation über xbee-Module zu steuern. So jetzt studiere ich die SerialPort aber bekam Probleme mit der write().Serielle Kommunikation C++ SerialPort-Klasse

Mein Plan ist, ganzzahlige Werte getrennt durch eine Kommata über meine serielle Schnittstelle zu senden. Visual Studio meldet einen Fehler und sagt, dass kein passender Argumenttyp vorhanden ist. Ich weiß wirklich nicht, wie ich mit diesem Problem umgehen soll, denn ich bin völlig neu in diesem ganzen Programmthema.

#include <iostream> 
using namespace std; 
#using <System.dll>; 

using namespace System; 
using namespace System::IO::Ports; 
using namespace System::Threading; 

int main() { 
    unsigned char values[2] = { 50, 120 }; 
    SerialPort^ mySerialPort = gcnew SerialPort("COM3"); 
     mySerialPort->BaudRate = 9600; 
     mySerialPort->Open(); 
while (true) { 

      mySerialPort->Write(values); 

    } 
} 
+0

Ich schlage vor, Sie schalten auf C# und nicht verwaltete C++ (auch bekannt als C++/CLI aka C++/CX) und C# ist toleranter zu den Neulingen. Der erste Fehler, den ich sehe, ist, dass Sie Ihren Port JEDERMAL durch die Schleife öffnen, ihn aber nicht schließen oder auf irgendetwas in der Schleife warten. – metal

+0

Sie übergeben ein nicht verwaltetes Array [] an eine .NET-Methode, die ein Array ^'erfordert. Wenn Sie "ganzzahlige Werte getrennt durch ein Komma" möchten, müssen Sie eine Zeichenfolge und kein Array von Bytes schreiben. –

+0

@HansPassant, danke für deine Hilfe. Wenn ich eine Zeichenfolge anstelle eines Array verwende, muss ich nur schreiben mySerialPort-> Write ("String"); Recht? Also gibt es nur explizite Werte. Wie kann ich Strings verwenden, um beispielsweise "" zu senden, die Werte enthalten, die jede Iteration meiner Schleife ändern? Danke! – ElseTU

Antwort

0

Sie können es auf diese Weise beheben:

#include <iostream> 
using namespace std; 
#using <System.dll> 

using namespace System; 
using namespace System::IO::Ports; 
using namespace System::Threading; 

int main() { 
    // Managed array 
    cli::array<unsigned char> ^values = { 50, 120 }; 
    SerialPort^ mySerialPort = gcnew SerialPort("COM3"); 
    mySerialPort->BaudRate = 9600; 
    mySerialPort->Open(); 
    while (true) { 

    // some work with values goes here... 

    // We should specify buffer offset and length 
    mySerialPort->Write(values, 0, values->Length); 
    } 
} 

Wie Sie bemerkt haben, können Sie diese Daten auch als String senden:

mySerialPort->WriteLine(String::Format("val1 = {0}; val2 = {1}", values[0], values[1])); 

Aber seien Sie gewarnt, dass mySerialPort->Write() sendet roh Bytes und mySerialPort->WriteLine() sendet jedes Zeichen als ein einzelnes Byte. Zum Beispiel:

cli::array<unsigned char> ^buffer = {123}; 

// Send one single byte 0x7b 
mySerialPort->Write(buffer, 0, buffer->Length); 

// Send 3 bytes (0x49, 0x50, 0x51) 
mySerialPort->WriteLine(String::Format("{0}", buffer[0])); 
Verwandte Themen