Un problema con el puerto Comm

Un problema con el puerto Comm

Postby groiss » Wed Apr 03, 2024 8:33 am

Buenos días, os cuento porque no encuentro explicación y varios ojos ven mas que dos. Tengo dos dispositivos que envían en determinados eventos una cadena de texto fija en la que figura la hora los minutos los segundos y las milésimas por el puerto serie, ambas envían exactamente lo mismo.
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


oDlg:bCommNotify = { | nComm, nStatus | leer_tiempo(ncomm, @abuffer)}  

ACTIVATE DIALOG oDlg on init {nComm := CheckPortSerial( oDlg )}

 


Las dos rutinas:
Code: Select all  Expand view

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
groiss
 
Posts: 220
Joined: Tue Sep 01, 2009 7:55 am
Location: Plasencia - ESPAÑA

Re: Un problema con el puerto Comm

Postby karinha » Wed Apr 03, 2024 12:29 pm

Mejor és usar hbcomm.lib.

Regards, saludos.
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7225
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Google [Bot] and 12 guests