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

                   }

 

      };

     

}

 

0 pensamientos en “Acceder al Espacio System.IO.Ports en C++”

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

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

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

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

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

  6. Hola Evidals,
    Totalmente. Puedes utilizar System.IO.Ports por ejemplo en un WCF o en un Servicio de sistema.
    Normalmente los «forms» son utilzados en los ejemplos para poder disponer de una interface donde visualizar los datos.

    Saludos,
    PepLluis,

  7. Mucho gusto, disculpa tendras un codigo de dev c++(o cualquier C) para puerto usb solo quiera apagar y encender un led la vdd no tengo ni idea de como se hace no soy muy buen programador, o un liks para darme una idea,
    Gracias

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *