ModbusRTU协议封装,控制RJ45报警器,复制一下就能用哦~

2023-11-05

本文只对   写保持寄存器 HoldingRegister  做操作,其他类型的寄存器方法方法也在ModbusWriteOrRead类中,可自行测试。
报警器设备型号(USB版):JD01AX07 01

设备外观及亮灯:

文档说明-部分: 

注: 以下图第一个绿灯开启的二进制命令为例:

01 06:寄存器类型

00 00:寄存器地址

00 01:数据(打开)

48 0A:CRC校验码

 

 接下来上代码:没有yml配置,需要将配置写入静态代码,如果有可以在静态代码中读取配置信息的方法请@我修改,谢谢~

maven配置:因为引入了外部lib,所以一定要加jar包路径


<dependency>
            <groupId>jssc</groupId>
            <artifactId>jssc</artifactId>
            <version>2.8.0</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/src/main/resources/libs/jssc.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>com.serotonin.modbus4j</groupId>
            <artifactId>modbus4j</artifactId>
            <version>3.0.3</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/src/main/resources/libs/modbus4j-3.0.3.jar</systemPath>
        </dependency>

        
<plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
<!--                    <executable>true</executable>-->
<!--                    <fork>true</fork>-->
                    <!--值为true是指打包时包含scope为system的第三方Jar包-->
                    <includeSystemScope>true</includeSystemScope>

                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

        </plugins>
    </build>

文章后面有lib附件,直接引用

需要注意的地方:当设备插入时会使用某一个空闲串口,打开计算机管理,找到使用的串口,替换到工具类的串口参数。(虚拟机串口查询:ls /dev/tty*)

工具类封装:

import com.serotonin.modbus4j.ModbusFactory;
import com.serotonin.modbus4j.ModbusMaster;
import com.serotonin.modbus4j.code.DataType;
import com.serotonin.modbus4j.exception.ErrorResponseException;
import com.serotonin.modbus4j.exception.ModbusInitException;
import com.serotonin.modbus4j.exception.ModbusTransportException;
import com.serotonin.modbus4j.locator.BaseLocator;
import com.serotonin.modbus4j.msg.WriteCoilRequest;
import com.serotonin.modbus4j.msg.WriteCoilResponse;
import com.serotonin.modbus4j.msg.WriteCoilsRequest;
import com.serotonin.modbus4j.msg.WriteCoilsResponse;
import com.serotonin.modbus4j.serial.SerialPortWrapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

@Slf4j
@Component
public class ModbusWriteOrRead {

    //设备id
    private static final Integer SLAVE_ID = 1;
    // master 工厂
    static ModbusFactory modbusFactory;

    // master 对象
    static ModbusMaster master;

    // 静态方法初始化 master
    static {
        modbusFactory = new ModbusFactory();
        // 使用 Modbus-TCP 进行通信
//        IpParameters param = new IpParameters();
//        param.setHost("localhost");
//        param.setPort(502);
//        master = modbusFactory.createTcpMaster(param, false);
        // 使用 Modbus-RTU 进行通信 // 设置串口参数,串口是COM12,波特率是9600,数据长8字节
        SerialPortWrapper serialParameters = new SerialPortWrapperImpl("COM5", 9600,
                8, 1, 0, 0, 0);
        master = modbusFactory.createRtuMaster(serialParameters);
        try {
            //设置超时时间
            master.setTimeout(3000);
            //设置重连次数
            master.setRetries(3);
            master.init();
        } catch (ModbusInitException e) {
            log.error("master 初始化失败~");
            throw new RuntimeException("master 初始化失败~");
        }
    }

    /**
     * 主方法测试
     * 绿灯黄灯亮度红灯默认亮度8080, 第一个80指的是红灯亮度,16进制80对应十进制128,为亮度最大值的一半,第二个80是绿灯亮度,含义同红灯,当设置十进制65535时对应16进制的FFFF,FF对应255,此时为最亮
     * 注:已调最大亮度,红绿黄亮度值最大
     */
    public static void maain(String[] args) throws ModbusTransportException, ErrorResponseException {

//        writeRegister(SLAVE_ID, SlaveOffsetEnum.OFFSET_CONTROL_RED_OFF.getOffset(), SlaveOffsetEnum.OFFSET_CONTROL_RED_OFF.getValue(), DataType.TWO_BYTE_INT_UNSIGNED);
//        writeRegister(SLAVE_ID, 3, 255, DataType.TWO_BYTE_INT_UNSIGNED);
//        writeRegister(SLAVE_ID, 1, 0, DataType.TWO_BYTE_INT_UNSIGNED);
//        writeRegister(SLAVE_ID, 2, 0, DataType.TWO_BYTE_INT_UNSIGNED);
//        writeRegister(SLAVE_ID, 5, 0, DataType.TWO_BYTE_INT_UNSIGNED);
        batchRead();
//        writeRegister(SLAVE_ID, SlaveOffsetEnum.OFFSET_CONTROL_RED_ON.getOffset(), SlaveOffsetEnum.OFFSET_CONTROL_RED_ON.getValue(), DataType.TWO_BYTE_INT_UNSIGNED);
//        System.out.println("=====读线圈 CoilStatus=====");
//        System.out.println("0>>>" + readCoilStatus(1, 0));
//        System.out.println("5>>>" + readCoilStatus(1, 5));
//        System.out.println("=====读离散量输入 InputStatus=====");
//        System.out.println("7>>>" + readInputStatus(1, 7));
//        System.out.println("8>>>" + readInputStatus(1, 8));
//        System.out.println("=====读保持寄存器 HoldingRegister=====");
//        System.out.println("0>>>" + readHoldingRegister(1, 0, DataType.FOUR_BYTE_INT_SIGNED));
//        System.out.println("2>>>" + readHoldingRegister(1, 2, DataType.FOUR_BYTE_INT_SIGNED));
//        System.out.println("=====读输入寄存器 InputRegisters=====");
//        System.out.println("6>>>" + readInputRegisters(2, 1, DataType.FOUR_BYTE_INT_SIGNED));
//        System.out.println("8>>>" + readInputRegisters(2, 2, DataType.FOUR_BYTE_INT_SIGNED));
//        System.out.println("=====测试批量读取=====");
//        batchRead();
    }

    /**
     * 读线圈 CoilStatus
     *
     * @param slaveId 从机id
     * @param offset  偏移量
     * @return 读取数据值
     */
    public static Boolean readCoilStatus(int slaveId, int offset)
            throws ModbusTransportException, ErrorResponseException {
        BaseLocator<Boolean> locator = BaseLocator.coilStatus(slaveId, offset);
        return master.getValue(locator);
    }


    /**
     * 读离散量输入 InputStatus
     *
     * @param slaveId 从机id
     * @param offset  偏移量
     * @return 读取数据值
     */
    public static Boolean readInputStatus(int slaveId, int offset)
            throws ModbusTransportException, ErrorResponseException {
        BaseLocator<Boolean> locator = BaseLocator.inputStatus(slaveId, offset);
        return master.getValue(locator);
    }

    /**
     * 读保持寄存器 HoldingRegister
     *
     * @param slaveId  从机id
     * @param offset   偏移量
     * @param dataType 数据类型
     * @return 读取数据值
     */
    public static Number readHoldingRegister(int slaveId, int offset, int dataType)
            throws ModbusTransportException, ErrorResponseException {
        BaseLocator<Number> locator = BaseLocator.holdingRegister(slaveId, offset, dataType);
        return master.getValue(locator);
    }


    /**
     * 读输入寄存器 InputRegisters
     *
     * @param slaveId  从机id
     * @param offset   偏移量
     * @param dataType 数据类型
     * @return 读取数据值
     */
    public static Number readInputRegisters(int slaveId, int offset, int dataType)
            throws ModbusTransportException, ErrorResponseException {
        BaseLocator<Number> locator = BaseLocator.inputRegister(slaveId, offset, dataType);
        return master.getValue(locator);
    }

    /**
     * 写线圈 CoilStatus
     *
     * @param slaveId     从机id
     * @param writeOffset 偏移量
     * @param writeValue  写入值
     * @return 写入结果
     */
    public static boolean writeCoil(int slaveId, int writeOffset, boolean writeValue)
            throws ModbusTransportException {
        // 创建请求
        WriteCoilRequest request = new WriteCoilRequest(slaveId, writeOffset, writeValue);
        // 发送请求并获取响应对象
        WriteCoilResponse response = (WriteCoilResponse) master.send(request);
        return !response.isException();
    }

    /**
     * 批量写线圈 CoilStatus
     *
     * @param slaveId     从机id
     * @param startOffset 写入起始偏移量
     * @param bdata       写入数据集
     * @return 写入结果
     */
    public static boolean writeCoils(int slaveId, int startOffset, boolean[] bdata)
            throws ModbusTransportException {
        // 创建请求
        WriteCoilsRequest request = new WriteCoilsRequest(slaveId, startOffset, bdata);
        // 发送请求并获取响应对象
        WriteCoilsResponse response = (WriteCoilsResponse) master.send(request);
        return !response.isException();
    }

    /**
     * 写保持寄存器 HoldingRegister
     *
     * @param slaveId     从机id
     * @param writeOffset 偏移量
     * @param writeValue  写入值
     * @param dataType    写入值数据类型
     */
    public static void writeRegister(int slaveId, int writeOffset, Number writeValue, int dataType)
            throws ModbusTransportException, ErrorResponseException {
        // 创建寻址对象
        BaseLocator<Number> locator = BaseLocator.holdingRegister(slaveId, writeOffset, dataType);
        // 执行写入操作
        master.setValue(locator, writeValue);
    }

    /**
     * @param
     * @Description: 批量读取使用方法
     * @return:
     * @Author: hyh
     * @Date: 2023/6/12 15:56
     */
    public static void batchRead() throws ModbusTransportException, ErrorResponseException {
        log.info("绿灯 寄存器地址:0值= " + readHoldingRegister(SLAVE_ID, 0, DataType.TWO_BYTE_INT_UNSIGNED).toString());
        log.info("黄灯 寄存器地址:1值= " + readHoldingRegister(SLAVE_ID, 1, DataType.TWO_BYTE_INT_UNSIGNED).toString());
        log.info("红灯 寄存器地址:2值= " + readHoldingRegister(SLAVE_ID, 2, DataType.TWO_BYTE_INT_UNSIGNED).toString());
        log.info("亮度 寄存器地址:3值= " + readHoldingRegister(SLAVE_ID, 3, DataType.TWO_BYTE_INT_UNSIGNED).toString());
        log.info("寄存器地址:4值= " + readHoldingRegister(SLAVE_ID, 4, DataType.TWO_BYTE_INT_UNSIGNED).toString());
        log.info("蜂鸣器 寄存器地址:5值= " + readHoldingRegister(SLAVE_ID, 5, DataType.TWO_BYTE_INT_UNSIGNED).toString());
        log.info("寄存器地址:6值= " + readHoldingRegister(SLAVE_ID, 6, DataType.TWO_BYTE_INT_UNSIGNED).toString());
        log.info("寄存器地址:7值= " + readHoldingRegister(SLAVE_ID, 7, DataType.TWO_BYTE_INT_UNSIGNED).toString());
        log.info("寄存器地址:8值= " + readHoldingRegister(SLAVE_ID, 8, DataType.TWO_BYTE_INT_UNSIGNED).toString());

    }
//    public static void batchRead() throws ModbusTransportException, ErrorResponseException {
//
//        BatchRead<Integer> batch = new BatchRead<Integer>();
//
        batch.addLocator(0, BaseLocator.coilStatus(1, 0));
        batch.addLocator(1, BaseLocator.inputStatus(1, 7));
        batch.addLocator(2, BaseLocator.holdingRegister(1, 0, DataType.FOUR_BYTE_FLOAT));
        batch.addLocator(3, BaseLocator.inputRegister(1, 6, DataType.FOUR_BYTE_FLOAT));
//
//        batch.addLocator(0, BaseLocator.holdingRegister(1, 0, DataType.FOUR_BYTE_FLOAT));
//        batch.addLocator(1, BaseLocator.holdingRegister(1, 1, DataType.FOUR_BYTE_FLOAT));
//        batch.addLocator(2, BaseLocator.holdingRegister(1, 2, DataType.FOUR_BYTE_FLOAT));
//        batch.addLocator(3, BaseLocator.holdingRegister(1, 3, DataType.FOUR_BYTE_FLOAT));
//        batch.addLocator(4, BaseLocator.holdingRegister(1, 4, DataType.FOUR_BYTE_FLOAT));
//        batch.addLocator(5, BaseLocator.holdingRegister(1, 5, DataType.FOUR_BYTE_FLOAT));
//        batch.addLocator(6, BaseLocator.holdingRegister(1, 6, DataType.FOUR_BYTE_FLOAT));
//        batch.addLocator(7, BaseLocator.holdingRegister(1, 7, DataType.FOUR_BYTE_FLOAT));
//        batch.addLocator(8, BaseLocator.holdingRegister(1, 8, DataType.FOUR_BYTE_FLOAT));
//        batch.setContiguousRequests(false);
//        BatchResults<Integer> results = master.send(batch);
//    }

}

连接及发送方法重写:

package com.vcom.acoustooptic.utils;

import com.serotonin.modbus4j.serial.SerialPortWrapper;
import jssc.SerialPort;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.InputStream;
import java.io.OutputStream;

/**
 *
 */
public class SerialPortWrapperImpl implements SerialPortWrapper {

    private static final Logger LOG = LoggerFactory.getLogger(SerialPortWrapperImpl.class);
    private final SerialPort port;
    private final int baudRate;
    private final int dataBits;
    private final int stopBits;
    private final int parity;
    private final int flowControlIn;
    private final int flowControlOut;


    public SerialPortWrapperImpl(String commPortId, int baudRate, int dataBits, int stopBits,
                                 int parity, int flowControlIn, int flowControlOut) {

        // 设置端口波特率
        this.baudRate = baudRate;
        //设定数据位的位数  RTU:8位    ASCII:7位
        this.dataBits = dataBits;
        //停止位的位数,如果无奇偶校验为2,有奇偶校验为1
        this.stopBits = stopBits;
        //奇偶校验位  无校验:0 奇校验:1 偶校验:2
        this.parity = parity;
        //硬件之间输入流应答控制
        this.flowControlIn = flowControlIn;
        //硬件之间输出流应答控制
        this.flowControlOut = flowControlOut;
        // 设定MODBUS通讯的串行口
        port = new SerialPort(commPortId);

    }

    @Override
    public void close() throws Exception {
        port.closePort();
        //listeners.forEach(PortConnectionListener::closed);
        LOG.debug("Serial port {} closed", port.getPortName());
    }

    @Override
    public void open() {
        try {
            port.openPort();
            port.setParams(this.getBaudRate(), this.getDataBits(), this.getStopBits(), this.getParity());
            port.setFlowControlMode(this.getFlowControlIn() | this.getFlowControlOut());

            //listeners.forEach(PortConnectionListener::opened);
            LOG.debug("Serial port {} opened", port.getPortName());
        } catch (Exception ex) {
            LOG.error("Error opening port : {} for {} ", port.getPortName(), ex);
        }
    }

    @Override
    public InputStream getInputStream() {
        return new SerialInputStream(port);
    }

    @Override
    public OutputStream getOutputStream() {
        return new SerialOutputStream(port);
    }

    @Override
    public int getBaudRate() {
        return baudRate;
        //return SerialPort.BAUDRATE_9600;
    }

    @Override
    public int getFlowControlIn() {
        return flowControlIn;
        //return SerialPort.FLOWCONTROL_NONE;
    }

    @Override
    public int getFlowControlOut() {
        return flowControlOut;
        //return SerialPort.FLOWCONTROL_NONE;
    }

    @Override
    public int getDataBits() {
        return dataBits;
        //return SerialPort.DATABITS_8;
    }

    @Override
    public int getStopBits() {
        return stopBits;
        //return SerialPort.STOPBITS_1;
    }

    @Override
    public int getParity() {
        return parity;
        //return SerialPort.PARITY_NONE;
    }
}

注意:DataType-写入读取类型要一致

TWO_BYTE_INT_UNSIGNED 这个是写入到一个寄存器里面

FOUR_BYTE_INT_UNSIGNED 这个是写入到多个寄存器

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

ModbusRTU协议封装,控制RJ45报警器,复制一下就能用哦~ 的相关文章

  • 在java Swing中创建带有递增和递减按钮的数字文本框

    如何在 java swing 中创建一个数字文本框 它有两个按钮 向上和向下 分别递增和递减文本框中的值 此文本框也必须可编辑仅数字值 像这样的东西 我尝试在文本框附近放置两个按钮 然后在单击按钮时手动执行操作 有没有其他方法可以更好地做到
  • 使用 JPA/ORM 生成数据库模式是一个坏主意吗?

    Salve Part of 另一个问题 答案 https stackoverflow com questions 7595578关于 SO 以及其他声称相同的声明 如果您通过 JPA 更新数据库架构 但通常不是一个好的做法 您是否真的不应该
  • Grizzly 和 Servlet 容器上下文

    我试图在我编写的 在 Grizzly 上运行的 Servlet 中获取一些注入的上下文 例如 Session 或 HttpServletRequest 但我所做的似乎都不起作用 整个过程似乎过早地停止了 并出现以下错误 SEVERE Mis
  • AbstractCollection 的 toArray 方法的实现中的代码有什么用

    public Object toArray Estimate size of array be prepared to see more or fewer elements Object r new Object size Iterator
  • 使用 Jersey Client 忽略自签名 ssl 证书 [重复]

    这个问题在这里已经有答案了 我正在使用 Jersey 客户端库对 jboss 上运行的其余服务运行测试 我使用自签名证书在服务器上正确设置了 https 在本地主机上运行 但是 每当我使用 https url 运行测试时 都会收到以下错误
  • 检索和设置 IntelliJ IDEA 插件开发的拆分窗口设置

    我正在编写一个 IntelliJ IDEA 插件 用于保存打开选项卡的会话 称为选项卡会话 https github com alp82 idea tabsession 这个问题是后续问题IntelliJ IDEA 插件开发 保存选项卡组
  • 在 Eclipse 中跨文件搜索注释掉的代码

    有没有一种快速方法可以在 Eclipse 中查找 Java 文件中所有注释掉的代码 也许是搜索中的任何选项 或者任何可以执行此操作的附加组件 它应该只能找到被注释掉的代码 而不是普通的注释 在 Eclipse 中 我只是在打开正则表达式复选
  • JPA 为每个项目选择最新实例

    假设我有一个会议实体 每次会议都有一个与会者和一个会议日期 在我的会议表中 我可能为每个与会者举行多个会议 每个会议都有不同的日期 我需要一个 JPA 查询 该查询将为所有与会者仅选择最新的会议 例如 如果我的桌子看起来像这样 Meetin
  • 如何使用 Gradle 2.10 将 ANTLR 词法分析器语法导入到另一个语法中?

    我一直在和 Terence Parr 一起学习 ANTLR 4权威的 ANTLR 4 参考 到目前为止我一直在使用 Gradle 2 10 及其内置 ANTLR 插件进行跟踪 然而 我在获取一些我从第 4 章第 38 41 页改编的代码以使
  • java“类文件包含错误的类”错误

    我正在尝试制作一个控制台应用程序来测试我的网络服务 我成功部署了一个网络服务http localhost 8080 WS myWS http localhost 8080 WS myWS我用 wsimport 制作了代理类 wsimport
  • 为什么这不会导致 NullPointerException?

    public class Null public static void greet System out println Hello world public static void main String args Null null
  • JavaPreparedStatementUTF-8字符问题

    我有一份准备好的声明 PreparedStatement st 在我的代码中 我尝试使用 st setString 方法 st setString 1 userName userName 的值为 ak a setString 方法将 ak
  • 从 AlertDialog 返回值

    我想构建一个函数来创建 AlertDialog 并返回用户输入的字符串 这是我用于创建对话框的函数 如何返回该值 String m Text private String openDialog String title AlertDialo
  • jsf 中的类型未找到属性

    我正在尝试调用 jsf 中使用 primefaces 的属性 但我有错误 500 在托管bean PersonelBean 类型上找不到 我正在使用 hibernate jsf 和 spring PersonelBean java Mana
  • 当另一个线程发生事情时从主线程获取数据?

    目前我有一个线程正在运行一个侦听连接的套接字 当它收到连接时 它需要上传在主线程中收集的数据 即从主线程获取数据 但是 我传递了对象的实例 但它从未使用等待连接时收集的数据进行更新 有没有正确的方法来做到这一点 我用谷歌搜索了一下 似乎找不
  • 如何检测java控制台中而不是GUI中的箭头键? [复制]

    这个问题在这里已经有答案了 我正在编写一个应用程序 我需要检测其中的箭头键 C 有getch 函数 我们想要获取输入 然后添加对 ASCII 值的检查 我们如何检测输入箭头键 谢谢 我写了一个Java类原始控制台输入 http www so
  • JTable中动态加载大量数据

    这是我的问题 我目前有一个 JTable 其中包含 5 000 到超过 200 000 行 你知道我要说什么了 数据已经加载到内存中了 这不是问题 但是如何 我可以创建一个高效的 JTable 以便它只加载以下行 是可见的 并且任何事件仅作
  • 使用 Tomcat 和 gradle 进行休眠

    免责声明 我是 Java 新手 我正在尝试使用 Tomcat 和 Gradle 设置 Hibernate 构建运行正确 但看起来像persistence xml文件未被读取 我的项目结构如下 build gradle src main ja
  • 用于从链表中删除元素的大 O 表示法[重复]

    这个问题在这里已经有答案了 我正在阅读有关链接列表的内容 我发现 从链表中删除所需的元素需要 O n 运行时间 其中 n 是元素的数量 列表中的元素 http www cs mcgill ca dprecup courses IntroCS
  • Java applet 是否会违反同源策略

    我需要请求一些东西并从其他域获取信息 我知道由于同源政策 javascript 无法做到这一点 我的另一个选择是通过我的服务器发出代理请求 我不希望请求来自我的服务器的 IP 也不想为我的服务器创建额外的负载 并且希望客户端这样做 是否可以

随机推荐

  • phpstorm如何回滚。并取消本地提交

    1 现在我提交到本地 当前git版本为4b53dca9 上一版本为965cdf14 2 现在执行回滚操作 取消本地提交 版本复制到这里 点击reset就会回滚了 如需使用git命令操作 请参考链接https blog csdn net qq
  • Java 堆排序(大顶堆、小顶堆)

    引用 http lib csdn net article datastructure 8973 堆排序 Heapsort 是指利用堆这种数据结构所设计的一种排序算法 堆积是一个近似完全二叉树的结构 并同时满足堆积的性质 即子结点的键值或索引
  • 欧几里德求最大公约数

    欧几里德求最大公约数也是就辗转相除法 是最基础最简单的算法之一 求最大公约数 int gcd1 int a int b if a lt b swap a b return b 0 a gcd1 b a b int gcd2 int a in
  • 几款国产FPGA系列器件参数汇总

    以下是和厂商确认以及个人在各公司官网上获取的产品参数 部分产品价格可用作参考 价格实时变动 只能作参考 1 高云半导体 FPGA 器件型号 逻辑查找表 RAM资源 I O资源 pll 触发器资源 嵌入式内核 易失性 价格 晨熙系列 GW2A
  • 【并查集】黑魔法师之门

    黑魔法师之门 magician pas c cpp 题目描述 经过了16个工作日的紧张忙碌 未来的人类终于收集到了足够的能源 然而在与Violet星球的战争中 由于Z副官的愚蠢 地球的领袖applepi被邪恶的黑魔法师Vani囚禁在了Vio
  • 微信小程序使用web-view引入了vue页面,再从vue页面跳转到微信小程序页面

    在vue项目中引入weixin js sdk插件 npm i weixin js sdk save 在vue组件中引入 import wx from weixin js sdk 跳转微信小程序普通页面 wx miniProgram navi
  • 还不会gdb?看这一篇就够了

    目录 gdb是什么 它有啥威力 gdb常用命令 gdb实战 基本使用 解决coredump 总结 大家好 我是小李 今天这一篇博客来跟大家介绍一个非常有用的工具 gdb 不管是学习还是工作中 用好gdb 能让你的程序更加丝滑 gdb是什么
  • react+ant design pro+dva项目阶段型总结(不定时更新)

    1 如果你熟悉 HTML 那么 JSX 对于你来说是没有任何压力的 因为 HTML 中的所有标签 在 JSX 中都是支持的 基本上没有学习成本 只有如下几点略微的不同 class 属性变为 className tabindex 属性变为 t
  • JAVA电商 B2B2C商城系统 多用户商城系统 直播带货 新零售商城 o2o商城 电子商务 拼团商城 分销商城 直播商城 短视频商城 springcloud商城 spring cloud商城

    1 涉及平台 平台管理 商家端 PC端 手机端 买家平台 H5 公众号 小程序 APP端 IOS Android 微服务平台 业务服务 2 核心架构 Spring Cloud Spring Boot Mybatis Redis 3 前端框架
  • Mathsphere Latex产品介绍

    需求描述 对于工科生和从事科研工作的同学而言 他们在写作过程中可能需要编辑数学公式 本文将介绍一款好用的Latex公式编辑器 Mathsphere Latex Mathsphere Latex 简介 Mathsphere Latex是一款基
  • bootloader 详细介绍

    Bootloader 对于计算机系统来说 从开机上电到操作系统启动需要一个引导过程 嵌入式Linux系统同样离不开引导程序 这个引导程序就叫作Bootloader 6 1 1 Bootloader介绍 Bootloader是在操作系统运行之
  • 【VIM配置文件】

    1 vim配置文件在 vimrc中 设置完成后保存source即生效 2 插件安装 1 先下载plug vim文件 放置在 vim autoload目录下 下载命令 curl O https raw githubusercontent co
  • 了解typename的双重意义

    1 声明template参数时 前缀关键字class和typename可互换 2 请使用关键字typename表示嵌套从属类型名称 但不得在base class lists 基类列 或member initialization list 成
  • UART的Rx和Tx引脚如何互换,电平如何反转( SWAP-交换算法)

    今天给大家分享关于STM32关于UART的一些新特性 主要针对较新系列STM32 如 STM32H7 F0 G0 G4等 的UART 可通过软件改变Rx和Tx引脚 电平反转 高低反序 介绍超时等 有些时候 我们在外接RS232芯片时 会犯这
  • libdbus 实例以及使用d-feet查看接口方法

    libdbus 实例以及使用d feet查看接口方法 libdbus介绍 总线 linux系统进程间通过dbus通信 D BUS由总线构成 总线分为两种 系统总线 system bus 和会话总线 session bus 系统总线在引导时就
  • 关于win10系统system_service_exception蓝屏(hardwareprotect_x64.sys)

    hardwareprotect x64 sys报错蓝屏主要是由win10系统更新后 系统与鲁大师不兼容 win10会将鲁大师下hardwareprotect x64 sys文件映射到系统文件 导致报错蓝屏 建议在第一次报错蓝屏后 就删除鲁大
  • layui文件上传+ThinkPHP5.1

    引入文件 1 前端html代码
  • 逻辑回归分类器(Logistic Regression Classifier)

    Logistic regression 逻辑回归 是当前业界比较常用的机器学习方法 用于估计某种事物的可能性 也用来进行分类 在分类的情形下 经过学习之后的LR分类器其实就是一组权值w0 w1 wm 当输入测试样本集中的测试数据时 这一组权
  • 元组,字典,集合

    元组 字典 集合的基本操作 python 元组 tuple 基本操作 元组被称为只读列表 数据可被查询 但不能被修改 类似于列表的切片操作 元组写在小括号里面 元素之前用逗号隔开 对于一些不想被修改的数据 可以用元组来保存 创建元组 1 创
  • ModbusRTU协议封装,控制RJ45报警器,复制一下就能用哦~

    本文只对 写保持寄存器 HoldingRegister 做操作 其他类型的寄存器方法方法也在ModbusWriteOrRead类中 可自行测试 报警器设备型号 USB版 JD01AX07 01 设备外观及亮灯 文档说明 部分 注 以下图第一