串口RXTX通信实时监听文件读取
时间:2019-10-22
本文章向大家介绍串口RXTX通信实时监听文件读取,主要包括串口RXTX通信实时监听文件读取使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
由于是网络串口通信,字节传输,所以考虑到各种情况
- 中文乱码,(UTF-8)
- 传输和接收都是按字节的,会出现粘包/拆包问题。
- 网络通讯往往是间断性的,一串字节往往分几批进行发送。
设置串口的listener
1 @Override 2 public void serialEvent(SerialPortEvent arg0) { 3 if(arg0.getEventType() == SerialPortEvent.DATA_AVAILABLE) {//数据通知 4 byte[] bytes = readData(serialPort); 5 System.out.println("收到的数据长度:"+bytes.length); 6 String receiveData = null; 7 receiveData = new String(bytes); 8 System.out.println("收到的数据:" + receiveData); 9 handleReceiveData(receiveData); 10 } 11 }
网上很多都是按这种方式读取的,这种方式我感觉会出现很多问题,所以不建议
1 /** 2 * 从串口读取数据 3 * @param serialPort 要读取的串口(不建议) 4 * @return 读取的数据 5 */ 6 private static byte[] readData(SerialPort serialPort) { 7 InputStream is = null; 8 byte[] bytes = null; 9 try { 10 is = serialPort.getInputStream();//获得串口的输入流 11 int bufflenth = is.available();//获得数据长度 12 while (bufflenth != 0) { 13 bytes = new byte[bufflenth];//初始化byte数组 14 is.read(bytes); 15 bufflenth = is.available(); 16 } 17 } catch (IOException e) { 18 logger.error("串口异常,停止服务。", e); 19 System.exit(-1); 20 } finally { 21 try { 22 if (is != null) { 23 is.close(); 24 is = null; 25 } 26 } catch(IOException e) { 27 e.printStackTrace(); 28 } 29 } 30 return bytes; 31 }
因为is.available()方法是估值,网络传输不能使用此方法。
目前我使用的是按一个字节读取,直到inputStream.read(byte) == 0为结束。
1 private static byte[] readData(SerialPort serialPort) { 2 InputStream in = null; 3 byte[] bytes = {}; 4 try { 5 in = serialPort.getInputStream(); 6 // 缓冲区大小为一个字节 7 byte[] readBuffer = new byte[1]; 8 int bytesNum = in.read(readBuffer); 9 int sum = bytesNum; 10 while (bytesNum > 0) { 11 bytes = concat(bytes, readBuffer); 12 bytesNum = in.read(readBuffer); 13 } 14 } catch (IOException e) { 15 e.printStackTrace(); 16 } finally { 17 try { 18 if (in != null) { 19 in.close(); 20 in = null; 21 } 22 } catch (IOException e) { 23 e.printStackTrace(); 24 } 25 } 26 return bytes; 27 28 }
此种方法可能一股脑接收了多次数据,以"\n" 为传输一次的分割。处理接收到的字符串
1 private static synchronized void handleReceivedData(String data) { 2 System.out.println("handleReceivedData--->" + data); 3 if(data == null){ 4 System.out.println("收到的数据为null,不处理。"); 5 }else { 6 if(!data.endsWith("\\n")) { 7 allReceiveString += data; 8 return ; 9 } 10 data = allReceiveString + data; 11 allReceiveString = ""; 12 String[] strs = data.split("\\\\n"); 13 System.out.println("收到的次数:" + strs.length); 14 for (String str : strs) { 15 System.out.println(str); 16 } 17 } 18 19 }
原文地址:https://www.cnblogs.com/zchok/p/11718451.html
- 物流行业迎变革,云计算是基础,大数据是关键
- Socket学习总结系列(二) -- CocoaAsyncSocket
- 比特币勒索病毒肆虐,腾讯云安全专家给你支招
- HTML5 直播协议之 WebSocket 和 MSE
- IoC在ASP.NET Web API中的应用
- 跟鹅厂老司机学技术之一:“遇见” Kotlin
- 简单的 H5 视频推流解决方案
- 来腾讯云开发者实验室学习.NET
- 跨域资源共享(CORS)在ASP.NET Web API中是如何实现的?
- 使用腾讯云 GPU 学习深度学习系列之六:物体的识别与定位
- npm5 新版功能特性解析及与 yarn 评测对比
- H5直播避坑指南
- 龙门阵之 DevOps 门外汉须知
- 全面进阶 H5 直播(上)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法