Page 1 of 2

LEER PUERTO SERIAL VIA RDP / SOLUCIONADO PARA LOCAL Y REMOTO

PostPosted: Sat Jan 28, 2017 4:20 pm
by russimicro
Buen dia...

Actualmente leo el puerto serial de una bascula en un pc o modo local, sin problemas, pero
ahora requiero leerlo desde una conexión o sesión tipo terminal server o RDP, todo sobre windows

La conexión debe ser por terminal server y no por red, alguien ha trabajado ese tema

Gracias

Johnson Russi

Re: LEER PUERTO SERIAL VIA RDP

PostPosted: Mon Jan 30, 2017 5:16 pm
by benjiben143
Hola buenos dias


1-conectar una maquina que lea el puerto serial
2.cada vez que lee grabarlo en la base de datos ( sql, mysql)
bascula peso


3. cada vez que ocupes el peso solicitar el dato

de esta manera

puedes consultar de cualquier parte el peso de x bascula

asi lo hacemos en la empresa

saludos

Re: LEER PUERTO SERIAL VIA RDP

PostPosted: Mon Jan 30, 2017 7:30 pm
by russimicro
Gracias por su respuesta.

la situación es la siguiente:

En sistemas POS con múltiples cajas , para lograr mejor rendimiento , se hace a través de terminal server - RDP, donde el servidor puede ser local o en Internet ( escritorio remoto).

Si pruebo la lectura del puerto serial en modo local o estación funciona perfecto , pero si ya estoy conectado vía escritorio remoto no lee nada y no marca ningún error.

Uso :
OpenComm ...
....
ReadComm( nComm, @cBuffer) // en modo local : retorna ejp : 0.065 pero en modo escritorio remoto, el retorno es vacío,
ahora desde el sistema operativo en el mismo escritorio remoto si retorna el peso asi: c:\xx\TYPE COM4 ....0.065 0.065 0.065 0.065 ... o usando hyperterminal tambien retorna el peso .

La duda queda entonces en como funciona ReadComm(),, desde una sesión de escritorio remoto

Nota : al conectarme vía escritorio remoto active los recursos locales a usar en la sesión remota

Gracias

Johnson Russi

Re: LEER PUERTO SERIAL VIA RDP / function readComm ??

PostPosted: Mon Jan 30, 2017 8:35 pm
by benjiben143
Hola buenas tardes

ya tienes mapeado el puerto en el terminal server

Re: LEER PUERTO SERIAL VIA RDP / function readComm ??

PostPosted: Mon Jan 30, 2017 9:33 pm
by russimicro
Benjamín , buena tarde...

En windows 7, no aparecen en administración de dispositivos los puertos seriales remotos...
Solo se pueden ver desde el prompt con c:\ mode comx o hyperterminal ...

No se si en windows 7 se pueden mapear o es exclusivo para windows server ??

Johnson Russi

Re: LEER PUERTO SERIAL VIA RDP / function readComm ??

PostPosted: Tue Jan 31, 2017 11:06 am
by armando.lagunas
Probaste con esto?

Image

Re: LEER PUERTO SERIAL VIA RDP / function readComm ??

PostPosted: Tue Jan 31, 2017 12:02 pm
by russimicro
Si,,

Nota : al conectarme vía escritorio remoto active los recursos locales a usar en la sesión remota

Re: LEER PUERTO SERIAL VIA RDP / function readComm ??

PostPosted: Tue Jan 31, 2017 1:41 pm
by russimicro
Buen dia...

Para Antonino Linares ...

Para descartar el tema de mapeo en sesiones remota, adapte un código de java para leer puertos seriales,
y el resultado es que funciona muy bien tanto en modo local como en sesiones remota.

Queda entonces la duda de porque el ReadComm( nComm, @cBuffer) , se conecta al puerto pero no retorna ninguna cadena...(solo en sesión remota)

Gracias

Johnson Russi

Anexo código de java

Code: Select all  Expand view

package comunication;

import gnu.io.CommPortIdentifier;
import gnu.io.PortInUseException;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;
import gnu.io.UnsupportedCommOperationException;
import java.io.*;
import java.util.*;


/**
 * Este es un ejemplo de uso del API de Comunicaciones Java que permite la
 * lectura de información a través de uno de los puertos serie de la
 * máquina en que se ejecuta.
 * El ejemplo se ha probado en Windows y Solaris, utilizando la línea
 * de código que identifica el puerto a utilizar correspondiente
 */


public class Comunication implements Runnable,SerialPortEventListener {
  static CommPortIdentifier idPuerto;
  static Enumeration listaPuertos;
  InputStream entrada;
  SerialPort puertoSerie;
  Thread tLectura;

  // En este ejemplo implementa un thread que es el que se encarga de
  // que la aplicación se quede esperando en el puerto que se haya
  // abierto a que se reciban datos.
  // Primero abre el puerto y luego le fija los parámetros
  public Comunication() {
    // Si el puerto no está en uso, se intenta abrir
    try {
      puertoSerie = (SerialPort)idPuerto.open( "AplLectura",2000 );
    } catch( PortInUseException e ) {
    System.out.println(e);
    }
    // Se obtiene un canal de entrada
    try {
      entrada = puertoSerie.getInputStream();
    } catch( IOException e ) {
    System.out.println(e);
    }
     
    // Añadimos un receptor de eventos para estar informados de lo
    // que suceda en el puerto
    try {
      puertoSerie.addEventListener( this );
      } catch( TooManyListenersException e ) {
          System.out.println("Peso : ");
          System.out.println(e);
          }
   
    // Hacemos que se nos notifique cuando haya datos disponibles
    // para lectura en el buffer de la puerta
    puertoSerie.notifyOnDataAvailable( true );
   
    // Se fijan los parámetros de comunicación del puerto
    try {
      puertoSerie.setSerialPortParams( 9600,
        SerialPort.DATABITS_8,
        SerialPort.STOPBITS_1,
        SerialPort.PARITY_NONE );
    } catch( UnsupportedCommOperationException e ) {
        System.out.println(e);
    }
   
    // Se crea y lanza el thread que se va a encargar de quedarse
    // esperando en la puerta a que haya datos disponibles
    tLectura = new Thread( this );
    tLectura.start();
    }
 
    @Override
  public void run() {
    try {
      // En los threads, hay que procurar siempre que haya algún
      // método de escape, para que no se queden continuamente
      // bloqueados, en este caso, la comprobación de si hay datos
      // o no disponibles en el buffer de la puerta, se hace
      // intermitentemente
        System.out.println("Entra hilo");
      Thread.sleep( 2000 );
    } catch( InterruptedException e )
    {
   
        System.out.println(e);
    }
    }

 
    @Override
  public void serialEvent( SerialPortEvent _ev ) {
      System.out.println("Entra evento serial");
    switch( _ev.getEventType() ) {
      // La mayoría de los eventos no se trata, éstos son los
      // que se producen por cambios en las líneas de control del
      // puerto que se está monitorizando
      case SerialPortEvent.BI:
      case SerialPortEvent.OE:
      case SerialPortEvent.FE:
      case SerialPortEvent.PE:
      case SerialPortEvent.CD:
      case SerialPortEvent.CTS:
      case SerialPortEvent.DSR:
      case SerialPortEvent.RI:
      case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
        break;
      // Cuando haya datos disponibles se leen y luego se
      // imprime lo recibido en la consola
      case SerialPortEvent.DATA_AVAILABLE:
        byte[] bufferLectura = new byte[20];
        try {
          while( entrada.available() > 0 ) {
            int nBytes = entrada.read( bufferLectura );
            }
          System.out.print( new String(bufferLectura) );
         
         
        } catch( IOException e ) {
        System.out.println(e);
        }
        break;
      };
      //System.out.println("validar datos leídos y si son validos salir del app : ");
      //System.exit(-1);
    }
 
 
  public static void main( String[] args ) {
    // Lista de los puertos disponibles en la máquina. Se carga en el
    // mimo momento en que se inicia la JVM de Java
    listaPuertos = CommPortIdentifier.getPortIdentifiers();

    while( listaPuertos.hasMoreElements() ) {
      idPuerto = (CommPortIdentifier)listaPuertos.nextElement();
      if( idPuerto.getPortType() == CommPortIdentifier.PORT_SERIAL ) {
        if( idPuerto.getName().equals("COM4") ) {           // WINDOWS
          // Lector del puerto, se quedará esperando a que llegue algo
          // al puerto
          Comunication lector = new Comunication();
          }
        }
      }
    }
  }

 


codigo xharbour a manera de prueba básica... lectura de sarta

Code: Select all  Expand view


#include "FiveWin.ch"

LeerSerial()

function LeerSerial()

   local oDlg, nComm := InitComm()  , nStatus := "ok"

   alerta("entro")

   BytesAtPort( nComm, nStatus )

   CloseComm( nComm )

   alerta("salio")

return nil

function InitCOMM()

   local cDcb, nError, nBytes
   local nComm := OpenComm( "COM4", 1024, 128 )

   if ! BuildCommDcb( "COM4:9600,n,8,1", @cDcb )
      MsgStop( "Error BUILD!" )
      return .f.
   endif

   #ifdef __CLIPPER__
      if ! SetCommState( cDcb )
   #else
      if ! SetCommState( nComm, cDcb )
   #endif
      MsgStop( "Error SETCOMM!" )
      return .f.
   endif


return nComm

function BytesAtPort( nComm, nStatus )

   local cBuffer := Space(20 ), x := 0, nBytes := 0


//  n := ReadComm( nComm, @cBuffer)  // <<<<---- program will lock here


   for x := 1 to 20
       n := ReadComm( nComm, @cBuffer)  // <<<<---- program will lock here

       if n > 0
          exit
       endif

   next x

   Msginfo( AllTrim( cBuffer ))

return nil
 

Re: LEER PUERTO SERIAL VIA RDP / readComm ?? Para Antonio

PostPosted: Wed Feb 01, 2017 11:11 am
by Antonio Linares
En local funciona bien ?

Solo falla en sesión remota ?

Re: LEER PUERTO SERIAL VIA RDP / readComm ?? Para Antonio

PostPosted: Wed Feb 01, 2017 2:52 pm
by russimicro
Buen dia... Antonio

Solo en sesiones remotas , pero no marca error , solo que el retorno es vació

Johnson Russi

Re: LEER PUERTO SERIAL VIA RDP / readComm ?? Para Antonio

PostPosted: Fri Feb 03, 2017 10:41 am
by Antonio Linares
Comprueba que valor devuelve GetCommError( nComm ) a continuación de llamar a ReadComm()

Re: LEER PUERTO SERIAL VIA RDP / readComm ?? Para Antonio

PostPosted: Fri Feb 03, 2017 1:02 pm
by russimicro

n := ReadComm( nComm, @cBuffer)
alert( GetCommError( nComm ) ) // = 0.00 valor retornado
alert(n) // = 0.00 valor retornado
alert(cBuffer) // retorno vacio


Re: LEER PUERTO SERIAL VIA RDP / readComm ?? Para Antonio

PostPosted: Mon Feb 06, 2017 10:42 pm
by russimicro
Antonio... Buena tarde

Para recordarle el problema de readComm en sesiones remotas
ya seguí sus recomendaciones y no funciona


Saludos


Johnson Russi

Re: LEER PUERTO SERIAL VIA RDP / readComm ?? Para Antonio

PostPosted: Tue Feb 07, 2017 7:08 am
by Antonio Linares
Prueba a llamar a SysRefresh() desde aqui:

Code: Select all  Expand view
  for x := 1 to 20
       n := ReadComm( nComm, @cBuffer)  // <<<<---- program will lock here

       if n > 0
          exit
       endif

       SysRefresh()
   next x
 

Re: LEER PUERTO SERIAL VIA RDP / readComm ?? Para Antonio

PostPosted: Tue Feb 07, 2017 2:19 pm
by russimicro
Buen día... Antonio

Incluí el sysrefresh(), y sigue igual.

He encontrado lo siguiente : en sesiones remotas los puertos seriales no se listan en la opción de Windows : panel de control /sistema / administración de dispositivos, y solo se visualizan con el comando "MODE" , hyperterminal , app en java , etc , pero si instalo un producto de terceros para usar los puertos usb y seriales en sesiones remotas (USB for Remote Desktop by fabulatech.com - por cierto muy costoso ), ya se puedan usar, y desde luego ya se visualizan de forma igual a equipos locales y la orden ReadComm, ahora si retorna el peso de la bascula.¨

Deduzco : Que aplicaciones como hyperterminal o desarrollo en java (la estoy usando ) , si pueden leer el puerto así no este listado en la sesión "administración de dispositivos" , pero ReadComm no.

Seguiré esperando su valiosa colaboración, ya que el costo de "USB for Remote Desktop by fabulatech.com", es muy alto y pasarme a una red tradicional, es imposible dada la cantidad de estaciones de trabajo, siendo así solo podría usar terminal server o cliente / servidor

Johnson Russi