串口通信之(一)获取传感器数据(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) 的相关文章

  • AM2322温湿度传感器(地址0XB8)---I2C总结(I2C_ModBus协议)

  • 西门子PLC S7-200SMART Modbus TCP通讯的步骤和要点

    Modbus TCP是一个非常传统 xff0c 应用广泛的通讯协议 xff0c 很多智能设备都支持该协议 西门子S7 200SMART及1200 1500系列都免费支持 xff08 300和400还是要高昂收费 xff09 xff0c 并且
  • MODBUS通讯协议和RS232以及RS485通讯协议有什么区别

    转载粘贴其他人的分析 xff1a
  • 使用java的modbus4j的Rtu方式获取监测数据

    最近要从modbus总线上获取数据 xff0c 还要用java开发 xff0c 找了半天 xff0c 感觉modbus4j在github上评价比较高 xff0c 尝试了一下 xff0c 果然很好用 xff0c 比之前的方法方便很多 在使用过
  • activemq--MASTER SLAVE+BROKER CLUSTER 实践(二)

    鱼与熊掌兼得法 完美解决方案 我们知道 xff1a master slave模式下 xff0c 消息会被逐个复制而cluster模式下 xff0c 请求会被自动派发 那么可不可以把两者集成起来呢 xff1f 答案是有的 xff0c 网上所谓
  • 【持续更新】近期C++开发Modbus通讯接口小结

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

    Modbus CRC16算法 直接运算 unsigned short modbus crc16 unsigned char pdata unsigned short len unsigned short i j crc crc 0xFFFF
  • ModbusSlave安装及使用指南正式版带序列码

    ModbusSlave是一个从站设备仿真软件 它用于接收主设备的命令包 并回送数据包 可用于测试和调试Modbus主站设备 便于观察Modbus通信过程中的各种报文 ModbusSlave支持ModbusRTU ASCII TCP IP等协
  • 智能遥测终端普适型RTU的主要功能特点及应用

    智能遥测终端机是普适型RTU 研发的融合4G Bluetooth 串口等多种通 信方式 数据采集存储传输于一体的智能遥测终端 产品内置数据采集器 实现内部模数转换 提供增量式雨量接口 RS232 RS485 采集 存储 数据处理 远程传输为
  • C# Modbus Rtu实现

    Modbus Rtu的实现与Modbus Tcp的实现类似 C ModBus Tcp的学习及Master的实现 我们还是需要借用一个开源库NModbus4 在vs中 打开NuGet管理器 安装NModbus4 具体实现 具体实现与之前的Mo
  • Modbus驱动库—libmodbus驱动库的使用

    文章目录 为什么要使用驱动库 libmodbus简介 libmodbus常用函数 Windows平台libmodbus 使用 1 获取源代码 2 生成config h配置文件 3 编写测试代码 4 编译测试代码 Linux平台下libmod
  • 【Modbus】 RTU CRC校验码计算方法

    Modbus是美国Modicon公司 即现在的Schneider Electric公司 于1979年开发的一种通信协议 其目的是采用一根双绞线实现多个设备之间的通信 Modbus 协议采用问答式的通信方式 具有简单 硬件便宜 通用性强 使用
  • modbus读取保持寄存器实例

    读取108 110的实例 一共读取3个寄存器 请求 03 00 6B 00 03 03 功能码 表示读取保存寄存器 006B 十六进制表示107 从107开始往后读取 0003 十六进制表示读取3个寄存器 响应 03 06 02 2B 00
  • Modbus 错误:[输入/输出] 未收到来自远程设备的响应

    我尝试从 Mac 笔记本电脑连接到 Modbus 设备 MR SI4 使用串行连接 使用 USB RS485 转换器 安装 到 dev cu SLAB USBtoUART 这是我的代码 import logging logging basi
  • CRC-CCITT 到 CRC16 Modbus 实施

    我在使用 PHP 生成 modbus CRC16 代码时遇到很多麻烦 我在互联网上找到了很多不同的代码 但我尝试过它们 但由于某种原因我没有得到正确的结果 我找到了用于生成 CRC16 CCITT 的 PHP 代码 我已经将查找表更改为mo
  • 在Python中计算modbus的CRC16

    首先 抱歉 我是初学者 我在 modbus 上得到以下字节序列 01 04 08 00 00 00 09 00 00 00 00f8 0c 该字节序列上粗体的 CRC 是正确的 但是 要检查 创建 CRC 我必须遵循设备规范 其中规定 错误
  • 如何使用 pymodbus 写入 PLC 输入寄存器

    我想使用 pymodbus 写入 PLC 输入寄存器 我能够阅读它们 from pymodbus client sync import ModbusTcpClient client ModbusTcpClient 10 10 10 32 c
  • Qt modbus串口流控处理

    我正在通过串行端口使用 QModbusDevice 编写一个小程序 使用QModbusRtuSerialMaster类 并有一些问题 问题之一似乎是串口的流量控制不正确 检查串行端口嗅探器时 我发现工作客户端在发送请求时打开 RTS 然后关
  • pymodbus TcpClient超时

    我遇到 pymodbus TcpClient 超时问题 import logging from pymodbus client sync import ModbusTcpClient logging basicConfig log logg
  • 带 Spring Boot 项目的 Modbus 脉冲线圈

    必须实施呼叫数字IO with Modbus协议 on 春季启动项目构建者Maven 它应该是在身体上有一定持续时间的脉冲呼叫 例如 5 秒等 以下是规范中的一个片段 关于响应和错误的更多信息 看来这个呼叫应用程序应该表现得像一个大师 在这

随机推荐