RS232实现串口双向通讯

来源:互联网 发布:mac用了vpn后 不能上网 编辑:程序博客网 时间:2024/05/23 11:12

之前对接了一个pos机设备,设备使用了RS232进行通讯,现在也完成该需求并在线上运行使用当中了,此次对接实现的功能主要是应用程序向POS机设备发送应收金额和收费时间;至此想记录一下开发过程。

一、首先,POS机设备一旦上电则会处于接收以及发送数据的状态;下面的代码片段是打开串口并写数据的一个过程:

       //设置参数        String port=portname;        String rate = "115200";        String dataBit = ""+SerialPort.DATABITS_8;        String stopBit = ""+SerialPort.STOPBITS_1;        String parity = ""+SerialPort.PARITY_NONE;        int parityInt = SerialPort.PARITY_NONE;        params.put( SerialReader.PARAMS_PORT, port ); // 端口名称        params.put( SerialReader.PARAMS_RATE, rate ); // 波特率        params.put( SerialReader.PARAMS_DATABITS,dataBit  ); // 数据位        params.put( SerialReader.PARAMS_STOPBITS, stopBit ); // 停止位        params.put( SerialReader.PARAMS_PARITY, parityInt ); // 无奇偶校验        params.put( SerialReader.PARAMS_TIMEOUT,100 ); // 设备超时时间 1秒        params.put( SerialReader.PARAMS_DELAY, 100 ); // 端口数据准备时间 1秒

        //打开串口通道并加入端口监听事件        portId = CommPortIdentifier.getPortIdentifier( port );        serialPort = ( SerialPort ) portId.open( "SerialReader", timeout );        serialPort.addEventListener( this );        serialPort.notifyOnDataAvailable( true );        serialPort.setSerialPortParams( rate, dataBits, stopBits, parity );

        //往串口写数据        outputStream = serialPort.getOutputStream();        outputStream.write(bytes3); //往串口发送数据,是双向通讯的。        outputStream.flush();        outputStream.close();

二、下面是端口监听的实现代码片段

 private static byte[] readBuffer = new byte[1024]; // 4k的buffer空间,缓存串口读入的数据 public void serialEvent( SerialPortEvent event )    {        try        {            Thread.sleep( delayRead );        }        catch ( InterruptedException e )        {        LoggerUtil.error(this.getClass(), e, e.getMessage());            e.printStackTrace();        }        switch ( event.getEventType() )        {            case SerialPortEvent.BI: // 10            case SerialPortEvent.OE: // 7            case SerialPortEvent.FE: // 9            case SerialPortEvent.PE: // 8            case SerialPortEvent.CD: // 6            case SerialPortEvent.CTS: // 3            case SerialPortEvent.DSR: // 4            case SerialPortEvent.RI: // 5            case SerialPortEvent.OUTPUT_BUFFER_EMPTY: // 2                break;            case SerialPortEvent.DATA_AVAILABLE: // 1                try                {                    // 多次读取,将所有数据读入                     while (inputStream.available() > 0) {                     numBytes = inputStream.read(readBuffer);                     }                     //打印接收到的字节数据的ASCII码                     for(int i=0;i<numBytes;i++){                     System.out.println("msg[" + numBytes + "]: [" +readBuffer[i] + "]:"+(char)readBuffer[i]);                     }//                    numBytes = inputStream.read( readBuffer );                }                catch ( IOException e )                {                LoggerUtil.error(this.getClass(), e, e.getMessage());                    e.printStackTrace();                }                break;        }    }

上面一中的writebytes是应用程序往POS机发送的数据;二中的readBuffer是接收POS发送过来的数据;而这些发送和接收的数据都是根据程序与POS机之间的协议而形成的。

在这里就先不记录pos协议方面的内容了;有需要交流的就在下面留言吧。