Enviar y recibir datos con C++ al puerto serie

Foro dedicado a la programación en todo tipo de sistemas clásicos.
REHome
Amstrad PCW 8256
Amstrad PCW 8256
Mensajes: 144
Registrado: 19 Abr 2013, 22:01
Sistema Favorito: Spectrum +2
primer_sistema: Spectrum +2
Gracias dadas: 3 veces
Gracias recibidas: 2 veces

Enviar y recibir datos con C++ al puerto serie

Mensajepor REHome » 17 Mar 2017, 04:26

Hola:

Tengo esta librería https://github.com/Gmatarrubia/LibreriasTutoriales para el control del puerto serie en C++ con Win32.

Hice un primer intento, comunicar Arduino desde C++.

El código que he hecho es este.

Código: Seleccionar todo

#include <iostream>
#include <fstream>
#include <Windows.h>
#include "SerialClass.h"
using namespace std;

void main()
{
   SetConsoleTitle("Control Led 13 de Arduino UNO y saludos.");

   Serial* Puerto = new Serial("COM4");

   while (Puerto -> IsConnected())
   {

      // Comandos para Arduino.
      char L_ON[] = "Led13_ON";
      char L_OFF[] = "Led13_OFF";
      char Saludar[] = "Hola Arduino. Saludos desde el PC con C++ bajo  Win32.";
      char Luz_ON[] = "Luz_ON";
      char Luz_OFF[] = "Luz_OFF";
      char lectura[50];

      int opc;

      cout << "Introduzca la opcion deseada: ";

      cin >> opc;

      switch (opc)
      {
      case 1:
         cout << "caso 1\n";
         // Enviar encender Led.
         cout << "Enviando: " << L_ON << endl;
         Puerto -> WriteData(L_ON, sizeof(L_ON) - 1);
         break;

      case 2:
         cout << "caso 2\n";
         // Enviar apagar Led.
         cout << "Enviando: " << L_OFF << endl;
         Puerto -> WriteData(L_OFF, sizeof(L_OFF) - 1);
         break;

      case 3:
         cout << "caso 3\n";
         // Mensaje saludar.
         cout << "Enviando: " << Saludar << endl;
         Puerto -> WriteData(Saludar, sizeof(Saludar) - 1);
         break;

      case 4:
         cout << "caso 4\n";
         // Mensaje saludar.
         cout << "Enviando: " << Luz_ON << endl;
         Puerto->WriteData(Luz_ON, sizeof(Luz_ON) - 1);
         break;

      case 5:
         cout << "caso 5\n";
         // Mensaje saludar.
         cout << "Enviando: " << Luz_OFF << endl;
         Puerto->WriteData(Luz_OFF, sizeof(Luz_OFF) - 1);
         break;

      default:
         cout << "Puse del 1 al 5.";
      }

      Puerto -> ReadData(lectura, 50);
      cout << "Recibido: " << lectura << endl;

      cout << "-------------------" << endl;

      //system("PAUSE");
   }
}


Puedo enviar los datos y funciona bien. El problema es al recibirlo desde Arduino. Cuando la cosoncola C++ está ejecutada, espera a que yo envíe algún dato o que recibe. Lo que quiero es que reciba datos y se muestre en pantalla. Aunque diga un HOLA.

¿Alguna idea para mejorar el programa?

Saludos.

Radiosity
Amstrad CPC 464
Amstrad CPC 464
Mensajes: 74
Registrado: 30 Oct 2015, 09:56
Sistema Favorito: Spectrum +2
primer_sistema: Spectrum +2
consola_favorita: Nintendo SNES
Primera consola: Nintendo SNES
Gracias dadas: 13 veces
Gracias recibidas: 14 veces

Re: Enviar y recibir datos con C++ al puerto serie

Mensajepor Radiosity » 22 Mar 2017, 11:57

Hace tiempo hice una aplicación en Delphi que tenia que mandar y recibir datos desde el RS232 con un protocolo especifico. Aunque era en Delphi supongo que en C++ seria algo parecido. Al principio como tu, use componentes (clases) de terceros que controlaban la parte 'sucia' de programar el envio de datos entre el puerto y periferico. Al final habia un lag importante a la hora de leer los datos del periferico, haciendome perder datos al principio de la lectura. Solución: programe a pelo las rutinas que activaban/desactivaban el COM y las que enviaban/recibian datos (bytes) del COM asi prescindí de los componentes de terceros. Es mas facil de lo que en un principio puede parecer.

Saludos

Radiosity
Amstrad CPC 464
Amstrad CPC 464
Mensajes: 74
Registrado: 30 Oct 2015, 09:56
Sistema Favorito: Spectrum +2
primer_sistema: Spectrum +2
consola_favorita: Nintendo SNES
Primera consola: Nintendo SNES
Gracias dadas: 13 veces
Gracias recibidas: 14 veces

Re: Enviar y recibir datos con C++ al puerto serie

Mensajepor Radiosity » 22 Mar 2017, 12:05

He recuperado algo del codigo en Delphi para que le eches un ojo a ver si te puede orientar. Trata el puerto como como un archivo para su lectura escritura, apertura y cierre...

Apertura del puerto COM:

Código: Seleccionar todo

Procedure AbreCom;
Var
caca: boolean;
DCB: TDCB;

begin
  hPort:= CreateFile(PChar(NombreCOM), GENERIC_WRITE or GENERIC_READ,0, nil,
    OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);

  if hPort<>INVALID_HANDLE_VALUE then
  begin
        FillChar(dcb, SizeOf(dcb), 0);
        DCB.DCBlength:= sizeof(DCB);
        DCB.BaudRate := CBR_115200;
        DCB.ByteSize := 8;
        DCB.Parity   := NOPARITY;
        DCB.StopBits := ONESTOPBIT;
        DCB.XonChar:=#17;
        DCB.XoffChar:=#19;
        SetCommState(hPort, DCB);
        PurgeComm(hPort, PURGE_TXABORT or PURGE_RXABORT or PURGE_TXCLEAR or PURGE_RXCLEAR);
  end else begin
        MessageDlg('COM Ya esta en uso !!! ', mtWarning, [mbOk], 0);
        Exit;
  end;
end;


¿Quieres que lea continuamente de arduino o arduino solo responde cuando mandas algun dato?

REHome
Amstrad PCW 8256
Amstrad PCW 8256
Mensajes: 144
Registrado: 19 Abr 2013, 22:01
Sistema Favorito: Spectrum +2
primer_sistema: Spectrum +2
Gracias dadas: 3 veces
Gracias recibidas: 2 veces

Re: Enviar y recibir datos con C++ al puerto serie

Mensajepor REHome » 22 Mar 2017, 13:07

Hola:

Le hecho un ojo. Muchas gracias.

Por cierto, la última vez que toqué Delphi fue la versión 7 y muy poco del 8.

¿Qué versión hay ahora?

Saludos.

REHome
Amstrad PCW 8256
Amstrad PCW 8256
Mensajes: 144
Registrado: 19 Abr 2013, 22:01
Sistema Favorito: Spectrum +2
primer_sistema: Spectrum +2
Gracias dadas: 3 veces
Gracias recibidas: 2 veces

Re: Enviar y recibir datos con C++ al puerto serie

Mensajepor REHome » 25 Mar 2017, 20:03

Buenas:

He descargado el Delphi Edition Starter, la gratuita, Delphi 10.2 Tokio. Lo puedes ver aquí.

¿Haz usado un componente o librería de terceros para hacer funcionar el puerto serie?

Saludos.

Radiosity
Amstrad CPC 464
Amstrad CPC 464
Mensajes: 74
Registrado: 30 Oct 2015, 09:56
Sistema Favorito: Spectrum +2
primer_sistema: Spectrum +2
consola_favorita: Nintendo SNES
Primera consola: Nintendo SNES
Gracias dadas: 13 veces
Gracias recibidas: 14 veces

Re: Enviar y recibir datos con C++ al puerto serie

Mensajepor Radiosity » 30 May 2017, 08:28

REHome escribió:Buenas:

He descargado el Delphi Edition Starter, la gratuita, Delphi 10.2 Tokio. Lo puedes ver aquí.

¿Haz usado un componente o librería de terceros para hacer funcionar el puerto serie?

Saludos.

Es un componente TcomPort creo que se llamaba.

REHome
Amstrad PCW 8256
Amstrad PCW 8256
Mensajes: 144
Registrado: 19 Abr 2013, 22:01
Sistema Favorito: Spectrum +2
primer_sistema: Spectrum +2
Gracias dadas: 3 veces
Gracias recibidas: 2 veces

Re: Enviar y recibir datos con C++ al puerto serie

Mensajepor REHome » 30 May 2017, 12:01

Gracias, lo tendré en cuenta.

Edito:
Ya creé el tutorialsobre el comport y Delphi.


Volver a “Programación”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados