java开发串口步骤

1 篇文章 0 订阅
在做过一年多的RXTX操作串口项目有现在把一些平时遇到的问题在这里写写: 
RXTX是一个开源包,主要是在COMM开源包中做扩张,以前的COMM包只能在WINDOWS下面对串口或并口做操作,扩充后的RXTX可以在LINUX和MAC下对串口和并口做操作。  现在跨平台: 
在RXTX网站下载JAR包和动态库 
http://users.frii.com/jarvi/rxtx/download.html 
下载后配置环境 
Windows 
拷贝RXTXcomm.jar 文件到 \jre\lib\ext 目录下 
拷贝rxtxSerial.dll文件到 \jre\bin目录下 
Mac OS X (x86 and ppc) (there is an Installer with the source) 
MAC下面我自己没有配置环境成功,后来找一个MAC下RXTX的安装把环境配置好的。 
http://www.jdivelog.org/how-to/mac-os-x/下载安装环境配置文件RXTX_Tiger.pkg 
Linux (only x86, x86_64, ia64 here but more in the ToyBox) 
拷贝RXTXcomm.jar 文件到 /jre/lib/ext 目录下 
拷贝librxtxSerial.so 文件到 /jre/lib/[machine type] (i386 for instance)目录下 
并将拷贝文件释放权限给所有用户 
Solaris (sparc only so far) 
拷贝RXTXcomm.jar 文件到 /jre/lib/ext 目录下 
拷贝librxtxSerial.so 文件到 /jre/lib/[machine type]目录下 
并将拷贝文件释放权限给所有用户 
环境搭建好后开始写代码实现 


Java代码  


import java.io.*;  


import java.text.SimpleDateFormat;  


import java.util.Date;  


import java.util.TooManyListenersException;  


import gnu.io.CommPortIdentifier;  


import gnu.io.NoSuchPortException;  


import gnu.io.PortInUseException;  


import gnu.io.SerialPort;  


import gnu.io.SerialPortEvent;  


import gnu.io.SerialPortEventListener;  


public class SerialComm implements SerialPortEventListener, Runnable  


{  


public final static String PORT_OWER = "MonitorApp";  


private boolean isOpen;  


private boolean isStart;  


private boolean isSave;  


private boolean isPrint;  


private Thread readThread;  


private String portName;  


private String portAddress;  


private CommPortIdentifier portId;  


private SerialPort serialPort;  


private DataInputStream inputStream;  


private OutputStream outputStream;  


private SimpleDateFormat formatter;  


// prase data with process  


private String dataProtocol;  


private Object readWriteLock = new Object();  


public SerialComm() {  


        isOpen = false;  


        isStart = false;  


        isSave = true;  


        isPrint = false;  


        formatter = new SimpleDateFormat("[yyyy-MM-dd hh:mm:ss,SSS]");  


        portName = "COM1";  


        portAddress = "LOCAL";  


        dataProtocol = "Gooseli";  


    }  


public void init(String port, String protocol) throws Exception  


    {  


        portName = port;  


        portAddress = portName;  


        dataProtocol = protocol;  


        init();  


    }  


public void init(String port, String address, String protocol) throws Exception  


    {  


        portName = port;  


        portAddress = address;  


        dataProtocol = protocol;  


        init();  


    }  


public void init() throws IOException, Exception, Exception  


    {  


if (isOpen)  


        {  


            close();  


        }  


try  


        {  


//传送串口名创建CommPortIdentifier对象服务。  


            portId = CommPortIdentifier.getPortIdentifier(portName);  


//使用portId对象服务打开串口,并获得串口对象  


            serialPort = (SerialPort) portId.open(PORT_OWER, 2000);  


//通过串口对象获得读串口流对象  


            inputStream = new DataInputStream(serialPort.getInputStream());  


//通过串口对象获得写串口流对象  


            outputStream = serialPort.getOutputStream();  


            isOpen = true;  


        } catch (NoSuchPortException ex)  


        {  


throw new Exception(ex.toString());  


        } catch (PortInUseException ex)  


        {  


throw new Exception(ex.toString());  


        }  


    }  


public void start() throws Exception  


    {  


if (!isOpen)  


        {  


throw new Exception(portName + " has not been opened.");  


        }  


try  


        {  


//创建对象线程  


            readThread = new Thread(this);  


            readThread.start();  


//设置串口数据时间有效  


            serialPort.notifyOnDataAvailable(true);  


//增加监听  


            serialPort.addEventListener(this);  


            isStart = true;  


        } catch (TooManyListenersException ex)  


        {  


throw new Exception(ex.toString());  


        }  


    }  


public void run()  


    {  


        String at = "at^hcmgr=1\r";  


        String strTemp = at + (char) Integer.parseInt("1a", 16) + "z";  


        writeComm(strTemp);  


        isPrint = true;  


    }  


public void stop()  


    {  


if (isStart)  


        {  


            serialPort.notifyOnDataAvailable(false);  


            serialPort.removeEventListener();  


            isStart = false;  


        }  


    }  


public void close()  


    {  


        stop();  


if (isOpen)  


        {  


try  


            {  


                inputStream.close();  


                outputStream.close();  


                serialPort.close();  


                isOpen = false;  


            } catch (IOException ex)  


            {  


            }  


        }  


    }  


//如果串口有数据上报则主动调用此方法  


public void serialEvent(SerialPortEvent event)  


    {  


switch (event.getEventType())  


        {  


case SerialPortEvent.BI:  


case SerialPortEvent.OE:  


case SerialPortEvent.FE:  


case SerialPortEvent.PE:  


case SerialPortEvent.CD:  


case SerialPortEvent.CTS:  


case SerialPortEvent.DSR:  


case SerialPortEvent.RI:  


case SerialPortEvent.OUTPUT_BUFFER_EMPTY:  


break;  


case SerialPortEvent.DATA_AVAILABLE:  


            readComm();  


break;  


default:  


break;  


        }  


    }  


public void readComm()  


    {  


        StringBuffer readBuffer = new StringBuffer();  


        String scannedInput = "";  


        Date currentTime = null;  


        String TimeStamp = "";  


int c;  


char a;  


try  


        {  


            InputStreamReader fis = new InputStreamReader(inputStream, "utf-8");  


while ((c = fis.read()) != -1)  


            {  


                readBuffer.append((char) c);  


            }  


            scannedInput = readBuffer.toString().trim();  


            currentTime = new Date();  


            TimeStamp = formatter.format(currentTime);  


        } catch (IOException ex)  


        {  


            ex.printStackTrace();  


        } catch (Exception ex)  


        {  


            ex.printStackTrace();  


        }  


    }  


public void writeComm(String outString)  


    {  


synchronized (readWriteLock)  


        {  


try  


            {  


                outputStream.write(outString.getBytes());  


            } catch (IOException ex)  


            {  


            }  


        }  


    }  


public static void main(String[] args)  


    {  


        SerialComm serialcomm = new SerialComm();  


try  


        {  


            serialcomm.init("COM3", "Air");// windows下测试端口  


// serialcomm.init("/dev/ttyUSB0", "Air");//linux下测试端口  


            serialcomm.start();  


        } catch (Exception ex)  


        {  


        }  


    }  


}  
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Java串口开发是指使用Java语言编写程序控制和操作串口设备。为了模拟一个例子,我们可以以一个简单的串口通信程序为例。 首先,我们需要导入并创建Java串口通信相关的类和库。比如,我们可以使用RXTX库来实现串口通信。然后,我们需要寻找并确认计算机上可用的串口设备和相应的参数,如串口号、波特率、校验位等。我们可以使用`CommPortIdentifier`类来获取系统中可用的串口设备。 接下来,我们需要打开和配置串口。通过`CommPortIdentifier.open()`方法打开并获取一个`SerialPort`对象,再通过`SerialPort`对象的方法进行串口参数的设置。比如,可以使用`setBaudRate()`方法设置波特率,使用`setParity()`方法设置校验位等。 然后,我们可以使用`SerialPort`对象的输入输出流进行串口数据的读写操作。通过`getInputStream()`方法获取输入流,使用`getOutputStream()`方法获取输出流。我们可以使用输入流的`read()`方法读取串口设备发送来的数据,使用输出流的`write()`方法向串口设备发送数据。 最后,我们在程序中添加逻辑来处理串口数据。比如,我们可以使用线程来实现串口数据的实时接收和处理。我们可以在线程中使用一个无限循环来不断读取串口数据,并根据数据的类型和内容进行相应的处理和显示。 总结起来,Java串口开发模拟例子的关键步骤包括导入相关类和库、获取系统中可用的串口设备、打开和配置串口、使用输入输出流进行数据的读写、添加处理逻辑等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

懒人烂命

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值