简体   繁体   English

使用 Javax comm package 读取 ASCII 数据

[英]READ ASCII data using Javax comm package

I have a device sends some data to COM port, byte stream is a human readable ASCII character stream.我有一个设备向 COM 端口发送一些数据,字节 stream 是人类可读的 ASCII 字符 stream。 I tried to read the data stream from a port reader and I can read it easily like,我尝试从端口读取器读取数据 stream ,我可以轻松读取它,

Param   Flags   Value   Unit    [min-max]

WBC E 0.00 10^9/l [4.00-10.00] LYM 0.00 10^9/l [1.30-4.00]白细胞 E 0.00 10^9/l [4.00-10.00] LYM 0.00 10^9/l [1.30-4.00]

But when I'm trying to read from a java program as byte and converting to ASCII, still it shows as jargon.但是当我试图从 java 程序中读取字节并转换为 ASCII 时,它仍然显示为行话。 eg ���v� 例如“��v”

I changed array size and try various options to convert array to ASCII.我更改了数组大小并尝试了各种将数组转换为 ASCII 的选项。

Row out is like排出去就像

4C 4C 59 20 41 55 54 4F 4D 41 54 45 44 20 48 45 LLY AUTOMATED HE 4C 4C 59 20 41 55 54 4F 4D 41 54 45 44 20 48 45 LLY 自动HE

Guidance to read n proper format is highly appreciated.非常感谢阅读正确格式的指导。

Code is代码是

import java.io.*;
import java.util.*;
import javax.comm.*;

public class SimpleRead implements Runnable, SerialPortEventListener {

    static CommPortIdentifier portId;
    static Enumeration portList;
    InputStream inputStream;
    SerialPort serialPort;
    Thread readThread;
    String line = "";
    BufferedReader portReader;

    public static void main(String[] args) {
        boolean portFound = false;
        String defaultPort = "COM6";

        if (args.length > 0) {
            defaultPort = args[0];
        }

        portList = CommPortIdentifier.getPortIdentifiers();

        while (portList.hasMoreElements()) {
            portId = (CommPortIdentifier) portList.nextElement();
            if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
                if (portId.getName().equals(defaultPort)) {
                    System.out.println("Found port: " + defaultPort);
                    portFound = true;
                    SimpleRead reader = new SimpleRead();
                }
            }
        }
        if (!portFound) {
            System.out.println("port " + defaultPort + " not found.");
        }

    }

    public SimpleRead() {
        try {
            serialPort = (SerialPort) portId.open("SimpleReadApp", 2000);

        } catch (PortInUseException e) {
            e.printStackTrace();
        }

        try {

            inputStream = serialPort.getInputStream();
        } catch (Exception e) {
            e.printStackTrace();
        }

        try {
            serialPort.addEventListener(this);
        } catch (TooManyListenersException e) {
            e.printStackTrace();
        }

        serialPort.notifyOnDataAvailable(true);

        try {
            serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8,
                    SerialPort.STOPBITS_1,
                    SerialPort.PARITY_NONE);
        } catch (UnsupportedCommOperationException e) {
            e.printStackTrace();
        }

        readThread = new Thread(this);

        readThread.start();
    }

    public void run() {
        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public void serialEvent(SerialPortEvent event) {
        switch (event.getEventType()) {

            case SerialPortEvent.BI:
                System.out.println("BI");
            case SerialPortEvent.OE:
                System.out.println("OE");
            case SerialPortEvent.FE:
                System.out.println("FE");
            case SerialPortEvent.PE:
                System.out.println("PE");
            case SerialPortEvent.CD:
                System.out.println("CD");
            case SerialPortEvent.CTS:
                System.out.println("CTS");
            case SerialPortEvent.DSR:
                System.out.println("DSR");
            case SerialPortEvent.RI:
                System.out.println("RI");
            case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
                System.out.println("OUTPUT_BUFFER_EMPTY");
                break;

            case SerialPortEvent.DATA_AVAILABLE:
                System.out.println("DATA_AVAILABLE");
                byte[] readBuffer = new byte[20];

                try {
                    while (inputStream.available() > 0) {
                        int numBytes = inputStream.read(readBuffer);
                        System.out.print("The Read Bytes from SerialPort are");
                        System.out.write(readBuffer);
                        System.out.println();
                    }

                    System.out.print(new String(readBuffer));
                } catch (IOException e) {
                    e.printStackTrace();
                }

                break;
        }
    }

}

In your output you don't specify which charset you want to use.在您的 output 中,您没有指定要使用的字符集。 Since you are recieving through a serial port I would assume that the charset used is either US_ASCII or UTF_8 .由于您是通过串行端口接收数据,因此我假设使用的字符集是US_ASCIIUTF_8

To force the conversion fromt byte[] to string to use a specific charset you have to specify it.要强制从 byte[] 转换为 string 以使用特定字符集,您必须指定它。

An example for your code would be:您的代码示例如下:

System.out.print(new String(readBuffer, StandardCharsets.UTF_8));

A list of StandardCharsets in Java can be found here Java 中的标准字符集列表可以在这里找到

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM