2017-02-06 6 views
0

Прежде всего - я студент из Германии, поэтому, пожалуйста, извините мой плохой английский. На данный момент я работаю над проектом, целью которого является управление сервомоторами на плате arduino посредством последовательной связи через модули xbee. Итак, теперь я изучаю SerialPort, но получил проблемы с помощью write().Последовательная связь C++ SerialPort-Class

Мой план - отправить целочисленные значения, разделенные запятыми через мой последовательный порт. Visual Studio Сообщает об ошибке и говорит, что нет подходящего типа аргумента. Я действительно не знаю, как справиться с этой проблемой, потому что я совершенно не знаком со всей этой темой программирования.

#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

Я предлагаю вам перейти на C#, а не Managed C++ (ака C++/CLI ака C++/CX), и C# более терпим к новичкам. Первая ошибка, которую я вижу, заключается в том, что вы открываете свой порт КАЖДОЕ время через цикл, но не закрываете его или не ожидаете чего-либо в цикле. – metal

+0

Вы передаете неуправляемый массив [] в метод .NET, который требует 'array ^'. Если вы хотите «целочисленные значения, разделенные запятой», тогда вам нужно написать строку, а не массив байтов. –

+0

@ HansPassant, спасибо за помощь. Если я использую строку вместо массива, мне просто нужно написать mySerialPort-> Write («String»); правильно? Итак, есть только явные значения. Как я могу использовать строки для отправки, например, что-то вроде «», которое включает значения, которые меняют каждую итерацию моего цикла? Спасибо! – ElseTU

ответ

0

Вы можете исправить это следующим образом:

#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); 
    } 
} 

Как вы заметили, вы можете также отправить эти данные в виде строки:

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

Но быть предупрежден, что mySerialPort->Write() посылает сырой байты и mySerialPort->WriteLine() отправляет каждый символ в виде одного байта. Например:

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]));