Procedimiento de transmisión RXTX y LRC

Entonces, tengo un dispositivo de sistema de bloqueo de tarjeta que se conecta a través del puerto serie RS-232 DB9. Esta es la primera vez que trato con un dispositivo externo usando eso. Entonces leí el manual y dice que el formato de texto del procedimiento de transmisión se define de la siguiente manera:

-El texto debe constar de hasta 500 caracteres entre STX y ETC

El área calculada de LRC varía desde el primer carácter de STX a ETX

También hay una lista de caracteres de control (STX, ETX, ACK, NAK) con sus códigos hexadecimales.

No tengo idea sobre esto. Por favor iluminame. Ah, y también, ¿podría detectar si un dispositivo está conectado o no a un puerto específico?

Me las arreglé para conectarme al puerto de comunicaciones usando este código a continuación:

public class TwoWaySerialComm
{
    protected InputStream inputStream;
    protected OutputStream outputStream;

    public TwoWaySerialComm()
    {
        super();
    }

    void connect ( String portName ) throws Exception
    {
        CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName);
        if ( portIdentifier.isCurrentlyOwned() )
        {
            System.out.println("Error: Port is currently in use");
        }
        else
        {
            CommPort commPort = portIdentifier.open(this.getClass().getName(),2000);

            if ( commPort instanceof SerialPort )
            {
                SerialPort serialPort = (SerialPort) commPort;
                serialPort.setSerialPortParams(9600,SerialPort.DATABITS_7,SerialPort.STOPBITS_1,SerialPort.PARITY_ODD);

                inputStream = serialPort.getInputStream();
                outputStream = serialPort.getOutputStream();

                (new Thread(new SerialReader(inputStream))).start();
                (new Thread(new SerialWriter(outputStream))).start();

            }
            else
            {
                System.out.println("Error: Only serial ports are handled by this example.");
            }
        }
    }

    public InputStream getInputStream() {
        return inputStream;
    }

    public void setInputStream(InputStream inputStream) {
        this.inputStream = inputStream;
    }

    public OutputStream getOutputStream() {
        return outputStream;
    }

    public void setOutputStream(OutputStream outputStream) {
        this.outputStream = outputStream;
    }

    /** */
    public static class SerialReader implements Runnable 
    {
        InputStream in;

        public SerialReader ( InputStream in )
        {
            this.in = in;
        }

        public void run ()
        {
            byte[] buffer = new byte[1024];
            int len = -1;
            try
            {
                while ( ( len = this.in.read(buffer)) > -1 )
                {
                    System.out.print(new String(buffer,0,len));
                }
            }
            catch ( IOException e )
            {
                e.printStackTrace();
            }            
        }
    }

    /** */
    public static class SerialWriter implements Runnable 
    {
        OutputStream out;

        public SerialWriter ( OutputStream out )
        {
            this.out = out;
        }

        public void run ()
        {
            try
            {
                int c = 0;
                while ( ( c = System.in.read()) > -1 )
                {
                    this.out.write(c);
                }                
            }
            catch ( IOException e )
            {
                e.printStackTrace();
            }            
        }
    }

    public static void main ( String[] args )
    {
        try
        {
            TwoWaySerialComm comm = new TwoWaySerialComm();
            comm.connect("COM3");
        }
        catch ( Exception e )
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

Y este es el código que he encontrado que se utiliza para obtener LRC de una matriz de bytes:

    public byte calculateLRC(byte[] data)
    {
        byte checksum = 0;
        for (int i = 0; i <= data.length - 1; i++) {
            checksum = (byte) ((checksum + data[i]) & 0xFF);
        }

      checksum = (byte) (((checksum ^ 0xFF) + 1) & 0xFF);
        return checksum;
    }

Ahora supuestamente tengo que enviar el texto "CES01" correctamente al dispositivo, ¿cómo hago eso?

Respuesta 1

Si no tiene absolutamente ninguna experiencia con las comunicaciones en serie, comenzaría estudiando algunas implementaciones existentes que se sabe que funcionan. La respuesta de John Ellinwood a esta pregunta SO contiene la fuente Java del protocolo XModem, un antiguo y simple protocolo de transferencia de archivos de módem. Esto le mostrará cómo manejar la comunicación en sí misma (siempre debe estar preparado para los tiempos de espera y otras condiciones de error) y los caracteres de control.

Una peculiaridad de Java que no debe olvidar es la ausencia de tipos sin firmar en Java, casi siempre estos protocolos de bajo nivel se vuelven un poco más complicados de programar si se firman los únicos tipos de variables que tiene a su disposición. Pero como muestra el código XModem, es perfectamente factible.

Respuesta: 2
STX :start character 
ETX: end character 
ACK : Acknowledgement 

    char STX = 0x02;
char ETX = 0x03;
char EOT = 0x04;
char ENQ = 0x05;
char ACK = 0x06;

Vea también el enlace para el formato de mensaje LIS / RIS

http://www.hl7standards.com/

enviando acuse de recibo

public void sendAcknowledgement()throws IOException{
         String ack= ASCIITable.ACK + "";
         outputStream.write(ack.getBytes());
    }
Respuesta: 3

Tenemos una aplicación Java donde antes de todo esto se hacía en la función de ejecución de la aplicación multiproceso. Ahora estamos moviendo algunos códigos a una función separada. Tenemos que hacer algunas variables ...

Digamos que quiero usar un objeto Car en mi código, ¿cuándo debería usar un patrón singleton en lugar de solo llamar al objeto una vez? (Después de leer un poco, la gente dice que es fácil usar mal el patrón singleton, así que yo ...

OK, el encabezado lo dice. Quiero poder crear mis propios controles, como botones, vistas de texto, cuadros de edición de texto, hilanderos, etc. Puedo crear las imágenes en CS5, pero ¿cómo puedo convertir esas imágenes en ...

Estoy usando https://github.com/mbknor/mbknor-jackson-jsonSchema para generar el esquema json pero cuando mi objeto contiene LocalDate, LocalDate se verá así: "LocalDate": {"type": "...