java实现上位机与下位机串口通信

串口通信是在工程应用中很常见。在上位机与下位机通讯过程中常通过有线的串口进行通信,在低速传输模式下串口通信得到广泛使用。在说个之前先来简单解释一下上位机与下位机的概念。
上位机与下位机
      通常上位机指的是PC,下位机指的是单片机或者带微处理器的系统。下位机一般是将模拟信号经过AD采集将模拟量转换为数字量,下位机再经过数字信号处理以后将数字信号通过串口发送到上位机,相反上位机可以给下位机发送一些指令或者信息。常见的通信串口包括RS232、RS485、RS422等。这些串口只是在电平特性有所不同,在上位机与下位机进行数据通信时可以不考虑电平特性,而且现在在硬件上有各种转接接口,使用起来也很方便。
      当然在通常做简单的串口UART实验时我们可以使用各种各样的串口助手小软件,但是这些串口小工具有时候并不能很好满足需求,那就尝试着自己写一套属于自己的串口助手?接下来说说如何使用java实现上位机与下位机之间的RS485串口通信。
step 1: 下载支持java串口通信的jar包,这里给出下载地址:
http://files.cnblogs.com/files/Dreamer-1/mfz-rxtx-2.2-20081207-win-x86.zip(32bit 下载地址)
http://files.cnblogs.com/files/Dreamer-1/mfz-rxtx-2.2-20081207-win-x64.zip (64位下载地址)
    RXTXcomm.jar需要导入到java工程里面去。另外就是需要将rxtxParallel.dll与rxtxSerial.dll复制在安转JDK的bin文件下和jre的bin文件夹下面,这样才能保证能够正常使用这个jar包。以下是将两个dll文件复制的位置:

C:\Java\jdk1.8.0_25\bin\
C:\Java\jdk1.8.0_25\jre\bin\

 
step 3:RXTXComm Api如何使用
      接下来就是使用该导入jar包进行编码实现串口通信的功能了。在编码之前先来理一理串口通信的主要环节,主要分为以下几点:
1)计算机首先需要进行硬件check,查找是否有可用的COM端口,并对该对端口进行简要判断,包括这些端口是否是串口,是否正在使用。以下是部分主要代码:

UARTParameterSetup  串口参数设置类

 

package com.com.cai.rssibawu;

import gnu.io.*;

import java.util.ArrayList;
import java.util.Enumeration;

/*定义一个串口数据包的类并做一些简单的操作
 * 主要是串口通信的一些异常检测以及提示
 * 对通信串口的一些基本参数的设置
 * 通常将外部引用的jar包存在工程下lib文件下
 * 该类的几个方法都是对串口的检测与设置,不需要经常修改 属于一个类的操作因此使用static类方法
 * 设置继承权限,不希望被扩展类继承,因此类的修饰符为:final
 */
public class UARTParameterSetup {
    /*类方法 不可改变 不接受继承
     * 扫描获取可用的串口
     * 将可用串口添加至list并保存至list
     */
    public static final ArrayList<String> uartPortUseAblefind() {
        //获取当前所有可用串口
        //由CommPortIdentifier类提供方法
        Enumeration<CommPortIdentifier> portList = CommPortIdentifier.getPortIdentifiers();
        ArrayList<String> portNameList = new ArrayList();
        //添加并返回ArrayList
        while (portList.hasMoreElements()) {
            String portName = portList.nextElement().getName();
            portNameList.add(portName);
        }
        return portNameList;
    }

    /*
     * 串口常见设置
     * 1)打开串口
     * 2)设置波特率 根据单板机的需求可以设置为57600 ...
     * 3)判断端口设备是否为串口设备
     * 4)端口是否占用
     * 5)对以上条件进行check以后返回一个串口设置对象new UARTParameterSetup()
     * 6)return:返回一个SerialPort一个实例对象,若判定该com口是串口则进行参数配置
     *   若不是则返回SerialPort对象为null
     */
    public static final SerialPort portParameterOpen(String portName, int baudrate) {
        SerialPort serialPort = null;
        try {  //通过端口名识别串口
            CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName);
            //打开端口并设置端口名字 serialPort和超时时间 2000ms
            CommPort commPort = portIdentifier.open(portName, 1000);
            //进一步判断comm端口是否是串口 instanceof
            if (commPort instanceof SerialPort) {
                System.out.println("该COM端口是串口!");
                //进一步强制类型转换
                serialPort = (SerialPort) commPort;
                //设置baudrate 此处需要注意:波特率只能允许是int型 对于57600足够
                //8位数据位
                //1位停止位
                //无奇偶校验
                serialPort.setSerialPortParams(baudrate, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
                //串口配制完成 log
                System.out.println("串口参数设置已完成,波特率为" + baudrate + ",数据位8bits,停止位1位,无奇偶校验");
            }
            //不是串口
            else {
                System.out.println("该com端口不是串口,请检查设备!");
                //将com端口设置为null 默认是null不需要操作
            }

        } catch (NoSuchPortException e) {
            e.printStackTrace();
        } catch (PortInUseException e) {
            e.printStackTrace();
        } catch (UnsupportedCommOperationException e) {
            e.printStackTrace();
        }

        return serialPort;
    }

    /*
     * 关闭串口
     * 串口关闭以及检测的COM端口非串口的标志是返回一个SerialPort是null
     * 关闭串口后使用null进行重置
     */
    public static void closePort(SerialPort serialPort) {
        if (serialPort != null) {
            serialPort.close();
            serialPort = null;
            System.out.println("串口已关闭!");
        }
    }
}

以下是测试类的测试实例:

 

ArrayList<String> arraylist=UARTParameterSetup.uartPortUseAblefind();
        int useAbleLen=arraylist.size();
        if(useAbleLen==0)
        {
            System.out.println("没有找到可用的串口端口,请check设备!");
        }
        else
        {   
            System.out.println("已查询到该计算机上有以下端口可以使用:");
            for(int
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

非ban必选

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

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

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

打赏作者

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

抵扣说明:

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

余额充值