FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour LEER PUERTO SERIAL VIA RDP / SOLUCIONADO PARA LOCAL Y REMOTO
Posts: 410
Joined: Sun Jan 31, 2010 03:30 PM
LEER PUERTO SERIAL VIA RDP / SOLUCIONADO PARA LOCAL Y REMOTO
Posted: Sat Jan 28, 2017 04:20 PM

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

Posts: 120
Joined: Wed Mar 11, 2009 07:32 PM
Re: LEER PUERTO SERIAL VIA RDP
Posted: Mon Jan 30, 2017 05:16 PM

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

  1. 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

Benjamin Casarrubias Moreno
Cd. Obreg贸n, Sonora, M茅xico
chino72vale@hotmail.com
Fivewin 24.04, Harbour 3.3, xharbour 1.2.1, Fivelinux, Visual Estudio 2022
Oracle Api Rest, SDK Contpaq, Facturaci贸n Electr贸nica, XML DIOT 2025
Posts: 410
Joined: Sun Jan 31, 2010 03:30 PM
Re: LEER PUERTO SERIAL VIA RDP
Posted: Mon Jan 30, 2017 07:30 PM

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

Posts: 120
Joined: Wed Mar 11, 2009 07:32 PM
Re: LEER PUERTO SERIAL VIA RDP / function readComm ??
Posted: Mon Jan 30, 2017 08:35 PM

Hola buenas tardes

ya tienes mapeado el puerto en el terminal server

Benjamin Casarrubias Moreno
Cd. Obreg贸n, Sonora, M茅xico
chino72vale@hotmail.com
Fivewin 24.04, Harbour 3.3, xharbour 1.2.1, Fivelinux, Visual Estudio 2022
Oracle Api Rest, SDK Contpaq, Facturaci贸n Electr贸nica, XML DIOT 2025
Posts: 410
Joined: Sun Jan 31, 2010 03:30 PM
Re: LEER PUERTO SERIAL VIA RDP / function readComm ??
Posted: Mon Jan 30, 2017 09:33 PM

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

Posts: 346
Joined: Mon Oct 05, 2009 03:35 PM
Re: LEER PUERTO SERIAL VIA RDP / function readComm ??
Posted: Tue Jan 31, 2017 11:06 AM
Probaste con esto?

SkyPe: armando.lagunas@hotmail.com

Mail: armando.lagunas@gmail.com
Posts: 410
Joined: Sun Jan 31, 2010 03:30 PM
Re: LEER PUERTO SERIAL VIA RDP / function readComm ??
Posted: Tue Jan 31, 2017 12:02 PM

Si,,

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

Posts: 410
Joined: Sun Jan 31, 2010 03:30 PM
Re: LEER PUERTO SERIAL VIA RDP / function readComm ??
Posted: Tue Jan 31, 2017 01:41 PM
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 (fw): Select all Collapse
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 (fw): Select all Collapse
#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
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: LEER PUERTO SERIAL VIA RDP / readComm ?? Para Antonio
Posted: Wed Feb 01, 2017 11:11 AM

En local funciona bien ?

Solo falla en sesi贸n remota ?

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 410
Joined: Sun Jan 31, 2010 03:30 PM
Re: LEER PUERTO SERIAL VIA RDP / readComm ?? Para Antonio
Posted: Wed Feb 01, 2017 02:52 PM

Buen dia... Antonio

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

Johnson Russi

Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: LEER PUERTO SERIAL VIA RDP / readComm ?? Para Antonio
Posted: Fri Feb 03, 2017 10:41 AM

Comprueba que valor devuelve GetCommError( nComm ) a continuaci贸n de llamar a ReadComm()

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 410
Joined: Sun Jan 31, 2010 03:30 PM
Re: LEER PUERTO SERIAL VIA RDP / readComm ?? Para Antonio
Posted: Fri Feb 03, 2017 01:02 PM


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

Posts: 410
Joined: Sun Jan 31, 2010 03:30 PM
Re: LEER PUERTO SERIAL VIA RDP / readComm ?? Para Antonio
Posted: Mon Feb 06, 2017 10:42 PM

Antonio... Buena tarde

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

Saludos

Johnson Russi

Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: LEER PUERTO SERIAL VIA RDP / readComm ?? Para Antonio
Posted: Tue Feb 07, 2017 07:08 AM
Prueba a llamar a SysRefresh() desde aqui:

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

       if n > 0
          exit
       endif

       SysRefresh()
   next x
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 410
Joined: Sun Jan 31, 2010 03:30 PM
Re: LEER PUERTO SERIAL VIA RDP / readComm ?? Para Antonio
Posted: Tue Feb 07, 2017 02:19 PM

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