java的琐碎学习之串口通信与数据库与GUI

2023-05-16

RFID作业,要求实现软硬结合,全部使用自己的页面完成;
找了几个教程发现安卓我做不到,就用了Java实现;
图书管理系统。
可以通过写卡来绑定15693卡和书籍,实现增删改查功能;刷卡会改变书的出入库状态;好像没了哈哈哈哈
首先感谢这位大佬的串口通信博文容华谢后使用Java实现串口通信(二)
当时遇到了问题也是看到了博主的评论才解决的,实在是万分感谢。在这里插入图片描述

运行截图如下:在这里插入图片描述

串口通信的包和sqlite的包都在【File->Project Structure->Moudle->Denpendicies】里的+号添加。在这里插入图片描述
我的目录:

六个frame对应六个页面。三个Utils是博主的,我没有仔细去看;剩下两个分别是数据库和串口操作了。

硬件部分比较简单,单片机的代码是等待串口的数据,收到数据后存下来。在读到卡的时候写到卡里,实现交互。

串口操作

说实话我没仔细看,就是能够获取数据和传递数据就行了。是直接用的博主的代码
获取数据:
【其中,setText是让textview显示。append则是显示下一行】
而收到的数据是先保存在data里,然后显示在textview上,所以这里可以把data截下来做自己的事情;data是byte[]数组,先转成自己想要的类型。
我这里是把data作为参数插入数据库了。

/**
     * 打开串口
     *
     * @param evt
     *            点击事件
     */
    private void openSerialPort(java.awt.event.ActionEvent evt) {
        // 获取串口名称
        String commName = (String) mCommChoice.getSelectedItem();
        // 获取波特率,默认为9600
        int baudrate = 9600;
        String bps = (String) mBaudrateChoice.getSelectedItem();
        baudrate = Integer.parseInt(bps);

        // 检查串口名称是否获取正确
        if (commName == null || commName.equals("")) {
            ShowUtils.warningMessage("没有搜索到有效串口!");
        } else {
            try {
                mSerialport = SerialPortManager.openPort(commName, baudrate);
                if (mSerialport != null) {
                    mDataView.setText("串口已打开" + "\r\n");
                    mSerialPortOperate.setText("关闭串口");
                }
            } catch (PortInUseException e) {
                ShowUtils.warningMessage("串口已被占用!");
            }
        }

        // 添加串口监听
        SerialPortManager.addListener(mSerialport, new SerialPortManager.DataAvailableListener() {

            @Override
            public void dataAvailable() {
                byte[] data = null;
                try {
                    if (mSerialport == null) {
                        ShowUtils.errorMessage("串口对象为空,监听失败!");
                    } else {
                        // 读取串口数据
                        data = SerialPortManager.readFromPort(mSerialport);

                        // 以字符串的形式接收数据
                        if (mDataASCIIChoice.isSelected()) {
                            mDataView.append(new String(data) + "\r\n");
                            new DBSqlite().insertsql(sendname,"在库",mDataInputAdress.getText(),ByteUtils.byteArrayToHexString(data));

                        }

                        // 以十六进制的形式接收数据
                        if (mDataHexChoice.isSelected()) {
                            mDataView.append(ByteUtils.byteArrayToHexString(data) + "\r\n");
                        }
                    }
                } catch (Exception e) {
                    ShowUtils.errorMessage(e.toString());
                    // 发生读取错误时显示错误信息后退出系统
                    System.exit(0);
                }
            }
        });
    }

发送数据:
这里其实是把要发送的数据作为参数放到数据库了

    /**
     * 发送数据
     *
     * @param evt
     *            点击事件
     */
    private void sendData(java.awt.event.ActionEvent evt) {
        // 待发送数据
        String data = mDataInput.getText().toString();

        if (mSerialport == null) {
            ShowUtils.warningMessage("请先打开串口!");
            return;
        }

        if ("".equals(data) || data == null) {
            ShowUtils.warningMessage("请输入要发送的数据!");
            return;
        }
        sendname=data;

        // 以字符串的形式发送数据
        if (mDataASCIIChoice.isSelected()) {
            SerialPortManager.sendToPort(mSerialport, data.getBytes());
        }

        // 以十六进制的形式发送数据
        if (mDataHexChoice.isSelected()) {
            SerialPortManager.sendToPort(mSerialport, ByteUtils.hexStr2Byte(data));
        }
    }

数据库操作

这个才是重点我觉得。
我也算是第一次用数据库做东西,但是数据库都是sql语句嘛,逻辑是很好理解的。
而且Java连sqlite的方式比较简单,连接然后执行就行了。
我的函数列表(方法?)
在这里插入图片描述
创建数据库:
【UNIQUE,一个表中这个值只允许出现一次;我的是15693的卡号,不允许一张卡出现两次。】

void createSql(){
        Connection c = null;
        try {
            Class.forName("org.sqlite.JDBC");

            // 此条语句执行完,如果不存在test.db库,将会自动创建一个test.db文件
            c = DriverManager.getConnection("jdbc:sqlite:"+db);
            System.out.println("create database success");
            // 建表的sql
            String sql = "CREATE TABLE Books4 " +
                    "(ID INTEGER PRIMARY KEY AUTOINCREMENT ," +
                    " NAME           TEXT    NOT NULL, " +
                    " STATUS            TEXT     NOT NULL, " +
                    " ADDRESS            TEXT     NOT NULL , " +
                    " IDCARD       TEXT          NOT NULL UNIQUE)";
            Statement st =  c.createStatement();
            // 执行命令
            st.executeUpdate(sql);
            c.close();
            st.close();
        } catch ( Exception e ) {
            //String sql = "CREATE UNIQUE INDEX  ON Books4 (ADDRESS)";
            System.err.println( e.getMessage() );
        }
    }

插入:

public void insertsql(String name,String status,String address,String idcard){
        Connection c = null;
        Statement stmt = null;
        
        try {
            Class.forName("org.sqlite.JDBC");
            c = DriverManager.getConnection("jdbc:sqlite:"+db);
            c.setAutoCommit(false);
            System.out.println("Opened database successfully");

            stmt = c.createStatement();
            String sql = "INSERT  INTO Books4 (NAME,STATUS,ADDRESS,IDCARD) " +
                    "VALUES ('"+name+"','"+status+"','"+address+"','"+idcard+"');";
            stmt.executeUpdate(sql);

            stmt.close();
            c.commit();
            c.close();
        } catch ( Exception e ) {
            System.err.println( e.getClass().getName() + ": :::" + e.getMessage() );
            ShowUtils.errorMessage("卡号已存在,请注意!");
            //System.exit(0);
        }
        System.out.println("Records created successfully");
    }

查询:
like是模糊查询,=是限定查询
还可以自己加东西比如:

"select * from Books4 where status = '在库' AND name like '%"+name+"%';"
public String queryname(String name) throws ClassNotFoundException, SQLException {
        String text="";

        Class.forName("org.sqlite.JDBC");

        Connection conn = DriverManager.getConnection("jdbc:sqlite:" + db);
        Statement state = conn.createStatement();
        ResultSet rs = state.executeQuery("select * from Books4 where name like '%"+name+"%';"); //查询数据
        while (rs.next()) { //将查询到的数据打印出来
            text=text+"ID = " + rs.getString("ID")
                    + "NAME = " + rs.getString("NAME")
                    + "STATUS = " + rs.getString("STATUS")
                    + "ADDRESS = " + rs.getString("ADDRESS")
                    + "IDCARD = " + rs.getString("IDCARD")+"\n";
        }
        rs.close();
        conn.close();
        return text;
    }

修改:

    public String updatastatus(String name) throws ClassNotFoundException, SQLException {
        String text="修改成功!书籍信息如下:\n";

        Class.forName("org.sqlite.JDBC");

        Connection conn = DriverManager.getConnection("jdbc:sqlite:" + db);
        Statement state = conn.createStatement();
        ResultSet rs = state.executeQuery("select * from Books4 where name= '"+name+"';"); //查询数据
        conn.setAutoCommit(false);
        while (rs.next()) {
            if("在库".equals(rs.getString("STATUS"))){
                String sql = "UPDATE Books4 set status = '"+"出库"+"' where ID="+rs.getString("ID")+";";
                state.executeUpdate(sql);
                conn.commit();
            }
            else{
                String sql = "UPDATE Books4 set status = '"+"在库"+"' where ID="+rs.getString("ID")+";";
                state.executeUpdate(sql);
                conn.commit();
            }

            ResultSet rs2 = state.executeQuery("select * from Books4 where name= '"+name+"';"); //查询数据
            while (rs2.next()) { //将查询到的数据打印出来
                text=text+"ID = " + rs2.getString("ID")
                        + "NAME = " + rs2.getString("NAME")
                        + "STATUS = " + rs2.getString("STATUS")
                        + "ADDRESS = " + rs.getString("ADDRESS")
                        +"\n";}
        }
        rs.close();
        conn.close();
        return text;
    }

删除:

    public String deletesql(String name){//id,根据id删除
        String text="";
        Connection c = null;
        Statement stmt = null;
        try {
            Class.forName("org.sqlite.JDBC");
            c = DriverManager.getConnection("jdbc:sqlite:"+db);
            c.setAutoCommit(false);
            System.out.println("Opened database successfully");

            stmt = c.createStatement();
            String sql = "DELETE from Books4 where NAME='"+name+"';";
            stmt.executeUpdate(sql);
            c.commit();
            text="删除成功!目前全部库存如下:\n"+queryname("");//查询所有数据
            stmt.close();
            c.close();
        } catch ( Exception e ) {
            System.err.println( e.getClass().getName() + ": " + e.getMessage() );
            System.exit(0);
        }
        System.out.println("Operation done successfully");
        return text;

    }

GUI界面设计部分

,有一些乱,学过安卓会比较好理解。
拿其中一个举例。在这里插入图片描述整个大弹窗是一个frame,然后可以包含一些控件(Java里是叫容器吧);上图蓝色框框是一个panel面板,她处于frame里,又包含着button这些控件;他们的位置是由上一级决定的,左上角的坐标是(0,0)

// 程序界面宽度
    public final int WIDTH = 530;
    // 程序界面高度
    public final int HEIGHT = 390;

    private JButton querybutton = new JButton("查询");
    private JButton deletebutton = new JButton("删除");
    private JButton insertbutton = new JButton("增加");
    private JButton updatabutton = new JButton("修改");
    private JPanel userPanel = new JPanel();
    private JTextField inputText=new JTextField();
    private JTextArea sqlView = new JTextArea();
    private JScrollPane sqlScrollDataView = new JScrollPane(sqlView);
    private ButtonGroup mDataChoice = new ButtonGroup();
    private JRadioButton statusChoice = new JRadioButton("在库");
    private JRadioButton allChoice = new JRadioButton("全部",true);

    public ManageFrame() throws SQLException, ClassNotFoundException {
        initUserView();
        initUserComponents();
        actionUserListener();
    }

    /**
     * 初始化窗口:大小,位置,标题
     */
    private void initUserView() {
        // 关闭程序
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        // 禁止窗口最大化
        setResizable(false);

        // 设置程序窗口居中显示
        Point p = GraphicsEnvironment.getLocalGraphicsEnvironment().getCenterPoint();
        setBounds(p.x - WIDTH / 2, p.y - HEIGHT / 2, WIDTH, HEIGHT);
        this.setLayout(null);

        setTitle("图书管理系统-管理界面-查询");
    }

    //设置按钮位置
    private void initUserComponents() {
        // 数据显示
        sqlView.setFocusable(false);
        sqlScrollDataView.setBounds(10, 10, 505, 200);
        add(sqlScrollDataView);

        userPanel.setBorder(BorderFactory.createTitledBorder("行使您的管理权限"));
        userPanel.setBounds(50, 220, 415, 130);
        userPanel.setLayout(null);
        add(userPanel);

        inputText.setBounds(25, 25, 265, 50);
        userPanel.add(inputText);


        querybutton.setFocusable(false);
        querybutton.setBounds(45, 95, 90, 20);
        userPanel.add(querybutton);
        statusChoice.setBounds(140, 95, 55, 20);
        allChoice.setBounds(200, 95, 55, 20);
        mDataChoice.add(statusChoice);
        mDataChoice.add(allChoice);
        userPanel.add(statusChoice);
        userPanel.add(allChoice);
        deletebutton.setFocusable(false);
        deletebutton.setBounds(300, 15, 90, 30);
        userPanel.add(deletebutton);
        insertbutton.setFocusable(false);
        insertbutton.setBounds(300, 55, 90, 30);
        userPanel.add(insertbutton);
        updatabutton.setFocusable(false);
        updatabutton.setBounds(300, 95, 90, 30);
        userPanel.add(updatabutton);


    }

然后是按钮的监听事件,也是数据库执行的地方了。
【查询很长,但是是因为我分类比较多,其实可以去掉一半的,但是程序员的代码往往不敢动。反正每一个if与else里都是相同的东西。甚至可以只看前两个。】

querybutton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if ("".equals(inputText.getText().toString()) ) {//选择页面
                    if(statusChoice.isSelected()){//选中在库
                        try {
                            sqlView.setText(new DBSqlite().querystatusandname(inputText.getText().toString()));
                        } catch (ClassNotFoundException classNotFoundException) {
                            classNotFoundException.printStackTrace();
                        } catch (SQLException throwables) {
                            throwables.printStackTrace();
                        }

                    }else{
                        try {
                            sqlView.setText(new DBSqlite().queryname(inputText.getText().toString()));
                        } catch (ClassNotFoundException classNotFoundException) {
                            classNotFoundException.printStackTrace();
                        } catch (SQLException throwables) {
                            throwables.printStackTrace();
                        }
                    }


                }
                else {
                    if(statusChoice.isSelected()){
                        try {
                            sqlView.setText(new DBSqlite().querystatusandname(inputText.getText().toString()));
                        } catch (ClassNotFoundException classNotFoundException) {
                            classNotFoundException.printStackTrace();
                        } catch (SQLException throwables) {
                            throwables.printStackTrace();
                        }

                    }else{
                        try {
                            sqlView.setText(new DBSqlite().queryname(inputText.getText().toString()));
                        } catch (ClassNotFoundException classNotFoundException) {
                            classNotFoundException.printStackTrace();
                        } catch (SQLException throwables) {
                            throwables.printStackTrace();
                        }
                    }


                }
            }
        });

删除比较简单,就是获得输入的字符串然后调用删除就行了。

deletebutton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if ("".equals(inputText.getText().toString()) ) {//选择页面
                    ShowUtils.warningMessage("请输入要删除的书籍名!");
                } else {
                    sqlView.setText(new DBSqlite().deletesql(inputText.getText().toString())) ;
                }
            }
        });

更新我这里只贴一段,就是输入名字点击更新按钮,可以把状态改成相反的状态。if语句块是进入了另一个页面了,另一个页面是输入旧信息和新信息,后台把所有查到的名字或者位置都更新。

updatabutton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if ("".equals(inputText.getText().toString()) ) {
                    //选择页面
                    try {
                        new updateFrame().setVisible(true);
                    } catch (SQLException throwables) {
                        throwables.printStackTrace();
                    } catch (ClassNotFoundException classNotFoundException) {
                        classNotFoundException.printStackTrace();
                    }
                }else{
                    try {
                        sqlView.setText(new DBSqlite().updatastatus(inputText.getText()));
                    } catch (ClassNotFoundException classNotFoundException) {
                        classNotFoundException.printStackTrace();
                    } catch (SQLException throwables) {
                        throwables.printStackTrace();
                    }
                }
            }
        });

插入的是调用串口的那一段代码,前面已经写过。
基本上就这些吧
还有8u101的jdk和sqlite的jar包
在这里插入图片描述

https://pan.baidu.com/s/1pzKIT0ZNBxiHRMcq01iJTg#list/path=%2F
提取码:xega

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

java的琐碎学习之串口通信与数据库与GUI 的相关文章

  • TCP通信C++实现小例子

    TCP通信C 43 43 实现案例 https www bilibili com video BV1Dt411p74c t 61 1746 61 61 全部来自以上视频 xff0c 纯属搬运 xff0c 小可爱有问题可以举手提问哈 61 6
  • 串行通信简介

    一 串行通信与并行通信 计算机与外界的数据交换称为通信 xff0c 通信分为并行通信和串行通信两种基本方式 并行通信 串行通信 并行通信 xff1a 并行通信指各个数据位同时进行传送的数据通信方式 xff0c 因此有多少个数据位 xff0c
  • 使用寄存器点亮一个LED灯 普中科技stm32(stm32f1103zeb6)

    板子 xff1a 普中科技stm32F1 芯片stm32f1103zet6 1 程序如下 xff1a include 34 stm32f10x h 34 导入头文件 typedef unsigned int u32 typedef是系统关键
  • day 5 select服务器和客户端

    select客户端代码 xff1a include lt stdio h gt include lt string h gt include lt sys socket h gt include lt netinet in h gt inc
  • python Requests添加Auth和Cert

    最近通过postman发起另外一个项目的请求 xff0c 鉴权较为复杂 xff0c 首先需要设置cert xff0c postman中设置如下 xff1a 需要设置basic auth的参数 然后将接口返回的token放入auth的bear
  • STM32笔记(三)---寄存器映射--BSRR分析

    STM32笔记 xff08 三 xff09 寄存器映射 BSRR分析 GPIO与引脚区别 GPIO包含在引脚内 xff08 引脚内还有电源 晶振等特殊功能引脚 xff09 xff0c 除GPIO拓展内容即为单片机最小系统 GPIO功能如何检
  • ROS赵虚左6.5 Rviz中控制机器人模型运动_选了odom坐标系后小车变白不能动

    原因 xff1a 配置文件中的参考坐标不应该是base footprint xff0c 而是你自己小车最下面那个 小脚 的坐标系 xff0c 我的是footprint 所以把参考坐标换一下就可以了
  • 超声波传感器的基础

    超声波传感器已经有几十年的历史了 xff0c 但是由于它们的性能 灵活性和低成本 xff0c 它们仍然占据着传感市场的很大一部分 随着越来越多的产品实现了自动化 xff0c 随着机器人 自动驾驶汽车和无人驾驶飞机的出现 xff0c 需求进一
  • pthread_create未定义的引用

    在ubuntu使用gcc编译时出现 pthread create未定义的引用 问题 解决如下 xff1a 在编译时加入 l pthread 例如gcc thread c o thr l pthread 原因 xff1a pthread不是l
  • Linux下vscode实现调试

    1 安装好vscode xff0c 安装对应的插件 2 编写代码 xff0c 点击右上角的三角形 xff0c 生成对应可执行文件 3 点击菜单栏中的终端 配置任务 xff0c 选择 c c 43 43 xff1a GCC build act
  • 二进制数与十进制之间的转换以及使用一个函数实现任意进制之间的转换

    其他进制转为十进制都可以实现 xff0c 只需要将函数中的10和2换掉你需要的就行 include lt stdio h gt include lt math h gt 1 二进制转换为十进制 int twoConvertTen long
  • vscode配置C语言编译调试的方法

    一 安装GCC 官方下载 如果你能从在线安装 xff0c 那最好就在线安装吧 不过在线安装太容易中断失败了 如果你能连上官网 xff0c 也可以选择从官网去下载离线安装包 https sourceforge net projects min
  • C语言之补漏(1)

    typedef 1 define与typedef区别 xff1f 相比起宏定义的直接替换 xff0c typedef是对类型的封装 xff08 通俗说就是对类型起一个别名 xff09 2 typedef可以给多个别名 typedef int
  • 关于学习如何组装基于F4V3S飞控的竞速穿越机

    广西 河池学院 广西高校重点实验室培训基地 系统控制与信息处理重点实验室 本篇博客来自河池学院 智控无人机小组 创作时间2020 8 22 组装一架穿越机 xff0c 你需要的一些最基本的 xff0c 能让它飞起来的配件有 xff1a 机架
  • STM32—串口

    串口介绍 串行接口简称串口 xff0c 也称串行通信接口或串行通讯接口 xff08 通常指COM接口 xff09 xff0c 是采用串行通信方式的扩展接口 串行接口 xff08 Serial Interface xff09 是指数据一位一位
  • 2021电赛元件清单(评论区有题目预测)

    2021 年全国大学生电子设计竞赛仪器设备和主要元器件及器材清单 本科组 1 仪器设备清单 数字示波器 xff08 100MHz xff0c 双通道 xff09 函数发生器 xff08 50 MHz xff0c 双通道 xff09 任意波信
  • 通过TCP实现客户端与服务端之间通信

    客户端发送的消息 xff0c 服务端接收并在终端中显示出来 服务端代码 xff08 server c include lt stdio h gt include lt sys socket h gt include lt netinet i
  • Qt导入Opencv出现undefined reference to cv::xxx

    Qt配置Opencv在Qt运行时报错undefined reference to cv xxx Face Recognizer报错 FaceRecognizer load const char 41 报错 首先 xff0c 如果出现cv x
  • ESP32 之 ESP-IDF 教学(十二)WiFi篇—— LwIP 之 TCP 通信

    本文章 来自原创专栏 ESP32教学专栏 基于ESP IDF xff0c 讲解如何使用 ESP IDF 构建 ESP32 程序 xff0c 发布文章并会持续为已发布文章添加新内容 xff01 每篇文章都经过了精打细磨 xff01 通过下方对
  • ACWING 799. 最长连续不重复子序列 (入门) (双指针算法)

    给定一个长度为 n 的整数序列 xff0c 请找出最长的不包含重复的数的连续区间 xff0c 输出它的长度 输入格式 第一行包含整数 n 第二行包含 n 个整数 xff08 均在 0 105 范围内 xff09 xff0c 表示整数序列 输

随机推荐

  • STM32串口通信晶振导致问题出现

    STM32串口通信问题 关于stm32串口通信的问题 xff0c 比较常见的主要是以下几个问题 xff1a 1 xff0c 因为波特率不同导致通信时出现乱码 xff0c 这是一个比较常见的问题 xff0c 也是比较容易发现和解决的问题 2
  • 解决ERROR: cannot launch node of type [move_base/move_base]

    最近拿了别人的程序跑 xff0c 直接将工作空间git了过来 xff0c 结果发现提示错误 xff1a ERROR cannot launch node of type move base move base Cannot locate n
  • 基于单片机控制的开关电源设计

    文末下载完整资料 1 概述 1 1 课题来源及意义 电源技术是一种应用功率半导体器件 xff0c 综合电力变换技术 现代电子技术 自动控制技术的多学科的边缘交叉技术 随着科学技术的发展 xff0c 电源技术又与现代控制理论 材料科学 电机工
  • Hikvison对接iSecure Center时获取Appkey和Secert、不显示API网关、预览时提示网络请求失败

    场景 SpringBoot 43 Vue 43 iSecure Center xff08 海康综合安防管理平台 xff09 实现视频预览 xff1a SpringBoot 43 Vue 43 iSecure Center xff08 海康综
  • request和response

    文章目录 前言一 request功能1 获取请求行数据 xff08 1 xff09 方法 xff08 2 xff09 获取请求头数据 xff08 3 xff09 获取请求体数据 2 其他功能 xff08 1 xff09 获取请求参数通用方式
  • C++ Primer Plus 学习笔记(一)

    目录 第二章 开始学习C 43 43 1 主函数 2 预处理器 3 endl 第三章 处理数据 1 简单变量 2 整型 3 C 43 43 初始化 xff1a 4 字符 5 bool 6 const限定符 7 浮点数 8 算数运算符 9 类
  • 【上位机与下位机通信】使用WIFI模块ESP8266连接单片机与上位机通信

    文章目录 前言一 ESP8266模块与STM32连接二 单片机代码三 总结 前言 承接上文WIFI上位机部分 xff1a 上位机 通过WIFI上位机与网络调试助手通信绘制曲线 xff0c 现阶段实现了STM32单片机与ESP8266WIFI
  • Linux C++服务器项目——项目实战1(理论知识)

    牛客 C 43 43 高并发服务器开发 参考笔记 1 阻塞 非阻塞 同步 异步 网络lO 2 Unix Linux上的五种lO模型a 阻塞blockingb 非阻塞non blocking NIO c IO复用 IO multiplexin
  • 网络编程传输层——UDP通信

    何为传输层 xff1f 在物理层 数据链路层 网络层解决了主机和主机之间能够发送接收数据 xff0c 但是在计算机网络中 xff0c 主机的通信主体还是进程 xff0c 而传输层则解决应用进程的通信 xff0c 所谓传输层协议也是端对端协议
  • WiFi的原理以及正点原子WiFi模块的使用

    本文主要用于记录WiFi的部分协议 原理 xff0c 以及如何使用正点原子的WiFi模块 文章名 xff1a WiFi的原理以及正点原子WiFi模块的使用 作者 xff1a 遮瑕 注 xff1a 本文大量引用 WIFI基本知识整理 以及百度
  • STM32 - 用户自定义通讯协议

    一 自定义协议 帧头1 xff1a 0x5A 帧头1 xff1a 0xA5 命令类型 xff1a 0x01 ADC 读取电压 0x02 外部flash写入 0x03 外部flash 读取 0x04 内部flash 写入 0x05 内部fla
  • 串口通信介绍

    文章目录 1 串口通信简介 xff08 DB9接口讲解 xff09 2 串口通信基本原理 xff08 1 xff09 串口通信连线 xff08 2 xff09 串口通信时序 1 波特率 2 起始位 3 数据位 4 奇偶校验位 5 停止位 3
  • curl 命令详解(超详细)

    GET 请求 GET 方法是在 curl 中发出请求的默认方法 xff0c 因此不必指定任何参数 eg curl https blog ucwords com o 保存响应到文件中 curl o response tex https blo
  • Matlab 命令行显示循环显示进度条

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 目录 前言一 代码二 简单说明三 测试总结 前言 闲来无事 xff0c 在用Matlab跑循环比较长的时候 xff0c 时间长 xff0c
  • Hikvison对接NVR实现WEB无插件开发包实现前端视频预览(html、vue、nginx代理)

    场景 Vue中预览HIKVSION海康威视的NVR 网络硬盘录像机 中多个通道 摄像机 的视频 xff1a Vue中预览HIKVSION海康威视的NVR 网络硬盘录像机 中多个通道 摄像机 的视频 霸道流氓气质的博客 CSDN博客 海康nv
  • C++ 为什么编写模板类时要把方法的实现写在头文件中,而不能像写普通类一样写在源文件中?

    1 回答标题的问题 这里说下我自己的理解 xff0c 如有不正确请各位大佬斧正 想要解决这个问题需要先了解C 43 43 代码的编译过程 C 43 43 将代码编译生成可执行文件的过程可以分为三步 xff1a 预编译 编译 链接 预编译时
  • 加速度计、陀螺仪工作原理

    加速度计 陀螺仪的工作原理 参考链接 xff1a https c miaowlabs com B07 html 陀螺仪 加速度计都是惯性测量元件的一种 而 MPU 6050 传感器的内部同时集成了陀螺仪和加速度传感器两种惯性测量元件 1 加
  • VsCode中运行C/C++

    VsCode中运行C C 43 43 1 插件 runCode2 配置环境 mingw64 1 插件 runCode 在 VsCode 中的扩展商店中 xff0c 下载插件 Code Runner 安装完成之后 xff0c 进行一些配置更改
  • 常见通信协议之UART、RS485

    UART 通用异步收发器一种通用的串行 异步通信总线 xff0c 该总线有两条数据线 xff0c 可以实现全双工的发送和接受并行通信和串行通信 总线传递数据的本质 高低电信号并行通信 一次性传输多个位 布线难度高 存在数据干扰串行通信 逐次
  • java的琐碎学习之串口通信与数据库与GUI

    RFID作业 xff0c 要求实现软硬结合 xff0c 全部使用自己的页面完成 xff1b 找了几个教程发现安卓我做不到 xff0c 就用了Java实现 xff1b 图书管理系统 可以通过写卡来绑定15693卡和书籍 xff0c 实现增删改