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


                   }


 


      };


     


}


 

7 thoughts on “Acceder al Espacio System.IO.Ports en C++”

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

    Saludos,
    Pep Lluis,

  2. 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

  3. De nada!! Crystian,
    Entonces si entiendo bien esque tu proyecto debe incluir :
    using namespace System;
    al principio.
    Saludos,
    Pep Lluis,

  4. 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

  5. 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,

  6. Quisiera una comunicación de palabras por medio de DEVc++, osea, comunicar dos computadoras, utilizando el puerto serial ó USB por medio del Programa DEV C++

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>