RS232实现串口双向通讯

之前对接了一个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协议方面的内容了;有需要交流的就在下面留言吧。












  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值