串口通信之(一)获取传感器数据(modbus rtu master)

2023-05-16

一天领导拿了几个传感器设备丢给我,给我把这些数据取到。

 

我一看,好家伙。这是要搞硬件了啊。那就搞他丫的。

 

可是,怎么搞是个问题。我是一头雾水。

 

还好,和传感器丢给我的,还有传感器厂家一起给的一些相关的资料(传感器的接线说明,调试软件,和java写的demo)

 

曾以为有文档和demo在手,就是让我上天,我也给走上一遭。可哪想到,即便是能上了天,

所遇到的问题,也能把磨到,上天的只剩下灵魂。

 

由于什么都不懂,真是困难重重。线,接起来不对。代码运行不进来。我想哭,怎么办?

 

于是我把着厂家技术支持这根稻草不放了。一个劲的问人家,都把人家问得烦了。线虽然接对了,可是代码还是运行起来。我再问,这下可好,人家是真烦了,被随便应付了。

 

可是,我知道了,要把这个传感的数据取到。需要用到485串口通信。于是我网上搜485串口通信。找到一份代码,而且能用。这可把我牛逼坏了,嘿嘿,果然没有什么是能难到程序员的。算是能成功取到了数据。

 

这里贴出这个程序的博客的地址。后面我也把我整理了一下的代码附上。

https://www.cnblogs.com/new-life/p/9345849.html

后来,我才知道这篇博客是写了一个相当于master程序,只能从传感器上获取到数据。

 

后来由于这个程序没有处理线程和粘包的问题,不太能满足需求,所以又需要改。

 

这时,已经知道了rtxxComm就是直接对串口进行操作的(读写数据),在上面的程序就是基于这个来写的。而rxtxComm中读写数据也是基于流来的。所以想到了结合netty,来写一个master。一下给出在代码没有处理粘包(写一个Decoder,在其中处理好一个完整的包,再传到handler就是了)

 

master.java

public class Mater{
    private String portName;//串口名
    private int baudrate;//波特率
    RxtxChannel channel;
    List<String> data;//将设备返回的数据,解析后存于改list


    public Mater(String portName, int baudrate,List<String> data) {
        this.data=data;
        this.portName = portName;
        this.baudrate = baudrate;
    }

    public void run(){

        try {
            OioEventLoopGroup group = new OioEventLoopGroup();
            Bootstrap b = new Bootstrap();
            b.group(group)
                    .channelFactory(new ChannelFactory<RxtxChannel>() {
                        public RxtxChannel newChannel() {
                            return channel;
                        }
                    })
                    .handler(new ChannelInitializer<RxtxChannel>() {
                        @Override
                        public void initChannel(RxtxChannel ch) throws Exception {
                            ch.pipeline().addLast(
                                    new RxtxHandler()
                            );
                        }
                    });

            channel = new RxtxChannel();
            channel.config().setBaudrate(baudrate);
            channel.config().setDatabits(RxtxChannelConfig.Databits.DATABITS_8);
            channel.config().setParitybit(RxtxChannelConfig.Paritybit.EVEN);
            channel.config().setStopbits(RxtxChannelConfig.Stopbits.STOPBITS_1);
            ChannelFuture future = b.connect(new RxtxDeviceAddress(portName)).sync();
            System.out.println("rxtx启动成功");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }



    public void writeAndFlush(String hexString) {
        String s = CRC16Util.crcDeal(hexString);
        System.out.println("手动发送数据:"+s);
        byte[] bytes = ByteUtil.hexStringToBytes(s);
        ByteBuf buffer = channel.alloc().buffer();
        ByteBuf byteBuf = buffer.writeBytes(bytes);
        channel.writeAndFlush(byteBuf);
    }

    public void inputCmd(){
        Scanner sc=new Scanner(System.in);
        while (true){
            String s = sc.nextLine();
            writeAndFlush(s);
        }
    }
    //不断请求传感器数据
    public void request() throws InterruptedException {
        String [] cmds = new String[]{"030300000002","020300020001","040300030001"};
        for (int i = 0; i < cmds.length; i++) {
            Thread.sleep(500);
            writeAndFlush(cmds[i]);
        }

    }

    //程序入口
    public static void main(String[] args) {
        Master master =new Master("COM3",9600,new ArrayList());
        master.run();
        master.request();
    }

}
RxtxHandler.java

public class RxtxHandler  extends ChannelInboundHandlerAdapter {



    /**
     * 客户端接收到数据的回调
     */
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception{

         byte[] read =new byte[in.readableBytes()];
         in.readBytes(read);
         //将byte数据转成16进制的数据报文
         //String packet = ByteUtil.BinaryToHexString(read).toUpperCase();
         //可以对数据进行处理
         //System.out.println(packet);
    }

 

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {

        cause.printStackTrace();

        ctx.close();
    }





}

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

串口通信之(一)获取传感器数据(modbus rtu master) 的相关文章

  • Modbus Poll/Slave 模拟器使用教程

    一 Modbus协议 ModBus官网是Modicon xff08 Modicon被施耐德收购 xff09 公司为其PLC通讯而开发的一种通讯协议 Q1 什么是PLC xff1f A1 在工业生产过程中 xff0c 大量的开关量顺序控制 x
  • 【VSPD虚拟串口】【Modbus Poll】【Modbus Slave】仿真工具的学习过程

    学习想法 xff1a 通信是工控行业内采集仪器仪表等设备信息的重要途径 xff0c 同时可以通过通信访问设备的工作状况对设备进行监控 xff0c 也可以通过通信对设备进行参数修改以及控制设备运行 xff0c 所以掌握通信是工控行业人员比不可
  • 10月1日后,GitHub用main替代master

    转自 xff1a 开源中国 GitHub 官方表示 xff0c 从 2020 年 10 月 1 日起 xff0c 在该平台上创建的所有新的源代码仓库将默认被命名为 34 main 34 xff0c 而不是原先的 34 master 34 值
  • Modbus-RTU通讯协议中CRC校验码的计算步骤

    在CRC计算时只用8个数据位 xff0c 起始位及停止位 xff0c 如有奇偶校验位也包括奇偶校验位 xff0c 都不参与CRC计算 CRC计算方法是 xff1a 1 预置1个16位的寄存器为十六进制FFFF xff08 全1 xff09
  • activemq--MASTER SLAVE+BROKER CLUSTER 实践(二)

    鱼与熊掌兼得法 完美解决方案 我们知道 xff1a master slave模式下 xff0c 消息会被逐个复制而cluster模式下 xff0c 请求会被自动派发 那么可不可以把两者集成起来呢 xff1f 答案是有的 xff0c 网上所谓
  • 了解 Spark中的master、worker和Driver、Executor

    master和worker是物理节点 xff0c 是在不同环境部署模式下和资源相关的两大内容 Driver和executor是进程 xff0c 是在spark应用中和计算相关的两大内容 1 master和worker节点 master节点常
  • MODBUS协议中的CRC校验

    一 RTU 檢查碼 CRC 計算器 第一种 RTU 檢查碼 CRC 計算器 大小端转换后 CRC检查码为 AB 89 说明 这个计算器还是可以用的 第二种 On line CRC calculation and free library 二
  • FreeModbus 移植笔记- 1-认识FreeModbus

    FreeModbus 移植笔记 目录 1 FreeMODBUS介绍 2 FreeMODBUS官网及源码下载地址 3 移植之前的准备 3 1 FreeModbus V1 6 3 2 Modbus 3 3 Modbus Registers 3
  • 【持续更新】近期C++开发Modbus通讯接口小结

    项目需求 对PLC上存储的数据进行读取 并转存到数据库 语言 C DDL 所需知识点 Socket通信 Modbus帧结构 C 中数据库的操作 多线程 Linux 项目进度拆解记录 不会做就是困难 管它简不简单 1 Socket通信 由于之
  • Modbus CRC和LRC算法研究及代码实现

    一 CRC 循环冗余校验 1 CRC16实现流程 XOR 异或 N 字节的信息位 POLY CRC16 多项式计算 1010 0000 0000 0001 生成多项式 1 x2 x15 x16 在CRC16中 发送的第一个字节位低字节 2
  • C# Modbus通信从入门到精通(11)——调试软件Modbus Slave和Modbus Poll的使用

    前言 我们在开发Modbus程序的时候 会需要测试以下我们写的Modbus程序有没有问题 这时候就需要使用到Modbus Slave和Modbus Poll这两个软件 Modbus Slave是模拟Modbus从站 Modbus Poll是
  • SPI接口详细介绍

    1 概述 SPI Serial Peripheral Interface 是串行外围设备接口 是一种高速 全双工 同步的通信总线 常规只占用四根线 节约了芯片管脚 PCB的布局省空间 现在越来越多的芯片集成了这种通信协议 常见的有EEPRO
  • Modbus驱动库—libmodbus驱动库的使用

    文章目录 为什么要使用驱动库 libmodbus简介 libmodbus常用函数 Windows平台libmodbus 使用 1 获取源代码 2 生成config h配置文件 3 编写测试代码 4 编译测试代码 Linux平台下libmod
  • 开放型 MODBUS-TCP规范(中文版)2

    导读 5 3 等级2指令详述 5 3 1 强制多点线圈 FC 15 请求 Byte 0 FC 0F 16进制 Byte 1 2 参考数值 Byte 3 4 比特数 1 800 Byte 5 字节数 B 比特数 7 8 Byte 6 B 5
  • Microchip PIC 的 Modbus 堆栈

    有人可以建议为 Microchip PIC18 处理器实现 Modbus RTU 从站的开源实现吗 我正在寻找 RS 232 RS 485 的 Modbus RTU 实现 但 Modbus TCP IP 实现也将受到欢迎 我已经为 PIC1
  • 需要 modbus Java 库 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我需要带有源代码的简单 modbus Java 库 我在谷歌上找到了 但有 jar 文件 并且没有强大的
  • 将两个原始值转换为 32 位 IEEE 浮点数

    我正在尝试通过 TCP modbus 解码来自 Shark 100 功率计的一些数据 我已经成功地拉下了我需要的寄存器 并从寄存器中留下了两个原始值 如下所示 17138 59381 从手册中 我知道我需要将这两个数字转换为32位IEEE浮
  • 从 Android 向 PLC 发送布尔值

    我能够与 PLC 建立连接以从中读取数据 现在有一个问题 那就是我必须编写一种方法来修改PLC中的数据 为了实现这一点 我必须向 PLC 发送两个值 一个 int 值和一个 boolean 值 我通过 net wimpi modbus 包中
  • pymodbus TcpClient超时

    我遇到 pymodbus TcpClient 超时问题 import logging from pymodbus client sync import ModbusTcpClient logging basicConfig log logg
  • Modbus 错误:[无效消息] 收到的消息不完整,预计至少 2 个字节(收到 0 个字节)

    Problem pymodbus 主站 客户端可以向从站 服务器发送请求 从属 服务器准备好返回的东西 并等待主控 客户端来接收它们 尽管服务器 从站已准备就绪 但主站 客户端仅返回错误 Modbus 错误 输入 输出 Modbus 错误

随机推荐