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协议方面的内容了;有需要交流的就在下面留言吧。
阅读全文
0 0
- RS232实现串口双向通讯
- 串口通讯-RS232详解
- RTX实现RS232通讯
- rs232串口通讯模块 - Delphi编程
- 基于rs232串口通讯的Verilog设计
- 基于rs232串口通讯的Verilog设计
- STM中USART串口通讯:RS232,RS485
- 什么是串口、什么是RS232、RS422、RS485串口通讯模
- RTX实时平台实现RS232通讯
- RTX实时平台实现RS232通讯
- 串口通讯编程系列之RS232接口说明
- java RS232串口通讯(电子天平数据抓取)
- 嵌入式面试之RS232-C串口通讯协议解析
- RS232串口
- How:Java实现RS232串口通信
- API实现串口通讯
- S3C2440串口通讯实现
- C#实现串口通讯
- java多线程(五) 之 设计线程安全的类
- ORA-00494: enqueue [CF] held for too long (more than 900 seconds) cause instance crash
- 网络编程·十二
- mysql GROUP BY count(*) 数据库按照月份分组在同一张表中 计算数量
- java中Collections.sort排序详解
- RS232实现串口双向通讯
- 分布式文件系统之fdfs初识
- leetcode:494. Target Sum
- Maven的安装和在Eclipse中的配置
- Example of red5-client
- 博客开启,学习之路起航,2017/5/17,大四下
- navigationcontroller在push新的viewcontroller时出现画面卡顿
- 接口加密方法(实际上也就是参数加密)
- Android Studio导入项目非常慢的解决办法