Diferencias, un dispositivo tiene el puerto serie y hay que ponerle un adaptador al equipo USB-RS232 (la que da problemass) y el otro dispositivo, lleva ese adaptador incorporado en el interior, pues resulta que el que lo lleva en el interior me lee la cadena completa, mientras que la que tiene el adaptador externo, me lee primero un byte, y en la siguiente lectura el resto.
Pongo el código:
En el díálogo en el que se hace la lectura:
- Code: Select all Expand view RUN
oDlg:bCommNotify = { | nComm, nStatus | leer_tiempo(ncomm, @abuffer)}
ACTIVATE DIALOG oDlg on init {nComm := CheckPortSerial( oDlg )}
Las dos rutinas:
- Code: Select all Expand view RUN
STATIC FUNCTION leer_tiempo(ncom, buffer)
LOCAL bloque:= SPACE(100),bcc1,nBytes:=0,i:=1 ,cmrnsaje:=""
DO WHILE .t.
nBytes := ReadComm( ncom,@bloque)
i++
IF i > 20 .or. bloque <> SPACE(100)
if substr(bloque,21,1)<>":".and.substr(bloque,29,1)$"1234567890"
aadd(buffer,strtran(substr(bloque,17,13)," ","0"))
endif
EXIT
ENDIF
ENDDO
flushcomm(ncom,1)
RETURN
STATIC FUNCTION CheckPortSerial( oDlg)
LOCAL nCom, cDcb, nbytes, bloque:=" "
BEGIN SEQUENCE
nCom = OPENCOMM( puerto, 16384, 16384 )
IF nCom < 0
MSGSTOP( "ERROR! DE APERTURA DEL PUERTO SERIAL "+puerto )
BREAK
ENDIF
BUILDCOMMDCB( puerto+":9600,N,8,1", @cDcb )
IF !SETCOMMSTATE( nCom, cDcb )
MSGSTOP( "ERROR! DE CONFIGURACION DEL PUERTO SERIAL "+ puerto )
BREAK
ENDIF
ENABLECOMMNOTIFICATION( nCom, odlg:hwnd, 1, -1 )
IF ! SetCommState( ncom, cDcb )
nError = GetCommError( ncom)
MsgInfo( "Error al setear: " + Str( nError ) )
BREAK
endif
RECOVER
nCom = -1
END SEQUENCE
IF ( nBytes := WriteComm( ncom, CHR(35)+"PL Tablet conectada"+CHR(9)+CRLF)) > 0
ReadComm( ncom, @bloque)
endif
RETURN nCom
Si veís algo que yo no vea os lo agradecería, lo he trazado con "msginfo", por lo que he podido ver como un dispositivo me parte el mensaje que leo en el puerto, mientras que el otro no.
Muchas gracias.
Saludos