Java实现串口数据读写

来源:互联网 发布:centos开机进入grub 编辑:程序博客网 时间:2024/04/19 23:25

最近的一个项目中需要将扫码枪读取到的数据取出,但是因为扫码枪是用串口传输数据的,比较少见,所以记录一下,当给自己做一个小结,有需要的同学也能参考一下。


public class receiveData implements SerialPortEventListener{    protected static CommPortIdentifier portid = null;  //通讯端口标识符    protected static SerialPort comPort = null;         //串行端口    protected int BAUD = 9600;  //波特率    protected int DATABITS = SerialPort.DATABITS_8;;  //数据位    protected int STOPBITS = SerialPort.STOPBITS_1;  //停止位    protected int PARITY = SerialPort.PARITY_NONE;  //奇偶检验    private static OutputStream oStream;    //输出流    private static InputStream iStream;     //输入流    private static String data="";    StringBuilder buf = new StringBuilder(128); /*    public static void main(String[] args) {        receiveData my = new receiveData();        my.setSerialPortNumber();    }*/    /**     * 读取所有串口名字     */     private void listPortChoices() {         CommPortIdentifier portId;         Enumeration en = CommPortIdentifier.getPortIdentifiers();         while (en.hasMoreElements()) {             portId = (CommPortIdentifier) en.nextElement();             if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {                 System.out.println(portId.getName());             }         }     }     /**      * 设置串口号      * @param Port      * @return      */     public void setSerialPortNumber() {              String osName = null;         String osname = System.getProperty("os.name", "").toLowerCase();         if (osname.startsWith("windows")) {             // windows             osName = "COM1";         } else if (osname.startsWith("linux")) {             // linux             osName = "/dev/ttyS1";         }          System.out.println(osName);         try {             portid = CommPortIdentifier.getPortIdentifier(osName);             if(portid.isCurrentlyOwned()){                 System.out.println("端口在使用");             }else{                 comPort = (SerialPort) portid.open(this.getClass().getName(), 1000);             }         } catch (PortInUseException e) {             System.out.println("端口被占用");             e.printStackTrace();         } catch (NoSuchPortException e) {             System.out.println("端口不存在");             e.printStackTrace();         }           try {            iStream = comPort.getInputStream(); //从COM1获取数据            oStream = comPort.getOutputStream();         } catch (IOException e) {                e.printStackTrace();        }                   try {            comPort.addEventListener(this);       //给当前串口增加一个监听器            comPort.notifyOnDataAvailable(true);  //当有数据是通知        } catch (TooManyListenersException e) {            e.printStackTrace();        }                  try {            //设置串口参数依次为(波特率,数据位,停止位,奇偶检验)            comPort.setSerialPortParams(this.BAUD, this.DATABITS, this.STOPBITS, this.PARITY);        } catch (UnsupportedCommOperationException e) {            System.out.println("端口操作命令不支持");            e.printStackTrace();        }                  try {                              } catch (IOException e) {            e.printStackTrace();        }     }    @Override    public void serialEvent(SerialPortEvent event) {        switch (event.getEventType()) {            case SerialPortEvent.BI:            case SerialPortEvent.OE:            case SerialPortEvent.FE:            case SerialPortEvent.PE:            case SerialPortEvent.CD:            case SerialPortEvent.CTS:            case SerialPortEvent.DSR:            case SerialPortEvent.RI:            case SerialPortEvent.OUTPUT_BUFFER_EMPTY:                break;            case SerialPortEvent.DATA_AVAILABLE:// 当有可用数据时读取数据,并且给串口返回数据                try {                    while(iStream.available() > 0) {                       char dd = (char)iStream.read();                       data = data+String.valueOf(dd);                       System.out.println(data);                    }if(iStream.available()<=0){                    }                } catch (Exception e) {                }                break;        }    }}

这里我用的是rxtx的一些功能,需要注意的是需要在电脑上配置一下环境才能正确输出串口数据,不然这段代码会报错。
配置环境也很简单,只需要将 rxtxSerial.dell 和 rxtxParallel.dell 这两个扩展文件拷贝到 C 盘下的 System32文件夹下就可以了

有需要下载rxtx包和配置文件的可以点击rxtx包及扩展文件 下载,这里有32位和64位。

0 0
原创粉丝点击