Encoding set caratteri dalla seriale [cp1252 to unicode]

di il
4 risposte

Encoding set caratteri dalla seriale [cp1252 to unicode]

Ho intrapreso un viaggio sulla comunicazione con la porta seriale. L'inizio è stato subito fantastico, poi il primo problema ed è un paio di giorni che ci sbatto il muso e non ho capito come risolvere il problema:
package com.marktech.seriale;

import com.fazecast.jSerialComm.*;
import com.sun.xml.internal.stream.writers.UTF8OutputStreamWriter;

import java.io.*;
import java.nio.CharBuffer;

public class Main {

    public static void main(String[] args) {

        // mi prendo la porta
        SerialPort comPort = SerialPort.getCommPorts()[0];
        //apro la comunicazione con un DCE3 (roba vecchia)        
        comPort.setBaudRate(600);
        comPort.setParity(7);
        comPort.openPort();        
        
        // do un occhio se effettivamente è la porta (unica) che ho scelto per la connessione
        System.out.println(comPort.getDescriptivePortName());        
        comPort.setComPortTimeouts(SerialPort.TIMEOUT_READ_SEMI_BLOCKING, 100, 0);
        
        InputStream in = comPort.getInputStream();
        InputStreamReader inputStreamReader;

        OutputStream out = comPort.getOutputStream();
        try
        {
            System.out.println(comPort.isOpen());

            // comando per ottenere l'help della macchina
            String datiDaInviare = new String("at&h");


            out.write(datiDaInviare.getBytes());
            char invio = 13; // carattere invio
            out.write(invio);


            try {
                inputStreamReader = new InputStreamReader(in);
                int data = inputStreamReader.read();
                System.out.println(inputStreamReader.getEncoding());

                while(data != -1) {
                    System.out.print((char) data);
                    data = inputStreamReader.read();
                }
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
                //
            }



            in.close();
        } catch (Exception e) { e.printStackTrace(); }


        comPort.closePort();


    }
}
ed ottego:
"C:\Program Files\Java\jdk1.8.0_60\bin\java" -Didea.launcher.port=7532 "-Didea.launcher.bin.path=C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 14.1.5\bin" -Dfile.encoding=windows-1252 -classpath "C:\Program Files\Java\jdk1.8.0_60\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\rt.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\ext\access-bridge.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\ext\zipfs.jar;C:\Users\11617466\Google Drive\Programmazione Java\ProgrammazioneMarcoAlberto\Seriale_02\out\production\Seriale_02;C:\Users\11617466\Google Drive\Programmazione Java\ProgrammazioneMarcoAlberto\Seriale_02\Dipendenze\jSerialComm-1.3.11.jar;C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 14.1.5\lib\idea_rt.jar" com.intellij.rt.execution.application.AppMain com.marktech.seriale.Main
Prolific USB-to-Serial Comm Port (COM3)
true
Cp1252
át¦è?¡lj-K©j-K©j-K©j-K©j-K©j-K©j-K©j-K©j-K©j-K©j-K©j-Kij
P?ÓÁ:“i,/…íx½îVë.#i3…â<¥cxk
P?ÓÅ:“i,/…íx½îVë.ke{K¥ú¿txk
P?» '›…l_txÞi½îVë.?¡Q¦(Ò ÔÅ&½î¯Íó S×2 k
 c¡Q¦Ò Z?•rVc¬+ +t«tY?• ÷³??¡Q¦.Ó Z?•rVc¬+ +t«tY?• ”éƒ3k
P?kÁ:o^k• +t«tY?• Š	3k
P?kÅ:o^k• +t«tY?• P* c¡Q¦rÒ U› Î? k
P?K±'³Å3{Æ?¡Q¦)Ò Õ Î? k
P?[Å:³Í¸{Æ?¡Q¦:Ò ¸K?õZ×±ª ÖKé.{N k
P?“±'i®Õi×±ª Z?•rVc¬+ c¡Q¦8Ò ¸K?õZ×±º ÖKé.{N k
P?±'i®Õi×±º Z?•rVc¬+ c¡Q¦*Ò ¸K?õZױἋ¥tx× c¡Q¦ªÓ ¸K?õZ×±äZ¾âZ+Ñ.?¡Q¦Ò ¸K?õZ×±[Ἃ¥tx× c¡Q¦Ó ¸K?õZ×±[äZ¾âZ+Ñ.
c¥©j-K©j-K©j-K©j-K©j-KœŠWÒ­S¸©j-K©j-K©j-K©j-K©j-K¥L?ájava.io.IOException: Underlying input stream returned zero bytes
	at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:288)
	at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
	at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
	at sun.nio.cs.StreamDecoder.read0(StreamDecoder.java:127)
	at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:112)
	at java.io.InputStreamReader.read(InputStreamReader.java:168)
	at com.marktech.seriale.Main.main(Main.java:48)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:497)
	at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)

Process finished with exit code 0

Al di la dell'errore finale, che poi sistemo, i caratteri come si evince dalla stampa sono in formato cp1252, come si fa per trasformare tutto in unicode?

4 Risposte

  • Re: Encoding set caratteri dalla seriale [cp1252 to unicode]

    MarkRider ha scritto:


                    inputStreamReader = new InputStreamReader(in);
    Al di la dell'errore finale, che poi sistemo, i caratteri come si evince dalla stampa sono in formato cp1252, come si fa per trasformare tutto in unicode?
    Se lo stream di dati letti/scritti su seriale è fatto principalmente di "caratteri", allora devi sapere tu quale è il charset da usare. E quindi specificarlo al costruttore di OutputStreamReader/InputStreamReader.

    Se lo stream è "binario" o una via di mezzo allora NON è detto che leggere/scrivere "a caratteri" sia la strada giusta.
  • Re: Encoding set caratteri dalla seriale [cp1252 to unicode]

    Avevo provato in realtà a dargli al costruttore il tipo di codifica, ma è sempre illeggibile...
    Se è binario... inizio a sentirmi male, quasi quasi provo un altro apparato XD.
  • Re: Encoding set caratteri dalla seriale [cp1252 to unicode]

    HO preso il vecchio manualone... quando ancora facevano un prodotto e se facevano i manuali fatti bene.

    Sbagliavo una cosa importantissima, la configurazione di comunicazione... avoglia a decodificare:

            //apro la comunicazione con un DCE3 (roba vecchia)
            comPort.setBaudRate(600);
            comPort.setParity(1);
            comPort.setNumStopBits(1);
            comPort.setNumDataBits(7);
            
            comPort.openPort();

    Ecco a voi il risultato di un vecchio DCE3.

    "C:\Program Files\Java\jdk1.8.0_60\bin\java" -Didea.launcher.port=7535 "-Didea.launcher.bin.path=C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 14.1.5\bin" -Dfile.encoding=windows-1252 -classpath "C:\Program Files\Java\jdk1.8.0_60\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\rt.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\ext\access-bridge.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\ext\zipfs.jar;C:\Users\11617466\Google Drive\Programmazione Java\ProgrammazioneMarcoAlberto\Seriale_02\out\production\Seriale_02;C:\Users\11617466\Google Drive\Programmazione Java\ProgrammazioneMarcoAlberto\Seriale_02\Dipendenze\jSerialComm-1.3.11.jar;C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 14.1.5\lib\idea_rt.jar" com.intellij.rt.execution.application.AppMain com.marktech.seriale.Main
    Prolific USB-to-Serial Comm Port (COM3)
    true
    UTF8
    at&h
    +-----------------------------------------------------------+
    AT&Z0: Richiama config. di fabbrica 
    AT&Z1: Richiama config. memorizzata 
    AT&W : Salvataggio config.  
    AT&B0: DCE3 connesso a MUX-F  
    AT&B1: DCE3 connesso a RED 1/0  
    AT&L0: interfaccia lato utente X/V 
    AT&L1: interfaccia lato utente G.703 
    AT&M0: Codice lato utente HDB3 
    AT&M1: Codice lato utente AMI 
    AT&I0: V13 ON   
    AT&I1: V13 OFF  
    AT&K0: V38 ON   
    AT&K1: V38 OFF  
    AT&R0: Circuito C105 forz. ON    
    AT&R1: Circuito C105 interfaccia 
    AT&C0: Circuito C107 forz. ON    
    AT&C1: Circuito C107 interfaccia 
    AT&S0: Circuito C140 abilitato   
    AT&S1: Circuito C140 disabilit.  
    AT&P0: Circuito C141 abilitato   
    AT&P1: Circuito C141 disabilit.  
    +-------------------------ENTER/ESC-------------------------+
  • Re: Encoding set caratteri dalla seriale [cp1252 to unicode]

    Stavo giusto per risponderti che il problema non era nella decodifica, ma nel formato dei dati seriali.
    Mi stavo infatti domandando dove fossero finiti il numero dei bit della parola e quanti stop bit volessi usare.
    Anch'io ne so parecchio di RS-232C ed il formato della comunicazione deve sempre essere impostato secondo lo standard.
    Vale a dire: 9600, n, 8,1 significa appunto 9600 baud, nessun bit di parità, 8 bit di codifica e 1 bit di stop.
    La presenza del bit di start, siccome è sempre e solo uno, può essere omessa.
Devi accedere o registrarti per scrivere nel forum
4 risposte