java实现上位机与下位机串口通信实例(含java串口通信jar包下载及代码)

  串口通信在工程应用中很常见。

上位机与下位机

在上位机与下位机通讯过程中常通过有线的串口进行通信,在低速传输模式下串口通信得到广泛使用。

通常上位机指的是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位下载地址)

对以上的版本解释一下,因为本人在这里踩了一个坑,32位或者64位是与ecplise/myecplise一致,要是版本弄错了会报错。
step 2:下载了那个jar包解压后会出现一下内容:

java实现上位机与下位机串口通信实例(含java串口通信jar包下载及代码)

这个文件夹里面需要注意两点:jar包RXTXcomm需要导入到java工程里面去。另外就是需要将rxtxParallel.dll与rxtxSerial.dll复制在安转JDK的bin文件下和jre的bin文件夹下面,这样才能保证能够正常使用这个jar包。以下是将两个dll文件复制的位置:

C:\Program Files (x86)\Java\jdk1.8.0_25\bin\

C:\Program Files (x86)\Java\jdk1.8.0_25\jre\bin\

  怎么讲jar包导入java工程里面就是比较简单的操作,可以参考:http://jingyan.baidu.com/article/ca41422fc76c4a1eae99ed9f.html

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

 /*类方法 不可改变 不接受继承
 * 扫描获取可用的串口
 * 将可用串口添加至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;
}

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

ArrayList<String> arraylist=UARTParameterSetup.uartPortUseAblefind();
        int useAbleLen=arraylist.size();
        if(useAbleLen==0)
        {
            System.out.println("没有找到可用的串口端口,请check设备!");
        }
        else
        {   
            System.out.println("已查询到该计算机上有以下端口可以使用:");
            for(int index=0;index<arraylist.size();index++)
            {
                System.out.println("该COM端口名称:"+arraylist.get(index));
                //测试串口配置的相关方法
            } 
        }

2)通过计算机对串口的自检后,可以对串口参数进行简单的配置。常见的配置可以从常见的串口助手中得到启发。以下是一个串口助手的人机交换界面:

java实现上位机与下位机串口通信实例(含java串口通信jar包下载及代码)

以下是对串口设置主要代码:

 /*
 * 串口常见设置
 * 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;      
}

以上代码就是返回一个对象,同时也返回了对象属性,因为对象在java里面是属于传值引用。对以上需要说明的是:在实验时需要连接串口才能让计算机检测到才能让程序工作,这里使用的是RS485转接线:

java实现上位机与下位机串口通信实例(含java串口通信jar包下载及代码)

3)通过以上两个步骤后基本对串口的设置也完成了,对于串口类型的确认例如:RS232/RS485/RS422等,可以作为进一步确认的条件。RS485可以在gnu.io中找到。

java实现上位机与下位机串口通信实例(含java串口通信jar包下载及代码)

 接下来就是上位机与下位机之间的双向通信的功能实现了。该部分主要是利用java的输入输出流来实现。以下是主要代码:

/*
 * 串口数据发送以及数据传输作为一个类
 * 该类做主要实现对数据包的传输至下单板机
 */
class DataTransimit
{

    /*
     * 上位机往单板机通过串口发送数据
     * 串口对象 seriesPort 
     * 数据帧:dataPackage
     * 发送的标志:数据未发送成功抛出一个异常
     */
    public static void uartSendDatatoSerialPort(SerialPort serialPort,byte[] dataPackage)
    {
        OutputStream out=null;
        try
        {
            out=serialPort.getOutputStream();
            out.write(dataPackage);
            out.flush();
        } catch (IOException e) 
        {
            e.printStackTrace();
        }finally
        {
            //关闭输出流
            if(out!=null)
            {
                try 
                {
                    out.close();
                    out=null;
                    System.out.println("数据已发送完毕!");
                } catch (IOException e) 
                {
                    e.printStackTrace();
                }   
            }
        }           
     }
    /*
     * 上位机接收数据
     * 串口对象seriesPort
     * 接收数据buffer
     * 返回一个byte数组
     */
    public  static  byte[] uartReceiveDatafromSingleChipMachine(SerialPort serialPort)
    {
        byte[] receiveDataPackage=null;
        InputStream in=null;
        try 
        {
            in=serialPort.getInputStream();
            //获取data buffer数据长度
            int bufferLength=in.available();
            while(bufferLength!=0)
            {
                receiveDataPackage=new byte[bufferLength];
                in.read(receiveDataPackage);
                bufferLength=in.available();

            }
        } 
        catch (IOException e) 
        {
            e.printStackTrace();
        }
        return receiveDataPackage;
    }

通过以上关于Uart两个基本类实现对底层Uart的功能封装,其中一个类主要负责Uart串口自检和基本设置,另外一个类主要has数据传输的两个方法。接下来以一个实例说一说通过RS485串口通信将系统当前时间发送至单板机系统。

125jz网原创文章。发布者:江山如画,转载请注明出处:http://www.125jz.com/11224.html

(0)
江山如画的头像江山如画管理团队
9 组国风颜色搭配 -优秀网页设计
上一篇 2023年1月5日 上午10:19
%matplotlib inline使用详解
下一篇 2023年1月13日 下午3:55

99%的人还看了以下文章

  • js中var a=b=1和var a=1,b=1的区别

    js中一次性定义多个变量的时候,可以用:var a=1,b=1这种中间用逗号隔开的方式,但有些时候为了省事,直接定义var a=b=1。 那这两种写法方式最后效果是一样的吗?有没有什么区别呢?请大家看下面的范例: 1、用var a=b=1的方式 由上图可以明显看出来,变量b的作用域已经是全局的了,因为在函数外可以调用到(可以正常的输出变量)。 2、用var …

    2022年3月19日
    6.3K0
  • 程序设计基础(C语言)—教学设计、教案

    教学设计——程序设计基础 教学基本信息 课程名称 程序设计基础 性质 专业基础课 学分 3 学时 48 题目 数据类型 专业年级 软件工程专业一年级 教材 书名:C程序设计(第五版) 出版社:清华大学出版社    出版日期: 2017年8月 教学背景分析 一、学习内容分析: 本节课要介绍的知识点——数据类型比较简单,但都是概念。对于这些陌生的、枯燥的纯概念性…

    2020年4月10日
    15.0K0
  • %matplotlib inline使用详解

    #内嵌画图 %matplotlib inline import matplotlib # 注意这个也要import一次 import matplotlib.pyplot as plt myfont = matplotlib.font_manager.FontProperties(fname=r’C:/Windows/Fonts/msyh.ttf’) # 这一…

    2023年1月13日
    3.1K0
  • HTTP错误 403.14 服务器配置为不列出此目录内容

    HTTP错误 403.14 服务器配置为不列出此目录内容HTTP错误 403.14 服务器配置为不列出此目录内容HTTP错误 403.14 服务器配置为不列出此目录内容HTTP错误 403.14 服务器配置为不列出此目录内容

    开发一个企业网站,使用ASP技术,在本地通过IIS管理器调试,出现 如下问题: HTTP 错误 403.14 – Forbidden Web 服务器被配置为不列出此目录的内容 解决方法: 在”功能视图“,中找到”目录浏览“,双击进入 在目录浏览右侧操作中选择”启用“! 这时再浏览网站,可以看到已经不报错了,但是网站是以文件目录的形式展现的! 这是…

    2018年7月3日 编程开发
    5.7K0
  • 跟永哥学MVC:jsp+javabean+servlet实现求圆的面积

    上一节课我们通过一个案例三种实现,教你理解Jsp、javabean、Servlet(精),今天我们仍然通过同一个案例求圆的面积,使用MVC:jsp+javabean+servlet来实现,深入理解MVC及Jsp、javabean、Servlet的分工和使用。 r5.jsp <form action=”servletCircle” Method=”pos…

    2018年2月22日
    9.6K0
  • 开发软件,编程语言Java和C++选哪个?

    根据网络调查数据:编程语言排名前三的是Java、C#、C++。 其中Java使用者比例最高,为42.82%,是C#的两倍还要多。 紧跟其后的是C#,比例为17.33%。 排名第三的C++则有14.35%的比例。 JAVA和C++都是面向对象语,都能够实现面向对象思想(封装,继乘,多态)。而由于C++为了照顾大量的C语言使用者,而兼容了C,使得自身仅仅成为了带…

    2021年2月16日
    7.7K0

发表回复

登录后才能评论