Página 1 de 1

Enviar y recibir datos con C++ al puerto serie

Publicado: 17 Mar 2017, 04:26
por REHome
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.

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

Publicado: 22 Mar 2017, 11:57
por Radiosity
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

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

Publicado: 22 Mar 2017, 12:05
por Radiosity
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?

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

Publicado: 22 Mar 2017, 13:07
por REHome
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.

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

Publicado: 25 Mar 2017, 20:03
por REHome
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.