Acceder al Espacio System.IO.Ports en C++

Algunos de vosotros en el foro estáis solicitando si es posible utilizar el System.IO.Ports con C++, esperando que esto sea un punto de entrada en un ejemplo súper simple!! De solo enviar y recibir una trama.

System IO Port & C++

Podéis descargaros el archivo adjunto, no esta probado en C++ express, pero supongo que no tendréis ningún problema en ejecutarlo.

Por cierto si reubicáis el proyecto (lo colocáis en un path diferente al original), cuando intentéis recompilarlo os generara un error : C1093 – detallando que no puede encontrar "stdafx.h". El concepto es que el proyecto genera y apunta determinadas referencias en tiempo de compilación, entonces la solución es  hacer un “build>Clean Solution” desde “Generar>Proyecto>Limpiar”. Luego simplemente “F5” J

Espero vuestras valoraciones.
Pep Lluis,

** El proyecto esta realizado con la vesion 9 de Visual Studio. (2008)
A peticion vuestra os dejo el codigo, para utilizarlo con Visual Studio 2005. Solo teneis que crear nuevo proyecto 'winforms' arrastrando y soltando un 'ListBox' un 'Boton' y un SerialPort.

namespace SystemIOPorts_EN_C {

 

      using namespace System;

      using namespace System::ComponentModel;

      using namespace System::Collections;

      using namespace System::Windows::Forms;

      using namespace System::Data;

      using namespace System::Drawing;

 

      /// <summary>

      /// Resumen de Form1

      /// Ejemplo de utilizacion del System.IO.Ports desde C++

      /// (C) Pep Lluis 2008

      ///

      ///

      /// Para realizar las pruebas es necesario insertar un

      /// conector de 9 pins en el puerto serie utilizado

      /// cortocircuitando (puenteando) los pines 2/3

      ///

      /// </summary>

      public ref class Form1 : public System::Windows::Forms::Form

      {

      public:

 

            Form1(void)

            {

                  InitializeComponent();

                  //

                  // Abrir el puerto de comunicaciones

                  // inhibir la verificacion de error de llamadas entre hilos

                  //

                  this->serialPort1->Open();

                  CheckForIllegalCrossThreadCalls = false;

            }

 

      protected:

            /// <summary>

            /// Limpiar los recursos que se estén utilizando.

            /// </summary>

            ~Form1()

            {

                  if (components)

                  {

                        delete components;

                  }

            }

      private: System::IO::Ports::SerialPort^  serialPort1;

      private: System::Windows::Forms::ListBox^  listBox1;

      private: System::Windows::Forms::Button^  button1;

      protected:

      private: System::ComponentModel::IContainer^  components;

 

      private:

            /// <summary>

            /// Variable del diseñador requerida.

            /// </summary>

 

 

#pragma region Windows Form Designer generated code

            /// <summary>

            /// Método necesario para admitir el Diseñador. No se puede modificar

            /// el contenido del método con el editor de código.

            /// </summary>

            void InitializeComponent(void)

            {

                  this->components = (gcnew System::ComponentModel::Container());

                  this->serialPort1 = (gcnew System::IO::Ports::SerialPort(this->components));

                  this->listBox1 = (gcnew System::Windows::Forms::ListBox());

                  this->button1 = (gcnew System::Windows::Forms::Button());

                  this->SuspendLayout();

                  //

                  // serialPort1

                  //

                  this->serialPort1->BaudRate = 115200;

                  this->serialPort1->DataReceived += gcnew System::IO::Ports::SerialDataReceivedEventHandler(this, &Form1::serialPort1_DataReceived);

                  //

                  // listBox1

                  //

                  this->listBox1->FormattingEnabled = true;

                  this->listBox1->Location = System::Drawing::Point(13, 13);

                  this->listBox1->Name = L"listBox1";

                  this->listBox1->Size = System::Drawing::Size(259, 95);

                  this->listBox1->TabIndex = 0;

                  //

                  // button1

                  //

                  this->button1->Location = System::Drawing::Point(197, 114);

                  this->button1->Name = L"button1";

                  this->button1->Size = System::Drawing::Size(75, 23);

                  this->button1->TabIndex = 1;

                  this->button1->Text = L"Enviar";

                  this->button1->UseVisualStyleBackColor = true;

                  this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click);

                  //

                  // Form1

                  //

                  this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);

                  this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;

                  this->ClientSize = System::Drawing::Size(284, 147);

                  this->Controls->Add(this->button1);

                  this->Controls->Add(this->listBox1);

                  this->Name = L"Form1";

                  this->Text = L"C++ & System.IO.Ports";

                  this->ResumeLayout(false);

 

            }

#pragma endregion

 

            /// Enviar trama usando System.IO.Ports

      private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {

                         this->serialPort1->Write(L"Hola Gente");

                   }

 

          /// Leer los caracteres recibidos y añadirlos al ListBox

      private: System::Void serialPort1_DataReceived(System::Object^  sender, System::IO::Ports::SerialDataReceivedEventArgs^  e) {

                         this->listBox1->Items->Add(serialPort1->ReadExisting());

                   }

 

      };

     

}

 

Comments

# re: Acceder al Espacio System.IO.Ports en C++

Tuesday, May 19, 2009 4:49 PM by crystian

que version de visul estudio uss porque con visual studio 2005 no abre

# re: Acceder al Espacio System.IO.Ports en C++

Thursday, May 21, 2009 1:33 AM by PepLluis

Hola Crystian,

Como veras he modificado el postm añadiendo el codigo, para que puedas usarlo en VS2005.

Saludos,

Pep Lluis,

# re: Acceder al Espacio System.IO.Ports en C++

Thursday, May 21, 2009 10:34 AM by Crystian

gracias Pep LUis!!

Si funciona!! Ahora quisiera pedirte ayuda porque tengo un programa en C++ y quiero agregarle las funciones de tu programa del puerto serie para recibir y enviar datos desde mi codigo en C++, pero uno de los errores que tengo es que me sale que "System no es un namespace o una clase". te agradeceria por la ayuda.

PD: ya tengo VS 2008    

# re: Acceder al Espacio System.IO.Ports en C++

Friday, May 22, 2009 9:59 AM by peplluis

De nada!! Crystian,

Entonces si entiendo bien esque tu proyecto debe incluir :

     using namespace System;

al principio.

Saludos,

Pep Lluis,

# re: Acceder al Espacio System.IO.Ports en C++

Monday, August 31, 2009 10:19 AM by Eriol

Buenas a todos

Muy ilustrativo el ejemplo.

¿Cómo podría cambiarse la paridad de ese puerto?

Supongo que esto podría hacerse en caliente. ¿O tengo que cerrar el puerto para hacer cambios de este tipo?

Un saludo y gracias

# re: Acceder al Espacio System.IO.Ports en C++

Tuesday, September 01, 2009 3:38 AM by peplluis

Eriol,

Efectivamente. El puerto serie recibe sus valores de sus ajustes en tiempo de inicializacion... o sea al llamar a 'Open'.

Este podria ser un posible modo :

this->serialPort1->Close;

this->serialPort1->Parity = System::IO::Ports::Parity::Even;

this->serialPort1->Open;

Saludos,

Pep Lluis,

Leave a Comment

(required) 
(required) 
(optional)
(required) 
If you can't read this number refresh your screen
Enter the numbers above: