Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Leer datos RS232 Balanza Electronica, por favor LEO...
Ir a página 1, 2  Siguiente
 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Leer datos RS232 Balanza Electronica, por favor LEO... Responder citando

He buscado y visto todos los post de PUERTO SERIE, pero no consigo dar con la forma de capturar el PESO de una BALANZA DIBAL Puerto SERIE.
Tengo un programa de TEST que funciona perfecto para leer dichos datos, por lo cual la conexión desde el PC con la BALANZA funciona, ya que puedo recibir su peso a través de COM4 que es el PUERTO que estoy utilizando.

En teoría enviándole primero una CARACTER, la BALANZA debería de responder con el PESO y ya está.

Estoy utilizando STUDIO 2010, con proyectos wchar_t y mi Windows es de 64bits.

El puerto COM4 lo tengo configurado así:
Bits por segundo: 9600
Bits de datos: 8
Paridad: Ninguno
Bits de parada: 1
Control de flujo: Xon / Xoff

Necesito ponerlo en marcha porque un cliente me ha pedido que ahora quiere leer el PESO desde la BALANZA DIBAL G-SERIES

Si por lo menos me pudiese orientar alguien, porque llevo ya ni se sabe de tiempo con esto y no consigo solucionarlo.

También he probado con todos los códigos que he encontrado en el foro, pero ninguno me da ningún dato desde donde poder orientarme.
También probé con el PDF que hay en el foro sobre puerto serie, pero sigo igual.


Veo que algunos usuarios utilizan ComPort un componente que tampoco puedo cargar en C++ Builder 2010 para hacer las pruebas.

Llevo ya varios días con esto y me estoy volviendo loco.

He intentado adaptar este código pero ni aún así consigo que funcione.
Comentario del CODIGO ENCONTRADO:

Una pregunta recurrente que me suelen preguntar es la relacionada a cómo hacer X o Y a través de los puertos seriales. Es decir, cómo lograr interactuar con algún hardware conectado al puerto serial.

La respuesta a esto es sencilla. Un puerto serial no "controla" a un dispositivo. Simplemente sirve de comunicación entre la PC y el hardware. En otras palabras, tienes que enviarle bytes de información a través del puerto serial, o bien, leer esos bytes del propio puerto e interpretarlos. Pero siempre debes saber, de antemano, qué bytes está esperando, cómo se contruye el búfer y cómo interpretar los bytes que te sean enviados.

Bueno, aclarado lo anterior, prosigamos. En escencia, entonces, lo que tenemos que hacer es leer y escribir bytes al puerto, ¿correcto? Pues bien, Windows trata a los puertos de la misma forma que a los archivos, aunque con un nombre establecido. El puerto "COM1" se llama "COM1:", el puerto "LPT2" se llama "LPT2:", etc. Nota que todos terminan con dos puntos (Smile.

Así, lo único que hay que hacer para escribir información en el puerto serial es hacer una llamada a las funciones del API Win32 CreateFile, ReadFile y WriteFile. Un ejemplo: vamos a enviar al puerto serial los caracteres "Hola Mundo!". Y después vamos a leer el puerto serial para sacar a la consola lo que sea que nos haya contestado nuestro hardware.



Código:

#include <windows>
#include <iostream>

#define STRING_SIZE 100

using std::cout;
using std::cin;

int main()
{
  HANDLE hComPort;
  DWORD dwBytesWritten;
  DWORD dwBytesRead;
  DWORD dwBufferSize;
  TCHAR szBuffer[STRING_SIZE];

  dwBufferSize = sizeof(TCHAR) * STRING_SIZE;

  hComPort = CreateFile(_T("COM4:"),
                  GENERIC_READ | GENERIC_WRITE, // solo pueden ser estos valores
                  0,
                  0,
                  OPEN_EXISTING, // solo puede ser OPEN_EXISTING
                  FILE_FLAG_OVERLAPPED,
                  0);
  if (hComPort == INVALID_HANDLE_VALUE)
  {    // no se pudo abrir el puerto COM4:
      cout << "No se pudo abrir el puerto COM4." << endl;
  }
  else
  {
      // leer datos desde el puerto serial
      ReadFile(hComPort, szBuffer, dwBufferSize, &dwBufferRead, NULL);
      cout << "Se leyeron " << dwBufferRead << " bytes. " <<
                    "Buffer: " << szBuffer << endl;
//AQUI DEBERIA DE LEER LOS DATOS DEL COM4 y pasarlos a un TMemo.

      // etcétera: podemos emplear WriteFile para escribir bytes.
  }

  // finalmente, cerramos el manejador
  CloseHandle(hComPort);

  return EXIT_SUCCESS;
}



Alquien puede decirme como capturar del PUERTO SERIE, no necesito escribir sino solo RECIBIR una cadena con el PESO que marque la balanza.
_________________
Muchos hombres no se equivocan jamás porque no se proponen nada razonable.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mensaje    Asunto: Estoy a vuelta con este codigo Responder citando

Estoy probando todas las variables de este CODIGO y no consigo que la BALANZA me responda:
Código:

void __fastcall TfrmBalanzaDigital::Button1Click(TObject *Sender)
{
   HWND Puerto = NULL;//Tipo HANDLE
   unsigned long bytes;//No sé para que es si no se le da un valor
   char msg[9] = {9,8,0,0,0,0,0,1};//PROTOCOLO TISA. Se le debe de mandar la cadena "98000001" (8 Caracteres) para que responda
    char RECUPERA[32];
    String NombrePuerto = "COM4";
    try
    {
        Puerto = HWND(CreateFile(NombrePuerto.w_str(),GENERIC_WRITE,0x00,0x00,OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE,0x00));
        if(WriteFile(Puerto,msg,8,&bytes,0x00))
        {
           ReadFile(Puerto,RECUPERA,32,&bytes,0x00);
            fV->MenDialogo(RECUPERA);//No consigo recuperar el Peso de la Balanza
        }
    }
    __finally
       {
         CloseHandle(Puerto); //si no se cierra se bloquea el PUERTO
        }
}
//---------------------------------------------------------------------------


Tambien he probado así y nada que no lo consigo resolver:

Código:

void __fastcall TfrmBalanzaDigital::Button1Click(TObject *Sender)
{
   HWND Puerto = NULL;//Tipo HANDLE
   DWORD bytes;//No sé para que es si no se le da un valor
   char msg[9] = {9,8,0,0,0,0,0,1};//PROTOCOLO TISA. Se le debe de mandar la cadena "98000001" (8 Caracteres) para que responda
    String NombrePuerto = "COM4";
    try
    {
        Puerto = HWND(CreateFile(NombrePuerto.w_str(),GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE, 0));
        if(WriteFile(Puerto, msg, 8, &bytes, 0))
        {
           ReadFile(Puerto, msg, 8, &bytes, 0);
            fV->MenDialogo(msg);//No consigo recuperar el Peso de la Balanza
        }
    }
    __finally
       {
         CloseHandle(Puerto); //si no se cierra se bloquea el PUERTO
        }
}
//---------------------------------------------------------------------------

_________________
Muchos hombres no se equivocan jamás porque no se proponen nada razonable.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mensaje    Asunto: Responder citando

Prueba con la siguiente función:
Código:
// Leer peso usando protocolo '$'
// (Se envia el caracter '$' y la bascula devuelve una cadena con el peso)
String LeerPeso()
{
    String ret = "";
    HANDLE com = CreateFile(TEXT("COM4"),
        GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
    if (com == INVALID_HANDLE_VALUE)
        throw Exception("No se pudo abrir el puerto serie");
    else
    {
        WriteFile(com, "$", 1, 0, NULL);
        Sleep(100);
        COMSTAT stat;
        ClearCommError(com, 0, &stat);
        if (stat.cbInQue > 0)
        {
            const DWORD bufferSize = 80;
            char buffer[bufferSize+1] = "";
            ReadFile(com, buffer, stat.cbInQue, 0, NULL);
            ret = buffer;
        }
    }
    CloseHandle(com);
    return ret;
}


En caso de que no funcione habría que ver qué modelo exacto de pesa es, que protocolos usa y cual tiene configurado. Y posiblemente entre los manuales que incluye venga los detalles del protocolo que usa.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Muchas gracias por responder, Leo...
Lo he probado y No devuelve nada.

Ten envío MANUAL TECNICO que he pedido al fabricante.
El protocolo por defecto es TISA y esto es lo que me ha respondido el servico técnico:
Te mando el Manual de Test y Ajustes de la Serie-G, tener en cuenta que por defecto las balanzas van con el protocolo Tisa.
Cadena que tienes que mandar para que conteste la balanza:
98000001
Un saludo.


Enlace al MANUAL TECNICO:
http://tpvbarman.com/descargas/49TG000ES08.pdf
_________________
Muchos hombres no se equivocan jamás porque no se proponen nada razonable.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mensaje    Asunto: Responder citando

Este 'IF' SALTA SIEMPRE:
Código:

String __fastcall TfrmBalanzaDigital::LeerPeso(void)
{
    String ret = "";
    HANDLE com = CreateFile(TEXT("COM4"),
        GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
    if (com == INVALID_HANDLE_VALUE)
        throw Exception("No se pudo abrir el puerto serie");
    else
    {
        WriteFile(com, "$", 1, 0, NULL);
        Sleep(2000);
        COMSTAT stat;
        ClearCommError(com, 0, &stat);
        if (stat.cbInQue > 0)//SALTA Y NUNCA SE EJECUTA
        {
            const DWORD bufferSize = 80;
            char buffer[bufferSize+1] = "";
            ReadFile(com, buffer, stat.cbInQue, 0, NULL);
            ret = buffer;
        }
    }
    CloseHandle(com);
    return ret;
}

_________________
Muchos hombres no se equivocan jamás porque no se proponen nada razonable.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mensaje    Asunto: Responder citando

Haz una prueba rapida con lo que he puesto arriba cambiando al linea del WriteFile por:
Código:
WriteFile(com, "98000001", 8, 0, NULL);
o
WriteFile(com, "98000001\r", 9, 0, NULL);


Si salta el if es porque ha recibido algo, habría que ver porque no lo muestra..

(Asegúrate que esta en el puerto correcto)

También puedes hacer alguna prueba manualmente usando PuTTY por ejemplo hasta que veas que funciona.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Tambien he probado a aumentar el Sleep a 2000 y tambien he probado con otros caracteres en lugar de: '$' pero sigo sin resultados.

Te envio enlace al PROGRAMA DE TEST que si funciona SELECCIONANDO EL protocolo TISA:
http://tpvbarman.com/descargas/Protocolos.exe


Foto ahora mismo del programa leyendo la balanza:
http://tpvbarman.com/descargas/Captura1.jpg
http://tpvbarman.com/descargas/Captura2.jpg
http://tpvbarman.com/descargas/Captura3.jpg
_________________
Muchos hombres no se equivocan jamás porque no se proponen nada razonable.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mensaje    Asunto: Responder citando

Según el manual que has puesto en el enlace veo que la bascula permite ajustar el protocolo a usar, y entre ellos esta el '$' que según la configuración de la bascula es el "DOLAR/SAMSUNG ESPAÑA".
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

He probado con ambos y varios más como:
Código:

WriteFile(com, "98000001", 8, 0, NULL);//No funciona
WriteFile(com, "98000001\r", 9, 0, NULL);//No funciona
WriteFile(com, "$\r", 2, 0, NULL);//No funciona


_________________
Muchos hombres no se equivocan jamás porque no se proponen nada razonable.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mensaje    Asunto: Responder citando

Por defecto viene con el PROTOCOLO 'TISA'
_________________
Muchos hombres no se equivocan jamás porque no se proponen nada razonable.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mensaje    Asunto: Responder citando

Prueba este a ver, según el manual es el que entiendo yo que debería ser, aunque teniendo el ejecutable si funciona podría ver más tarde que es lo que envía..

Código:
WriteFile(com, "98000000\r\n", 10, 0, NULL);
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Pruebo ahora mismo... un momento....
_________________
Muchos hombres no se equivocan jamás porque no se proponen nada razonable.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mensaje    Asunto: Responder citando

NADA...
me c*** en...

Muchísimas gracias por tu ayuda, pero sigo recuperar el peso.

Sé que es complejo y te agradezco muchísimo tu esfuerzo y ayuda, pero es que he estado buscando y buscando en este foro y creo que en todos los que he encontrado por Internet y no consigo solucionarlo.

Se de de buena mano de que la BALANZA está bien comunicada con el PC porque éste recoge el PESO con el PROGRAMA QUE TE HE PUESTO EL ENLACE.

Así pues, solo queda de que mi código es incorrecto.
Cualquier cosa, por favor házmelo saber, y no me canso de darte las GRACIAS.
_________________
Muchos hombres no se equivocan jamás porque no se proponen nada razonable.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mensaje    Asunto: Responder citando

PERDON, PERDON Y PERDON....

ESPERA QUE COMETÍ UN ERROR...

Ejecuté con esto:
WriteFile(com, ",98000001\r\n", 10, 0, NULL);//Se me paso una COMA

en lugar de esto:
WriteFile(com, "98000001\r\n", 10, 0, NULL);
_________________
Muchos hombres no se equivocan jamás porque no se proponen nada razonable.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mensaje    Asunto: Responder citando

Creo que ya lo tengo...
Es decir que lo has conseguido tú, claro...

me devuelve esto:
9900039200000008

Que separndolo, seri:
99 -> NO LO SE
000392 -> el peso
00000008 -> NO LO SE
_________________
Muchos hombres no se equivocan jamás porque no se proponen nada razonable.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.