下面是我自己实现的串口接收的类,串口发送比较简单,就直接发送就可以了。下面的这个类可以直接使用。

package com.boomdts.weather_monitor.util;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;
import javax.comm.*;
import com.boomdts.weather_monitor.biz.RecvCommand;
import com.boomdts.weather_monitor.util.SysLog;
/*
串口通信类
*/
public class SerialComm {
private int ibaudRate;
private String scomPort;
private CommPortIdentifier portId = null;
//从外设获取数据
private InputStream inStream ;
//发送命令到外设
private OutputStream outStream ;
private SerialPort serialPort;
public SerialComm(int ibaudRate, String scomPort) {
this.ibaudRate = ibaudRate;
this.scomPort = scomPort;
try {
Enumeration portList = CommPortIdentifier.getPortIdentifiers();
while (portList.hasMoreElements())
{
portId = (CommPortIdentifier) portList.nextElement();
//如果端口类型是串口则判断名称
if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
//如果是COM1端口则退出循环
System.out.println("portId = " + portId.getName());
if(portId.getName().equals(scomPort)){
break;
}else{
portId=null;
}
}
}
//打开串口的超时时间为1000ms
SerialPort serialPort = (SerialPort)portId.open("Serial_Communication", 1000);
//设置串口速率为38400,数据位8位,停止位1们,奇偶校验无
serialPort.setSerialPortParams(ibaudRate,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);
//建立好监听类以后要在port上添加。
//其中port是上文打开的串口端口,commListener是上文的监听器实例
serialPort.addEventListener(new CommListener(serialPort));
//设置监听模式为当有数据到达时唤醒监听线程。
serialPort.notifyOnDataAvailable(true);
// Set notifyOnBreakInterrup to allow event driven break handling.
serialPort.notifyOnBreakInterrupt(true);
// Set receive timeout to allow breaking out of polling loop during input handling.
serialPort.enableReceiveTimeout(30);
//发送命令到外设
OutputStream outStream = new BufferedOutputStream(serialPort.getOutputStream());
//new ReceiveThread(inStream).start();
//new SendThread(outStream).start();
} catch (IOException e) {
e.printStackTrace();
} catch (UnsupportedCommOperationException e) {
e.printStackTrace();
} catch (PortInUseException e) {
e.printStackTrace();
} catch (TooManyListenersException e) {
e.printStackTrace();
}
SysLog.logger.info("串口打开成功!");
}
}
//建立监听类,继承自javax.comm.SerialPortEventListener;
class CommListener implements SerialPortEventListener {
private StringBuffer linkWgt ;//存放获取的数据
private String sCommand ;//上传的命令
private SerialPort serialPort ;
private InputStream inStream ;
private RecvCommand recvCommand;
public CommListener(SerialPort serialPort){
recvCommand = new RecvCommand();
linkWgt = new StringBuffer();
sCommand = new String();
this.serialPort = serialPort;
try {
//从外设获取数据
this.inStream = new BufferedInputStream(serialPort.getInputStream());
} catch (IOException e) {
e.printStackTrace();
}
}
//实现监听方法
public void serialEvent(SerialPortEvent e){
int newData = 0;
byte bRead[] = {0};
String sSubStr = "";
// Determine type of event.
switch (e.getEventType()) {
// Read data until -1 is returned. If \r is received substitute
// \n for correct newline handling.
case SerialPortEvent.DATA_AVAILABLE:
while (newData != -1) {
try {
//inStream = serialPort.getInputStream();
newData = inStream.read();
if (newData == -1) {
break;
}
if ('\r' == (char)newData) {
} else {
//把0~255的int转换成两位的16进制字符串
sSubStr = Integer.toHexString((newData & 0x000000FF) | 0xFFFFFF00).substring(6);
//System.out.println(sSubStr);
linkWgt.append(sSubStr);
}
} catch (IOException ex) {
System.err.println(ex);
return;
}
}
try{
System.out.println("linkWgt 提取命令前----start-----" + linkWgt.toString() + "----end-----");
while(linkWgt.indexOf("a55a") != -1) {
linkWgt.delete(0,linkWgt.indexOf("a55a"));
if(linkWgt.indexOf("9191910000") == -1)
{
System.out.println("该命令内容错误!" + linkWgt);
} else {
sCommand =linkWgt.substring(0, linkWgt.indexOf("9191910000"));
linkWgt.delete(0,linkWgt.indexOf("9191910000"));
System.out.println("sCommand ----start-----" + sCommand + "----end-----");
recvCommand.analyze(sCommand);
}
}
}catch(Exception ew){
ew.printStackTrace();
}finally{
}
break;
// If break event append BREAK RECEIVED message.
case SerialPortEvent.BI:
System.out.println("\n--- BREAK RECEIVED ---\n");
}
}
}

java 串口通信 代码的更多相关文章

  1. java串口通信丢包

    java串口通信丢包问题 前段时间公司要求做一个java应用和pos串口通信的工具,调试好了好久每次都是只能接收到一包数据后续的数据都丢失了. 经过修改读写的流的缓存大小亲测都正常代码如下: seri ...

  2. Java串口通信具体解释

    序言 说到开源,恐怕非常少有人不挑大指称赞.学生通过开源码学到了知识,程序猿通过开源类库获得了别人的成功经验及可以按时完毕手头的project,商家通过开源软件赚到了钱……,总之是皆大欢喜.然而开源软 ...

  3. Java串口通信详细解释

    前言 说到开源.恐怕非常少有人不挑大指称赞. 学生通过开源码学到了知识,程序猿通过开源类库获得了别人的成功经验及可以按时完毕手头的project,商家通过开源软件赚到了钱……,总之是皆大欢喜. 然而开 ...

  4. Java串口通信--------基于RXTX (附带资源地址)

    最近帮老师做了一个小项目,一个牧场公司想用传感器收集一些环境信息,记录到数据库里去,然后加以分析查看.这里面和传感器通信用到了串口通信,我也是接触了一下,把用到的东西分享出来. 准备工作: RXTX: ...

  5. Java串口通信 RXTX 解决过程

    背景介绍: 由于第一次用Java与硬件通信,网上查了许多资料,在这进行整理,便于以后学习.本人串口测试是USB串口设备连接电脑,在设备管理器中找到端口名称(也可以通过一些虚拟串口工具模拟). 下面主要 ...

  6. Java 串口通信

    在Windows系统下,用Java开发串口通信相关的程序时,需要用到几个文件. (1)win32com.dll 要放在jdk\jre\bin目录下. (2)comm.jar 和javax.comm.p ...

  7. java 串口通信实现流程

    1.下载64位rxtx for java 链接:http://fizzed.com/oss/rxtx-for-java 2.下载下来的包解压后按照说明放到JAVA_HOME即JAVA的安装路径下面去 ...

  8. Java 串口通信 Ubuntu

    说一下我的操作过程吧 在Windows上先用阿猫串口网络调试助手,进行调试: 在网上找Java代码,我选择的是RXTXcomm,网上代码很多,基本都一样. 在Windows电脑上把rxtx压缩包中的r ...

  9. 【Java】基于RXTX的Java串口通信

    本篇内容参考转载自https://blog.csdn.net/kong_gu_you_lan/article/details/80589859 环境搭建 下载地址:http://fizzed.com/ ...

随机推荐

  1. [Bootstrap]全局样式(五)

    辅助样式 1.情景文本色  .text-muted  .text-primary  .text-success  .text-info  .text-warning  .text-danger  {c ...

  2. 视酷即时通讯系统应用源码 V1.0

    视酷即时通讯系统(原创),成熟稳定,拥有和微信一样强大的功能不再是梦,节省几个月研发时间迅速融合进项目中: 1.首家支持聊天室群聊 2.支持和微信一样的语音聊天,可以显示时长.未读状态,自动轮播未读语 ...

  3. win8 报file://CBD 0xc0000034 蓝屏

    出事的机子是acer aspire v5,开机直接出直蓝屏,报file:/CBD 0xc0000034,英语的意思大约是启动文件错,可以用recovery恢复之类的 现在问题1:有好些有用的文件放在了 ...

  4. [原创] linux课堂-学习笔记-课程3.Linux目录结构介绍及内核与shell分析

    一.目录说明 1.1 bin 一般用户,可执行的系统内置命令 1.2 sbin 系统管理员,可执行的系统内置命令 1.3 boot 启动文件目录,启动有关的文件都保存在此 1.4 dev 设备管理文件 ...

  5. Node.js 【使用npm安装一些包失败之笔记】

    镜像使用方法(三种办法任意一种都能解决问题,建议使用第三种,将配置写死,下次用的时候配置还在): 1.通过config命令 npm config set registry https://regist ...

  6. Python 中的引用和类属性的初步理解

    最近对Python 的对象引用机制稍微研究了一下,留下笔记,以供查阅. 首先有一点是明确的:「Python 中一切皆对象」. 那么,这到底意味着什么呢? 如下代码: #!/usr/bin/env py ...

  7. unity3d KeyCode各键值说明

    KeyCode :KeyCode是由Event.keyCode返回的.这些直接映射到键盘上的物理键. http://docs.unity3d.com/ScriptReference/KeyCode.h ...

  8. .htaccess 设置

     RewriteEngine on RewriteCond %{HTTP_HOST} ^blog.chosenet.com$RewriteCond %{REQUEST_URI} !^/blog/Rew ...

  9. hadoop可能遇到的问题

    1.hadoop运行的原理? 2.mapreduce的原理? 3.HDFS存储的机制? 4.举一个简单的例子说明mapreduce是怎么来运行的 ? 5.面试的人给你出一些问题,让你用mapreduc ...

  10. java开发命名规范总结

    一 包名的书写规范 (Package)推荐使用公司或机构的顶级域名为包名的前缀,目的是保证各公司/机构内所使用的包名的唯一性.包名全部为小写字母,且具有实际的区分意义. 1.1 一般要求1.选择有意义 ...