05_通信案例

STM32 UART/USART在无线通信模块和蓝牙设备中的应用案例 "sendToWiFi"函数用于向Wi-Fi模块发送数据,"receiveFromWiFi"函数用于接收Wi-Fi模块发送的数据。在主循环中,通过调用这些函数实现与Wi-Fi模块的通信,实现数据的传输和远程控制。根据具体的应用要求和硬件的支持,您可以选择合适的无线通信模块和蓝牙设备,并根据其文档和相关手册,配置STM32的UART/USART用于通信和数据交互。下面是两个典型的应用案例,展示了STM32的UART/USART与无线通信模块(如Wi-Fi模块)和蓝牙设备的集成。✅作者简介:热爱科研的。 阅读详情

群聊案例

服务端

package login;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

public class Server {
    public static List<Socket> onlineSockets = new ArrayList<>();  // 用于存储"在线用户"所对应的socket对象

    public static void main(String[] args) throws Exception {
        System.out.println("---服务端启动---");

        // 创建 ServerSocket 的对象,同时为服务端注册端口
        ServerSocket serverSocket = new ServerSocket(8888);

        while (true) {
            // 使用 serverSocket 对象,调用一个 accept 方法,等待客户端的连接请求
            Socket socket = serverSocket.accept();
            onlineSockets.add(socket);  // 用户一上线,就将其 socket 存到"在线集合"里面
            System.out.println(socket.getRemoteSocketAddress() + "连接到了服务端");
            // 使用一个独立的线程,把当前的 socket 对象交给它负责处理
            new ServerReaderThread(socket).start();
        }


    }
}

class ServerReaderThread extends Thread {
    private Socket socket;

    public ServerReaderThread(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        try {
            // 从 socket 通信管道中得到一个字节输入流
            InputStream is = socket.getInputStream();
            // 把原始的字节输入流包装成数据输入流
            DataInputStream dis = new DataInputStream(is);

            while (true) {
                try {
                    // 使用数据输入流读取客户端发送过来的消息
                    String msg = dis.readUTF();
                    // 把消息分发给全部客户端
                    sendMsgtoAll(msg);
                } catch (Exception e) {
                    Server.onlineSockets.remove(socket);  // 用户想要下线,就将其 socket 从 onlineSockets 里面删除
                    System.out.println(socket.getRemoteSocketAddress() + "断开了连接");
                    dis.close();  // 关闭流管道
                    socket.close();  // 关闭连接管道
                    break;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void sendMsgtoAll(String msg) throws Exception {
        // 将消息发送给所有在线的 socket 管道
        for (Socket onlineSocket : Server.onlineSockets) {
            OutputStream os = onlineSocket.getOutputStream();
            DataOutputStream dos = new DataOutputStream(os);
            dos.writeUTF(msg);
            dos.flush();  // 注意!这里不能替换为 dos.close(),否则,程序无法运行!
        }

    }
}

客户端

package login;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;

public class Client {
    public static void main(String[] args) throws Exception {
        // 创建 Socket 对象,并同时请求与服务器程序的连接
        Socket socket = new Socket("127.0.0.1", 8888);

        // 创建独立的线程,负责随机从socket中接收服务器发送过来的消息
        new ClientReaderThread(socket).start();

        // 从 socket 通信管道中得到一个字节输出流,用来发数据给服务端程序
        OutputStream os = socket.getOutputStream();

        // 把低级的字节输出流包装成数据输出流
        DataOutputStream dos = new DataOutputStream(os);

        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("请输入>>> ");
            String msg = sc.nextLine();

            if ("exit".equals(msg)) {
                System.out.println("欢迎再来!");
                dos.close();  // 关闭数据输出流管道
                socket.close();  // 释放连接资源
                break;
            }
            // 4. 开始写数据出去了
            dos.writeUTF(msg);
            dos.flush();
        }
    }
}

class ClientReaderThread extends Thread {
    private Socket socket;

    public ClientReaderThread(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        try {
            // 从 socket 通信管道中得到一个字节输入流,接收来自服务器的数据
            InputStream is = socket.getInputStream();

            // 把低级的字节输入流包装成数据输入流
            DataInputStream dis = new DataInputStream(is);

            while (true) {
                try {
                    // 使用数据输入流读取服务端发送过来的消息
                    String msg = dis.readUTF();
                    System.out.println(msg);
                } catch (Exception e) {
                    System.out.println("服务端断开了连接");
                    dis.close();  // 关闭流管道
                    socket.close();  // 关闭连接管道
                    break;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

简易版 BS 架构

BS 架构是不需要客户端的,因为浏览器就是客户端,但是必须要有服务端!

快速实现
// 服务端

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args) throws Exception {
        System.out.println("---服务端启动---");

        // 创建 ServerSocket 的对象,同时为服务端注册端口
        ServerSocket serverSocket = new ServerSocket(80);

        while (true) {
            // 使用 serverSocket 对象,调用一个 accept 方法,等待客户端的连接请求
            Socket socket = serverSocket.accept();

            // 使用一个独立的线程,把当前的 socket 对象交给它负责处理
            new ServerReaderThread(socket).start();
        }


    }
}

class ServerReaderThread extends Thread {
    private Socket socket;

    public ServerReaderThread(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        try {
            // 从 socket 通信管道中得到一个字节输出流
            OutputStream os = socket.getOutputStream();
            // 把原始的字节输出流包装成打印输出流
            PrintStream ps = new PrintStream(os);
            ps.println("HTTP/1.1 200 OK");
            ps.println("Content-Type:text/html;charset=UTF-8");
            ps.println();  // 必须换行
            ps.println("<div style='color:red;font-size:120px;text-align:center'>我们都是追梦人</div>");

            // 由于 HTTP 协议是连接一次的,无记忆响应,响应后请关闭本次连接
            ps.close();  // 关闭打印管道
            socket.close();  // 关闭连接管道
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
优化架构
// 服务端

import java.io.OutputStream;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class Server {
    public static void main(String[] args) throws Exception {
        System.out.println("---服务端启动---");

        // 创建 ServerSocket 的对象,同时为服务端注册端口
        ServerSocket serverSocket = new ServerSocket(80);

        // 创建一个线程池,负责处理通信管道的任务
        ThreadPoolExecutor pool = new ThreadPoolExecutor(16 * 2, 16 * 2, 0, TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(8), Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.AbortPolicy());

        while (true) {
            // 使用 serverSocket 对象,调用一个 accept 方法,等待客户端的连接请求
            Socket socket = serverSocket.accept();

            // 使用一个独立的线程,把当前的ServerReaderRunnable任务对象交给它负责处理
            pool.submit(new ServerReaderRunnable(socket));

            // 在服务器上显示连接对象
            System.out.println(socket.getRemoteSocketAddress() + "访问了服务器 [" + new Date() + "]\n");
        }
    }
}

class ServerReaderRunnable implements Runnable {
    private Socket socket;

    public ServerReaderRunnable(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        try {
            // 从 socket 通信管道中得到一个字节输出流
            OutputStream os = socket.getOutputStream();
            // 把原始的字节输出流包装成打印输出流
            PrintStream ps = new PrintStream(os);
            ps.println("HTTP/1.1 200 OK");
            ps.println("Content-Type:text/html;charset=UTF-8");
            ps.println();  // 必须换行
            ps.println("<div style='color:red;font-size:120px;text-align:center'>我们都是追梦人</div>");

            // 由于 HTTP 协议是连接一次的,无记忆响应,响应后请关闭本次连接
            ps.close();  // 关闭打印管道
            socket.close();  // 关闭连接管道
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
Arduino---HC-05 蓝牙模块 蓝牙基础知识回顾: (一)Arduino和HC-05连接 注意:Arduino通过TX与HC-05进行通信,而Arduino的电压为5V,HC-05的允许电压为3.3V。短时间通信无妨(长时间可能烧毁HC-05)<接分压电路> U = 5*20/30 = 3.3V I = 5V/(10K+20K) = 0.16mA (二)Arduino和HC-05和手机通信 ... 阅读详情

相关推荐

学习STM32的无线通信

此外,学习无线通信还涉及到无线协议栈的理解和使用,如WiFi、蓝牙、LoRa等。以上代码仅涉及蓝牙模块的串口通信部分,帮助你理解STM32的无线通信能力。这个示例代码使用了STM32的USART1串口和HC-05蓝牙模块进行通信。如果有数据接收到,则将接收到的数据发送回去。学习STM32无线通信需要掌握的关键概念和技术包括无线通信协议、无线模块的使用、通信连接建立和数据传输等。在本文中,我将为你提供一个详细的代码案例,以帮助你理解和实践STM32无线通信的基础知识。设置STM32的串口参数。

wx_linying1029的博客 852

(Android Studio)Android 手机设备与HC05 蓝牙设备的通信(成功案例+源码)

     代码我忘了在哪找的,只记得是把别人网上的代码稍微整理了一下,之后再加上自己的一些东西就成功了,对,反正就是成功了。很感谢我的一个哥们帮我组建了单片机和蓝牙设备硬件方面的东西,服务器那边也是他写的,灰常感谢...在上次的博客中写的手机设备向蓝牙设备中发送消息,代码很乱不是很容易整理,这次我会把源码的地址放到文末,大家可以测试一下。一,Android 手机蓝牙 与 Android 手机蓝牙 ...

清风半夜鸣蛙 2万+

C# Modbus通信从入门到精通(26)——Modbus TCP(0x05功能码与C#代码实现)

本文详细介绍了ModbusTCP协议中0x05写单个线圈功能码的原理、发送报文、返回报文,由高级工程师多年经验总结而成,绝对干货!

qq_34059233的博客 1925

STM32-05基于HAL库(CubeMX+MDK+Proteus)串行通信案例(中断方式接收命令)

STM32-05基于HAL库(CubeMX+MDK+Proteus)串行通信案例(中断方式接收命令) COM2发送字符a,LED1熄灭; COM2发送字符b,LED1点亮; COM2发送字符c,LED2熄灭; COM2发送字符d,LED2点亮; COM2发送字符e,LED3熄灭; COM2发送字符f,LED3点亮;

Empty_Android的博客 1617

C# Modbus通信从入门到精通(17)——Modbus ASCII(0x05功能码与C#代码实现)

本文详细介绍了ModbusASCII协议中0x05写的单个输出线圈功能码的原理、发送报文、返回报文、C#代码实现,由高级工程师多年经验总结而成,绝对干货!

qq_34059233的博客 1029

学习STM32的蓝牙通信

在"Configuration"选项卡中,将"Mode"设置为"Asynchronous", "BaudRate"设置为9600,"Word Length"设置为8位,"Stop Bits"设置为1位,"Parity"设置为None。如果STM32收到的指令为"AT",那么它将返回"OK"。在"Connectivity"部分,找到一个可用的UART端口,并配置为所需的波特率(通常为9600)。点击"OK"保存设置,并点击"Project"->"Generate Code"生成初始化代码。

2401_85258012的博客 289

HC-05用户手册

HC-05用户手册 【下载地址】HC-05用户手册 HC-05用户手册为开发者提供了全面的指南,详细介绍这款高性能串口通信模块的功能、使用方法和注意事项。手册内容涵盖模块概述、硬件接口定义、配置与调试步骤,以及实际应用案例,帮助用户快速上手并优化性能。无论是智能设备还是控制系统的数据传输,HC-05都能提供稳定可靠的解决...

gitblog_06748的博客 475

STM32与HC05蓝牙通信项目实战

AT命令集(Attention Command Set)是用于与调制解调器或其他通信设备进行通信的一组指令,由Hayes公司提出,因而被称为Hayes命令集。这一命令集被广泛应用于调制解调器和各种无线通信模块,比如HC05蓝牙模块。AT命令集允许用户通过串口发送特定的文本命令来配置和控制这些设备。使用AT命令集时,需要通过串口向HC05模块发送特定格式的指令。每个命令以“AT”开头,后跟参数,最后以回车符(\r\n)结束。如果HC05接受到命令并成功执行,会响应“OK”。

weixin_28939623的博客 1313

【CW32模块使用】HC05蓝牙模块

HC-05 蓝牙串口通信模块,是基于 Bluetooth Specification V2.0 带 EDR 蓝牙协议的数传模块。无线工作频段为 2.4GHz ISM,调制方式是 GFSK。模块最大发射功率为 4dBm,接收灵敏度-85dBm,板载 PCB 天线,可以实现 10 米距离通信。模块采用邮票孔封装方式,模块大小 27mm×13mm×2mm,方便客户嵌入应用系统之内,自带 LED 灯,可直观判断蓝牙的连接状态。

2302_81038468的博客 1665

深入探索STM32与HC05蓝牙串口模块通信实验

STM32微控制器是一系列基于ARM Cortex-M处理器的32位微控制器产品线,由意法半导体(STMicroelectronics)推出,以高性能、高集成度和低功耗的特点广泛应用于工业控制、医疗设备、消费电子产品等领域。其Cortex-M系列核心包括M0、M3、M4以及M7等多个子系列,它们在性能和功能上各有侧重。蓝牙技术的普及使得无线数据传输变得更加方便,HC05蓝牙串口模块因其简单易用、成本低廉而成为许多项目中的首选。本章节将深入探讨HC05模块的基本特性和硬件连接细节。

weixin_42174098的博客 1035

HC-05蓝牙模块详解与实战应用

蓝牙SPP本身没有CRC保护,数据丢了你也未必知道。解决办法是在应用层加入校验机制。推荐帧格式:校验和可用反码求和:i++) {接收方验证帧头、帧尾和checksum,任一不符就请求重发。这样一来,即使在复杂电磁环境下,也能保证数据完整性。HC-05或许不是最先进的蓝牙模块,但它足够简单、便宜、易上手,是无数工程师踏入无线世界的起点。从点亮一颗LED,到构建遥控车、环境监测站,再到工业级点对点通信,它的潜力远比你想象的大。

weixin_42230607的博客 1745

从零上手HC-05:AT指令调试与手机蓝牙通信实战

本文详细介绍了HC-05蓝牙模块的AT指令调试与手机蓝牙通信实战,从硬件连接到AT模式设置,再到主从模式选择及手机通信测试,帮助开发者快速掌握蓝牙模块的应用技巧。通过智能灯光控制系统的项目实战,展示了HC-05在物联网开发中的实际应用。

weixin_30316097的博客 507

HC05蓝牙串口模块指令集指南

HC05是一个支持蓝牙2.0协议的串口通信模块,它能够实现设备与设备(D2D)之间的无线通信。该模块具有体积小、成本低、易集成等优点,是物联网项目中常见的蓝牙解决方案之一。使用AT指令集,开发者还可以根据具体的应用需求,开发自定义的功能。这可能涉及到编写一些特定的AT指令扩展,或者通过组合现有的AT指令来实现特定的逻辑和行为。例如,开发一个蓝牙设备搜索和自动配对的脚本。在实际应用中,需要持续测试和优化AT指令的使用策略,以确保可靠和高效的通信。

weixin_29041443的博客 545

arduino 蓝牙示例_(转载)HC-05蓝牙模块使用教程[Arduino]

BlueTooth HC-05蓝牙模块使用教程模块简介嵌入式蓝牙串口通讯模块(简称蓝牙模块)具有两种工作模式:命令响应工作模式和自动连接工作模式。命令响应模式(AT模式)首先按住蓝牙模块上的复位键然后再上电,看见蓝牙模块上的LED灯以2s间隔闪烁,就表示进入了AT模式 记住串口助手的波特率设置为38400,停止位1位,数据为8位,奇偶校验无,另外一定要勾上“发送新行”!当模块处于命令响应工作模式(...

weixin_32563411的博客 3267

在AutoDL的A100云服务器上,用Docker搞定Sapien+RobotWin环境(附完整conda list)

本文详细介绍了在AutoDL的A100云服务器上使用Docker构建Sapien+RobotWin环境的完整指南。通过配置Vulkan渲染管线、精确复现Conda环境以及解决常见问题,帮助研究人员高效搭建稳定的机器人仿真开发环境,特别适合需要高性能GPU加速的复杂仿真任务。

weixin_30689307的博客 431

(Linux)DHCP 超级作用域和中继代理(超难受做了超久)

DHCP服务器在192.168.159.0 可以实现分配IP的功能,现在要跨网段分配IP 就需要用到DHCP中继代理。中继代理有两张网卡分别eth0:IP 192.168.159.2 ;eth1: IP:192.168.200.2 。现在要实现192.168.200.0网段的客户机可以获取DHCP服务器的IP。中继代理其实是相当于一个路由器的作用 DHCP服务器的IP地址 :192.168.159...

DJ_joker的博客 2223

HC-05蓝牙串口通信实现小智AI手机端数据透传

本文详解如何利用HC-05蓝牙模块实现手机与单片机的无线串口通信,涵盖AT命令配置、硬件接线、数据透传及常见问题解决方案,适用于智能家居、语音控制等低成本快速原型开发场景。

weixin_31659095的博客 582

Win11内核隔离无法打开的解决方案详解

内核隔离问题的解决需遵循"先硬件后软件"的排查原则,90%以上的案例可通过驱动清理或外设断开解决。对于必须禁用该功能的用户,建议定期使用Windows Defender进行全盘扫描,并保持系统更新至最新版本。技术决策需在安全性和兼容性之间取得平衡,本文提供的多维解决方案可帮助用户构建更稳定的Windows 11使用环境。

mmoo_python的博客 4825

基于蓝牙模块HC05的手机控制灯开关的小项目

使用手机连接开发板蓝牙控制灯

weixin_43872506的博客 1441

汽车售后诊断 ODX 和 OTX 对比分析报告

在汽车行业不断发展的当下,汽车售后诊断技术对于保障车辆性能、维护车主权益以及提升汽车品牌服务质量起着至关重要的作用。随着汽车电子化程度的不断提高,售后诊断所涉及的数据和流程愈发复杂,这就促使行业需要更加标准化、高效化的诊断技术方案。开放诊断数据交换(ODX)和开放测试序列交换(OTX)便是在这样的背景下应运而生的两种重要标准,它们为汽车售后诊断提供了强大的支持。本报告将深入剖析 ODX 和 OTX 的技术细节、应用场景、优势与挑战,并进行全面的对比,旨在为汽车行业从业者在选择和应用这两种标准时提供有价值的参

芊言凝语 1637

29、机器人动力学中的欧拉 - 拉格朗日与哈密顿力学

本文深入探讨了机器人动力学中的欧拉-拉格朗日与哈密顿力学框架,涵盖向量流形上的辛结构、哈密顿方程的几何代数表述、泊松括号与积分不变量等核心概念。文章详细推导了机电系统中拉格朗日量与哈密顿量的构建方法,并结合牛顿-欧拉算法给出了局部哈密顿量和动量导数的迭代计算流程,适用于多关节机器人的动力学建模与控制设计。通过应用案例展示了理论在双关节机器人手臂中的实际运用,最后展望了其在优化控制、鲁棒性提升及智能融合方向的潜力。

perl8的博客 129

【JavaEE10-后端部分】SpringMVC05-综合案例1-从加法计算器看前后端交互:接口文档与HTTP通信详解

本文以简单易懂的加法计算器为案例,打破前后端开发的认知壁垒,详解接口文档的定义与核心作用 —— 作为前后端 “对话契约”,规范数据交换规则。文中从零开始,依次拆解前端 HTML 原生表单实现、后端 Spring Boot 接口开发,深入剖析 HTTP 通信底层逻辑、参数绑定原理及内容协商机制,解答开发中常见疑问,帮助读者快速掌握接口文档使用、前后端联调核心要点,轻松理解 Web 开发 “约定优先、文档先行” 的核心思想。

弹简特的博客,步履不停,持续学习,多尝试,多复盘,多沉淀。 713

MATLAB - 使用 RRT 进行挖掘机运动规划

本例演示了如何使用运动规划器在包含障碍物的环境中为挖掘机规划路径。在此示例中,您将以运动树的简化形式为挖掘机建模,然后使用基于采样的运动规划器确定挖掘机在存在障碍物的两个姿势之间的可行路径。在 Simscape™ 多体™ 模型中模拟结果。

机器人控制与仿真应用 1850

21-STM32F1-HC-05蓝牙模块

HC-05蓝牙模块   HC-05模块是一款高性能主从一体蓝牙串口模块,可以同各种带蓝牙功能的电脑、蓝牙主机、手机、 PDA、 PSP 等智能终端配对,该模块支持非常宽的波特率范围: 4800~1382400,并且模块兼容 5V 或 3.3V 单片机系统,可以很方便与您的产品进行连接。  因为我用的是HC-05的原装模块,所以还需要自己把引脚引出来。一共需要外接7个引脚,见下表; ...

深蓝判官 2031

YOLOv12涨点改进| Kimi团队 2026 |独家创新首发、注意力改进篇|爆火AttnRes残差自注意力模块,含多种创新改进,借助残差思想,缓解细节信息在传播过程中被稀释,促进YOLOv12涨点

🔥本文提出AttnRes残差自注意力模块改进YOLOv12模型,通过深度维度的注意力加权机制替代传统固定残差累加方式。该模块能自适应选择更有价值的历史层特征进行聚合,缓解浅层信息在深层传播中被稀释的问题,提升小目标和复杂场景的检测能力。文章详细介绍了模块结构、原理及优势,并提供了完整的代码实现和配置方法,包括三种改进方案:yolov12n_AttnRes.yaml、yolov12n_AttnRes-2.yaml和yolov12n_A2C2f_AttnRes2D.yaml。

Ai缝合怪、助力小伙伴高效发论文 183

SVN使用:使用TortoiseSVN遇到提示请执行“清理”命令的解决方法

作为程序员来说,在团队开发过程中关于代码管理的工具使用并不陌生,比较常用的代码合并管理工具如:Git、SVN等,虽然相关工具的使用并不复杂,但是还是要掌握常用的使用方法,尤其是相关的第三方软件的使用也是极为重要的,而且有时候使用这些三方软件来进行代码管理的时候也会遇到一些问题。本篇博文就来分享一下在SVN使用的时候使用TortoiseSVN遇到提示请执行“清理”命令的解决方法,方便查阅使用。

全沾软贱开发攻城狮 1万+
上一篇: 04_网络编程
下一篇: HTML-1
code_stream
博客等级 码龄4年 1238粉丝 169原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值