Java实现串口数据读写

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


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位。

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值