Page 1 of 2
LEER PUERTO SERIAL VIA RDP / SOLUCIONADO PARA LOCAL Y REMOTO
Posted: 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
Posted: 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
Posted: 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 ??
Posted: 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 ??
Posted: 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 ??
Posted: Tue Jan 31, 2017 11:06 am
by armando.lagunas
Probaste con esto?
Re: LEER PUERTO SERIAL VIA RDP / function readComm ??
Posted: 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 ??
Posted: 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
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
#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
Posted: 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
Posted: 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
Posted: 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
Posted: 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
Posted: 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
Posted: Tue Feb 07, 2017 7:08 am
by Antonio Linares
Prueba a llamar a SysRefresh() desde aqui:
Code: Select all
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
Posted: 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