Как получить правильную строку из Arduino через SerialEventListener - PullRequest
0 голосов
/ 22 мая 2019

Я пытаюсь напечатать строку в консоль, которая отправляется из Arduino в программу Java на моем компьютере (которая работает под управлением 64-битной Windows 10 с версией Eclipse 2019-03) с использованием SerialPortEventListener. Событие происходит, но когда я пытаюсь напечатать полученные данные (строку), я получаю либо бред, либо вопросительный знак.

Дополнительно на консоль выводится предупреждение:

ПРЕДУПРЕЖДЕНИЕ: несоответствие версии RXTX версия Jar = собственная библиотека RXTX-2.2pre1 Version = RXTX-2.2pre2 "Я не знаю, связано ли это с моей печатью проблема, я не могу избавиться от этого сообщения после загрузки RXTX-2.2 версия от http://jlog.org/rxtx-win.html и добавление файлов в путь сборки и lib / ext

Я пытался закодировать этот массив байтов в UTF-8, UTF-16, UTF-32 и US-ASCII, но все, что я получил тогда, это вопросительные знаки вместо тарабарщины.

public class TwoWaySerialComm
{
    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(57600,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);

                InputStream in = serialPort.getInputStream();
                OutputStream out = serialPort.getOutputStream();

                (new Thread(new SerialWriter(out))).start();

                serialPort.addEventListener(new SerialReader(in));
                serialPort.notifyOnDataAvailable(true);

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

    /**
     * Handles the input coming from the serial port. A new line character
     * is treated as the end of a block in this example. 
     */
    public static class SerialReader implements SerialPortEventListener 
    {
    Scanner scanner;
        private InputStream in;
        private byte[] buffer = new byte[1024];

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

        public void serialEvent(SerialPortEvent event) {
            int data;
            StringBuilder value = new StringBuilder();

          if (event.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
            try
            {
                int len = 0;
                while ( ( data = in.read()) > -1 )
                {
                    if ( data == '\n' ) {
                        break;
                    }
                    buffer[len++] = (byte) data;
                }
                String s = new String(buffer,0,len);
               // String s = new String(buffer, Charset.forName("UTF-32"));



            }
            catch ( IOException e )
            {
                e.printStackTrace();
                System.exit(-1);
            }             
        }
        }

    }

}
...