zoukankan      html  css  js  c++  java
  • JAVA串口开发帮助类分享-及写在马年末

    摘要: 在系统集成开发过程中,存在着各式的传输途径,其中串口经常因其安全性高获得了数据安全传输的重用,通过串口传输可以从硬件上保证数据传输的单向性,这是其它介质所不具备的物理条件。下面我就串口java开发的过程分享一下,并分享一个SerialPortHandler串口开发帮助类,以提高串口开发效率。并附带了一些近期的总结,出差的体会。

    关键词: java, 串口, 经验, 年终总结
    需求:  开发串口快速上手
     
    1、部署开发环境。
    拷贝RXTXcomm.jar 文件到 jrelibext 目录下,拷贝rxtxSerial.dll文件到 jrein目录下。注意是jre目录下,并非jdkjre下;注意dll有32位与64位之分,根据自己实际情况操作。
     
    2、搭建调试助手。
    Virtual Serial Port Driver(7.2)和串口调试助手(CM精装版V3.8.3)简直就是调试串口的一对好基友。Virtual Serial Port Driver可以看到当前所有串口的状态,还能虚拟出硬件不存在的串口出来,虚拟出的串口还是连接好的;串口调试助手可以看到某串口接收到的具体信息,还能向某串口发送信息。我就经常使用Virtual Serial Port Driver虚拟出一对串口COM3和COM4,然后打开两个串口调试助手,一个连接到COM3上,一个连接到COM4,然后在连接到COM3的串口调试助手上输入一段话,点击发送,则会在连接到COM4的串口调试助手上接收并显示此段话,相当于一个本机对话机有木有!
     
     
     
    3、下面是我优化过后的串口调用处理器:
     
    public class SerialPortHandler implements Runnable, SerialPortEventListener
    {
        private String appName = "串口通讯";
        private final static int timeout = 2000;// open 端口时的等待时间
        private final static int dataBits = 8;// 数据位
        private final static int stopBits = 1;// 停止位
        private final static int parity = 0;// 校验位
        private String portName;
        private int baudRate;// 波特率
        private int threadTime = 0;
        private CommPortIdentifier commPort;
        private SerialPort serialPort;
        private InputStream inputStream;
        private OutputStream outputStream;
        private static ConcurrentHashMap<String, SerialPortHandler> instances = new ConcurrentHashMap<String, SerialPortHandler>();
     
        private SerialPortHandler()
        {
        }
     
        public static synchronized SerialPortHandler getInstance(String portName,
            int baudRate) throws NoSuchPortException
        {
            SerialPortHandler instance;
            if (!instances.containsKey(portName))
            {
                instance = new SerialPortHandler();
                instance.portName = portName;
                instance.baudRate = baudRate;
                instances.put(portName, instance);
                instance.selectPort();
            }
            else
            {
                instance = instances.get(portName);
            }
            return instance;
        }
     
        /**
         * @方法名称 :listPort
         * @功能描述 :列出所有可用的串口
         * @返回值类型 :void
         */
        public static void listPort()
        {
            CommPortIdentifier cpid;
            Enumeration en = CommPortIdentifier.getPortIdentifiers();
            System.out.println("now to list all Port of this PC:" + en);
            while (en.hasMoreElements())
            {
                cpid = (CommPortIdentifier) en.nextElement();
                if (cpid.getPortType() == CommPortIdentifier.PORT_SERIAL)
                {
                    System.out.println(cpid.getName() + ", "
                        + cpid.getCurrentOwner());
                }
            }
        }
     
        /**
         * @方法名称 :selectPort
         * @功能描述 :选择一个端口,比如:COM1
         * @返回值类型 :void
         * @param portName
         * @throws NoSuchPortException
         */
        @SuppressWarnings("rawtypes")
        private void selectPort() throws NoSuchPortException
        {
            this.commPort = CommPortIdentifier.getPortIdentifier(portName);
            openPort();
        }
     
        /**
         * @方法名称 :openPort
         * @功能描述 :打开SerialPort
         * @返回值类型 :void
         */
        private void openPort()
        {
            if (commPort == null)
                log(String.format("无法找到名字为'%1$s'的串口!"commPort.getName()));
            else
            {
                log("端口选择成功,当前端口:" + commPort.getName() + ",现在实例化 SerialPort:");
                try
                {
                    serialPort = (SerialPort) commPort.open(appNametimeout);
                    serialPort.setSerialPortParams(baudRatedataBitsstopBits,
                        parity);
                    log("实例 SerialPort 成功!");
                }
                catch (PortInUseException e)
                {
                    throw new RuntimeException(String.format("端口'%1$s'正在使用中!",
                        commPort.getName()));
                }
                catch (UnsupportedCommOperationException e)
                {
                    throw new RuntimeException(String.format("端口'%1$s'操作命令不支持!",
                        commPort.getName()));
                }
            }
        }
     
        /**
         * @方法名称 :checkPort
         * @功能描述 :检查端口是否正确连接
         * @返回值类型 :void
         */
        private void checkPort()
        {
            if (commPort == null)
                throw new RuntimeException("没有选择端口,请使用 "
                    + "selectPort(String portName) 方法选择端口");
     
            if (serialPort == null)
            {
                throw new RuntimeException("SerialPort 对象无效!");
            }
        }
     
        /**
         * @方法名称 :write
         * @功能描述 :向端口发送数据,请在调用此方法前 先选择端口,并确定SerialPort正常打开!
         * @返回值类型 :void
         * @param message
         */
        public void write(String message)
        {
            checkPort();
            try
            {
                outputStream = new BufferedOutputStream(
                    serialPort.getOutputStream());
            }
            catch (IOException e)
            {
                throw new RuntimeException("获取端口的OutputStream出错:" + e.getMessage());
            }
            try
            {
                outputStream.write(message.getBytes());
                log("信息发送成功!");
            }
            catch (IOException e)
            {
                throw new RuntimeException("向端口发送信息时出错:" + e.getMessage());
            }
            finally
            {
                try
                {
                    outputStream.close();
                }
                catch (Exception e)
                {
                }
            }
        }
    }
     
    使用办法:
    public static void sendBySerialPorts(String contant)
        {
            contant = contant.replaceAll("\$""");        // 这里使用$符号作为终止符
            contant = contant.concat("$");
            SerialPortHandler sph;
            try
            {
                sph = SerialPortHandler.getInstance(
                    DriveOutConductConfig.getPortName(),
                    DriveOutConductConfig.getBitRate());
                sph.write(contant);
            }
            catch (NoSuchPortException e)
            {
                e.printStackTrace();
            }
        }

     
     
    写在2014年马年末。
    1、出差感受
    在2014年末,我有幸跟随陈工、钟工到甘肃兰州出差,进行项目的现场部署与系统间联调,以及与客户、直接使用者进行面对面的交流与互动,感触良多。现场环境复杂,可能会遇到在开发环境中从未出现过的情况,因此在现场部署前,一定要做好大量的准备工作,避免意外;当然,智者千虑还必有一失,做好备案,面对紧急突发事件要知道如何解决,自己解决不了的要知道问谁。一定要做好系统的质量保证工作,不能在现场演示时出现低级错误,质量是抓住用户的救命稻草。用户是熟悉业务的能手,用心倾听用户需求,才能把握用户。
    多系统协调的系统,系统关依赖性强,开发沟通很重要,开发成本也很高,部署时也最容易出错。讲一个故事,我们的系统会调用另一个系统的接口,在我们系统部署完毕后,与其它系统连接也完成后,在前端怎么也调用不成功,日志中写的是服务不可用,我们便以为是其它系统服务有问题;到后来,我们经过细致的排查,才发现,问题出在两系统间网络没有正确连接,最后是因为有一端网线端口没插紧,晕死。
    兰州牛肉拉面是极好的,兰州手抓羊肉还是很鲜嫩的,甘肃的鸡汤面味道杠杠。
     
    2、年终总结大会
    今天被荣幸的评为今年的公司优秀员工,在这一年里我作为项目经理兼系统架构师,圆满完成一个较大项目,并顺利通过系统集成项目管理师考试,不能不谓收获颇多,感谢大家对我今年工作的肯定。在这里我要感谢我的项目团队,谢工、卢工、王工、杨工、陈工、刘工,没有大家这段时间的辛勤努力项目不能进展顺利;感谢我的领导,没有您的支持与帮助我不能如此进步;感谢我的亲爱的老婆,没有你给的爱我不能每天都如此开心。我要在新的一年里,开足马力,从技术上更清晰地把握系统架构前沿技术,从管理上更熟练地使用各项管理技能。





  • 相关阅读:
    hive 数据hadoop数据etl交换
    团队冲刺(三)
    团队冲刺(二)
    CVPR2019论文热词云的实现
    团队冲刺(一)
    团队开发之电梯演讲----团队项目介绍--“益青春APP”
    android的finish()方法
    java web项目通过外网ip访问
    MySQL出现错误1205-Lock wait timeout exceeded; try restarting transaction
    团队开发(自己的理解)
  • 原文地址:https://www.cnblogs.com/wgp13x/p/4288980.html
Copyright © 2011-2022 走看看