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.
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());
}
};
}
que version de visul estudio uss porque con visual studio 2005 no abre
Hola Crystian,
Como veras he modificado el postm añadiendo el codigo, para que puedas usarlo en VS2005.
Saludos,
Pep Lluis,
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
De nada!! Crystian,
Entonces si entiendo bien esque tu proyecto debe incluir :
using namespace System;
al principio.
Saludos,
Pep Lluis,
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
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,
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++
Hay alguna posibilidad de hacer uso del puerto sin necesidad de añadir un Form?
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,
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