2015-09-24 16 views
2

Я довольно новичок в программировании в C++, и мне нужна ваша помощь.последовательный порт пишите C++

Я хочу сделать простой GUI, который будет связываться с внешним устройством через serial port и тип шлифовального символа на устройство. И мой вопрос следующий

  1. Я не понимаю mySirialPort->Write(array<Char>^, Int32, Int32) --- array<Char>^, какой тип variable мне нужно написать в.

Потому что я получаю следующее сообщение об ошибке.

1>Return_NAN.cpp(19): error C2440: 'initializing' : cannot convert from 'const char [2]' to 'char' 
1>   There is no context in which this conversion is possible 
1>Return_NAN.cpp(30): error C2664: 'void System::IO::Ports::SerialPort::Write(cli::array<Type,dimension> ^,int,int)' : cannot convert parameter 1 from 'char' to 'cli::array<Type,dimension> ^' 
1>   with 
1>   [ 
1>    Type=wchar_t, 
1>    dimension=1 
1>   ] 

мой код:

char a = "A";   
SerialPort^ mySerialPort = gcnew SerialPort(a); 
//mySerialPort->PortName = a; 
mySerialPort->BaudRate = 1200; 
mySerialPort->Parity = Parity::None; 
mySerialPort->StopBits = StopBits::One; 
mySerialPort->DataBits = 8; 
mySerialPort->Handshake = Handshake::None; 
mySerialPort->Open(); 
mySerialPort->Write(t,0,1); // problem 
mySerialPort->Close(); 

Если я пишу «А» непосредственно писать функции нет ошибок, пока я компиляции.

Спасибо за вашу помощь, KB

+1

'char a = 'A'; 'с одинарной кавычкой – SHR

+1

Фактические функции последовательного порта (' CreateFile'/'SetCommState' /' WriteFile'/'CloseHandle') лучше, чем оболочки .NET, а с C++ их так же просто вызвать (может быть, проще) , –

ответ

0

1-й ошибки прост: вы должны написать: char a = 'A'; с одной цитатой, не "a" с кавычками.

array^ является ссылка CLR тип, он, вероятно, ожидается, что-то вроде: array<char>^ t = {1,2,3};look here:

но лучше использовать write(string^)look here:

Вы можете преобразовать его из в строку, как это:

const char* str = "Hello, world!"; 
String^ clistr = gcnew String(str);//allocate cli string and convert the c string 
// no need to delete, garbage collector will do it for you. 
mySerialPort->Write(clistr); 
1

System :: IO :: Ports :: SerialPort - это класс .NET. Имейте в виду, что вы используете расширение языка под названием C++/CLI, вы сэкономите себе много времени, прочитав основной учебник. Это достаточно отличается от C++, чтобы иметь кривую обучения, неделя принесет много пользы, чтобы изучить основные типы и узнать, когда использовать шляпу.

Вы уже выяснили, что написать строку легко, SerialPort :: Write() имеет перегрузку, которая принимает строку. Он преобразует строку в ASCII, так что вы можете писать только символьные значения в диапазоне от 0 до 127:

String^ example1 = "ABC"; 
mySerialPort->Write(example1); 

Запись одного байта проще всего сделать путем записи в BaseStream, преобразование не выполняется:

Byte example2 = 'A'; // or 0x41 
mySerialPort->BaseStream->WriteByte(example2); 

Если вы хотите записать массив байт, как сообщение об ошибке говорит, что вы делаете, то вы должны создать объект массива:

array<Byte>^ example3 = gcnew array<Byte> { 0x01, 0x02, 0x42 }; 
mySerialPort->Write(example3, 0, example3->Length); 

Там нет фундаментальных причин в пользу написания массива байт при записи байтов по одному, последовательные порты в любом случае очень медленные.

Смежные вопросы