当前位置: 首页 > news >正文

RS232 串行通信:C++ 实现指南

image.png

文章目录

    • 一、RS232 简介
      • 1. 电气特性
      • 2. 传输速率
      • 3. 传输距离
    • 二、在 C++ 中实现 RS232 通信
      • 1. Windows 平台
        • (1)打开串行端口
        • (2)配置串行通信参数
        • (3)发送数据
        • (4)接收数据
        • (5)主函数示例
      • 2. Linux 平台
        • (1)打开串行端口
        • (2)配置串行通信参数
        • (3)发送数据
        • (4)接收数据
        • (5)主函数示例
    • 三、注意事项
    • 四、总结

在现代嵌入式系统和工业控制领域,RS232 串行通信仍然是一种不可或缺的技术。尽管 USB 和以太网等高速通信技术已经广泛应用,但在一些需要低速、简单通信的场景中,RS232 仍然是首选。本文将详细介绍如何在 C++ 中实现与 RS232 的通信,包括 Windows 和 Linux 平台的实现方法。

一、RS232 简介

RS232 是一种串行通信协议,用于实现设备之间的近距离数据传输。它通过一对发送和接收引脚(TxD 和 RxD)进行数据通信,并支持控制信号(如 RTS 和 CTS)以实现流控制。RS232 的传输速率通常在几百比特每秒(bps)到几十千比特每秒(kbps)之间,适用于低速数据传输场景。

1. 电气特性

RS232 使用负逻辑,逻辑“1”对应的电平范围是 -3V 到 -15V,逻辑“0”对应的电平范围是 +3V 到 +15V。这种设计使得信号在传输过程中具有一定的抗干扰能力。

2. 传输速率

RS232 的传输速率通常在几百 bps 到几十 kbps 之间。例如,常见的波特率有 9600 bps、19200 bps 和 115200 bps。波特率越高,数据传输速度越快,但传输距离和可靠性可能会受到影响。

3. 传输距离

RS232 的传输距离通常在 15 米以内。如果需要更长的传输距离,可以使用 RS485 等其他串行通信协议。

二、在 C++ 中实现 RS232 通信

在 C++ 中实现 RS232 通信,需要使用操作系统提供的串行通信 API。以下是基于 Windows 和 Linux 平台的实现方法。

1. Windows 平台

在 Windows 系统中,可以使用 Windows API 中的串行通信函数来实现与 RS232 的通信。以下是一个简单的示例代码,展示如何打开串行端口、设置通信参数、发送和接收数据。

(1)打开串行端口
#include <windows.h>
#include <iostream>// 打开串行端口
HANDLE OpenSerialPort(const char* portName)
{HANDLE hSerial;hSerial = CreateFile(portName, // 端口名称,如 "COM1"GENERIC_READ | GENERIC_WRITE, // 读写权限0, // 不共享0, // 无安全属性OPEN_EXISTING, // 打开已存在的设备0, // 非异步0 // 无模板);if (hSerial == INVALID_HANDLE_VALUE){std::cerr << "Error opening serial port" << std::endl;return INVALID_HANDLE_VALUE;}return hSerial;
}
(2)配置串行通信参数
// 配置串行通信参数
bool ConfigureSerialPort(HANDLE hSerial)
{DCB dcbSerialParams = { 0 };dcbSerialParams.DCBlength = sizeof(dcbSerialParams);if (!GetCommState(hSerial, &dcbSerialParams)){std::cerr << "Error getting state" << std::endl;return false;}dcbSerialParams.BaudRate = CBR_9600; // 波特率 9600dcbSerialParams.ByteSize = 8; // 数据位 8dcbSerialParams.StopBits = ONESTOPBIT; // 停止位 1dcbSerialParams.Parity = NOPARITY; // 无校验位if (!SetCommState(hSerial, &dcbSerialParams)){std::cerr << "Error setting state" << std::endl;return false;}return true;
}
(3)发送数据
// 发送数据
bool WriteSerialPort(HANDLE hSerial, const char* data, DWORD size)
{DWORD bytesWritten;if (!WriteFile(hSerial, data, size, &bytesWritten, 0)){std::cerr << "Error writing to port" << std::endl;return false;}return true;
}
(4)接收数据
// 接收数据
bool ReadSerialPort(HANDLE hSerial, char* buffer, DWORD size)
{DWORD bytesRead;if (!ReadFile(hSerial, buffer, size, &bytesRead, 0)){std::cerr << "Error reading from port" << std::endl;return false;}return true;
}
(5)主函数示例
int main()
{const char* portName = "COM1";HANDLE hSerial = OpenSerialPort(portName);if (hSerial == INVALID_HANDLE_VALUE){return 1;}if (!ConfigureSerialPort(hSerial)){CloseHandle(hSerial);return 1;}const char* dataToSend = "Hello, Serial Port!";if (!WriteSerialPort(hSerial, dataToSend, strlen(dataToSend))){CloseHandle(hSerial);return 1;}char readBuffer[128];if (ReadSerialPort(hSerial, readBuffer, sizeof(readBuffer))){std::cout << "Received: " << readBuffer << std::endl;}CloseHandle(hSerial);return 0;
}

2. Linux 平台

在 Linux 系统中,可以使用 POSIX 串行通信 API 来实现与 RS232 的通信。以下是一个简单的示例代码。

(1)打开串行端口
#include <iostream>
#include <fcntl.h>
#include <unistd.h>
#include <termios.h>
#include <cstring>// 打开串行端口
int OpenSerialPort(const char* portName)
{int fd = open(portName, O_RDWR | O_NOCTTY | O_SYNC);if (fd < 0){std::cerr << "Error opening serial port" << std::endl;return -1;}return fd;
}
(2)配置串行通信参数
// 配置串行通信参数
bool ConfigureSerialPort(int fd)
{struct termios tty;if (tcgetattr(fd, &tty) != 0){std::cerr << "Error getting attributes" << std::endl;return false;}cfsetospeed(&tty, B9600); // 波特率 9600cfsetispeed(&tty, B9600);tty.c_cflag &= ~PARENB; // 无校验位tty.c_cflag &= ~CSTOPB; // 1 停止位tty.c_cflag &= ~CSIZE; // 清除数据位掩码tty.c_cflag |= CS8; // 8 数据位tty.c_cflag &= ~CRTSCTS; // 关闭硬件流控制tty.c_cflag |= CREAD | CLOCAL; // 启用接收器,忽略调制解调器控制线tty.c_iflag &= ~(IXON | IXOFF | IXANY); // 关闭软件流控制tty.c_iflag &= ~(ICRNL | INLCR); // 禁用回车和换行的特殊处理tty.c_lflag &= ~ICANON;tty.c_lflag &= ~ECHO; // 关闭回显tty.c_lflag &= ~ISIG; // 关闭信号字符tty.c_oflag &= ~OPOST; // 防止特殊解释输出数据tty.c_oflag &= ~ONLCR; // 防止将换行符转换为回车换行符if (tcsetattr(fd, TCSANOW, &tty) != 0){std::cerr << "Error setting attributes" << std::endl;return false;}return true;
}
(3)发送数据
// 发送数据
bool WriteSerialPort(int fd, const char* data, size_t size)
{ssize_t bytesWritten = write(fd, data, size);if (bytesWritten < 0){std::cerr << "Error writing to port" << std::endl;return false;}return true;
}
(4)接收数据
// 接收数据
bool ReadSerialPort(int fd, char* buffer, size_t size)
{ssize_t bytesRead = read(fd, buffer, size);if (bytesRead < 0){std::cerr << "Error reading from port" << std::endl;return false;}return true;
}
(5)主函数示例
int main()
{const char* portName = "/dev/ttyS0";int fd = OpenSerialPort(portName);if (fd < 0){return 1;}if (!ConfigureSerialPort(fd)){close(fd);return 1;}const char* dataToSend = "Hello, Serial Port!";if (!WriteSerialPort(fd, dataToSend, strlen(dataToSend))){close(fd);return 1;}char readBuffer[128];if (ReadSerialPort(fd, readBuffer, sizeof(readBuffer))){std::cout << "Received: " << readBuffer << std::endl;}close(fd);return 0;
}

三、注意事项

  1. 波特率匹配:发送端和接收端的波特率必须一致,否则会导致数据传输错误。
  2. 串行端口名称:在 Windows 上,串行端口名称通常为 “COM1”、“COM2” 等;在 Linux 上,通常为 “/dev/ttyS0”、“/dev/ttyUSB0” 等。
  3. 错误处理:在实际应用中,需要对串行通信中的错误进行详细处理,例如超时错误、硬件故障等。
  4. 多线程支持:在需要同时进行发送和接收操作时,可以使用多线程来实现。

四、总结

RS232 串行通信在工业控制和嵌入式系统中仍然具有重要地位。通过使用 Windows API 和 POSIX API,我们可以在 C++ 中实现与 RS232 的通信。本文提供了详细的代码示例,帮助开发者快速上手。在实际应用中,还需要根据具体需求进行适当的扩展和优化。

相关文章:

RS232 串行通信:C++ 实现指南

文章目录 一、RS232 简介1. 电气特性2. 传输速率3. 传输距离 二、在 C 中实现 RS232 通信1. Windows 平台&#xff08;1&#xff09;打开串行端口&#xff08;2&#xff09;配置串行通信参数&#xff08;3&#xff09;发送数据&#xff08;4&#xff09;接收数据&#xff08;5&…...

电控---SWD协议

SWD协议是烧录调试常用的协议&#xff0c;本文对SWD协议进行了&#xff0c;覆盖物理层、协议层、寄存器结构、信号时序、安全特性、实际应用及最新发展趋势的讲解。 一、物理层架构与信号特性 1. 引脚定义与电气规范 核心引脚&#xff1a; SWDIO&#xff08;双向数据线&…...

Linux系统下docker 安装 redis

docker安装最新版的redis 一、docker拉取最新版redis镜像 拉取镜像若没有指定版本&#xff0c;代表拉取最新版本 二、查询redis镜像 三、挂载配置文件 在docker容器内修改redis配置文件不方便&#xff0c;所以挂载配置文件&#xff0c;这样可以在外边修改redis配置 3.1 创建…...

第 2 篇:初探时间序列 - 可视化与基本概念

第 2 篇&#xff1a;初探时间序列 - 可视化与基本概念 (图片来源: Luke Chesser on Unsplash) 在上一篇《你好&#xff0c;时间序列&#xff01;》中&#xff0c;我们了解了什么是时间序列数据以及学习它的重要性。现在&#xff0c;是时候卷起袖子&#xff0c;真正开始接触和探…...

适配器模式:化解接口不兼容的桥梁设计

适配器模式&#xff1a;化解接口不兼容的桥梁设计 一、模式核心&#xff1a;让不兼容的接口协同工作 在软件开发中&#xff0c;经常会遇到接口不兼容的情况&#xff1a;如旧系统提供的接口无法被新系统直接调用&#xff0c;或第三方库的接口与当前系统设计不匹配。适配器模式…...

科大讯飞Q1营收46.6亿同比增长27.7%,扣非净利同比增长48.3%

4月21日盘后&#xff0c;AI龙头科大讯飞&#xff08;002230.SZ&#xff09;发布2024年报&#xff0c;公司全年实现营业收入233.43亿元&#xff0c;同比增长18.79%&#xff0c;同期归母净利润为5.6亿元。 公司核心赛道业务保持快速增长&#xff0c;消费者、教育、汽车、医疗业务…...

基于大模型的血栓性外痔全流程风险预测与治疗管理研究报告

目录 一、引言 1.1 研究背景与目的 1.2 研究意义 二、血栓性外痔概述 2.1 定义与发病机制 2.2 临床表现与诊断方法 2.3 现有治疗手段综述 三、大模型在血栓性外痔预测中的应用原理 3.1 大模型技术简介 3.2 模型构建与训练数据来源 3.3 模型预测血栓性外痔的工作流程…...

Transformer系列(三):编码器—解码器架构

Transformer架构 一、多头自注意力 &#xff08;Multi-head self-attention&#xff09;将矩阵维度从d降到d/k的优点 二、层归一化 (Lary Norm)三、残差连接 (Residual Connections)Add and Norm 四、注意力对数几率缩放 &#xff08;Attention logit scaling&#xff09;五、T…...

C++入门小馆: 深入string类(二)

嘿&#xff0c;各位技术潮人&#xff01;好久不见甚是想念。生活就像一场奇妙冒险&#xff0c;而编程就是那把超酷的万能钥匙。此刻&#xff0c;阳光洒在键盘上&#xff0c;灵感在指尖跳跃&#xff0c;让我们抛开一切束缚&#xff0c;给平淡日子加点料&#xff0c;注入满满的pa…...

MCU开发学习记录10 - 高级定时器学习与实践(HAL库)—PWM互补输出、死区控制、刹车控制 - STM32CubeMX

本文将介绍高级定时器的概念&#xff08;只讲解高级定时器特有功能&#xff09;、相关函数以及STM32CubeMX生成定时器的配置函数以及对生成定时器的配置函数进行分析&#xff08;包括结构体配置、相关寄存器配置&#xff09;。针对于高级定时器实践&#xff1a;实现输出PWM互补…...

pytest基础-new

规范 1、首先创建 py 文件命名以 test_ 开始或者以 _test 结尾 2、若是新建类&#xff0c;测试类需要以 Test_开头 3、测试用例&#xff08;方法&#xff09;需要以 test_开头 assert 断言 assert xx&#xff1a;判断 xx 为真 assert not xx&#xff1a;判断 xx 不为真 asse…...

利用Qt创建一个模拟问答系统

界面&#xff1a; 添加了聊天显示区域&#xff08;QTextEdit&#xff09; 添加了发送按钮和清空对话按钮 优化了布局和窗口大小添加了时间戳显示 2、功能&#xff1a; 支持实时对话可以清空对话历史 支持按回车发送消息 添加了简单的关键词匹配响应系统 交互体验&#x…...

CCF CSP 第37次(2025.03)(1_数值积分_C++)

CCF CSP 第37次&#xff08;2025.03&#xff09;&#xff08;1_数值积分_C&#xff09; 解题思路&#xff1a;思路一&#xff1a; 代码实现代码实现&#xff08;思路一&#xff09;&#xff1a; 时间限制&#xff1a; 1.0 秒 空间限制&#xff1a; 512 MiB 原题链接 解题思路…...

使用 Flutter 遇坑小计

前言 首先, 谷哥很贴心地为国内用户准备了一份使用手册 不过很遗憾 就算你照着它的手册来了, 还是会在后续使用中遇到其它的坑 今天我踩了, 保不齐明天就是其他人(lol) running gradle task ‘assembledebug’ stuck 首先去确定下当下Android Studio(或者说你目前的Flutter项…...

C语言中的双链表和单链表详细解释与实现

C语言中的双链表详细解释与实现 双链表&#xff08;Doubly Linked List&#xff09;是一种常见的数据结构&#xff0c;它比单链表更灵活&#xff0c;因为每个节点都包含指向前驱和后继节点的指针。 双链表的基本结构 节点定义 c 复制 下载 typedef struct Node {int dat…...

CSS零基础入门笔记:狂神版

前言 本笔记是学习狂神的java教程&#xff0c;建议配合视频&#xff0c;学习体验更佳。 【狂神说Java】HTML5完整教学通俗易懂_哔哩哔哩_bilibili 第1-2章&#xff1a;Java零基础入门笔记&#xff1a;(1-2)入门&#xff08;简介、基础知识&#xff09;-CSDN博客 第3章&…...

使用python调用deepseek 多轮对话,详细讲解

以下代码实现在python中与deepseek实现多轮对话。 Messages参数是对话历史和上下文的核心载体。 数据结构&#xff1a; • 必须是包含消息对象的数组 • 每个消息对象必须包含&#xff1a; o role&#xff1a;发言者身份&#xff08;system/user/assistant&#xff09; o con…...

requestAnimationFrame是什么?【前端】

亲爱的读者&#xff0c;希望今天的你好心情~ 目录 requestAnimationFrame是什么&#xff1f;目的&#xff1f;举个栗子&#xff1a; requestAnimationFrame是什么&#xff1f; requestAnimationFrame 是一种用于优化动画性能的 JavaScript API。它允许你在浏览器的下一次重绘之…...

SQL Server基础

二. SQL Server数据库 1. 数据库简介 数据库本质是写成磁盘文件&#xff0c;在硬盘中存储用处 存储大量数据&#xff0c;方便检索和访问保持数据信息的一致、完整共享和安全通过组合分析&#xff0c;产生新的有用信息 数据库发展史 萌芽阶段&#xff1a;文件系统&#xff0c;…...

Vue-组件的懒加载,按需加载

在Vue项目中实现组件的懒加载&#xff08;也称为按需加载或代码分割&#xff09;&#xff0c;可以大大提升应用的加载速度和性能。懒加载主要通过Webpack的代码分割功能实现&#xff0c;特别是使用动态导入&#xff08;import()语法&#xff09;。 为什么要使用懒加载&#xf…...

Docker 镜像、容器和 Docker Compose的区别

前言&#xff1a;Docker 的镜像、容器和 Docker Compose 是容器化技术的核心组件&#xff0c;以下是对它们的详细解析及使用场景说明。 ​​1、Docker 镜像&#xff08;Image&#xff09;​​ ​​定义​​&#xff1a; 镜像是只读模板&#xff0c;包含运行应用程序所需的代码、…...

批量创建同名文件夹并整理文件至对应文件夹

在我们的日常工作和生活中&#xff0c;创建文件几乎是必不可少的一部分。随着时间的推移&#xff0c;电脑中积累了大量的文件&#xff0c;管理这些文件成为一项繁琐且耗时的任务。尤其当我们需要按照一定规则对文件进行整理时&#xff0c;很多人会感到困惑。例如&#xff0c;领…...

每日一题——数据中心网络地址规划

文章目录 数据中心网络地址规划问题描述输入格式输出格式示例输入示例输出实现思路1. IP地址转换2. 区间排序3. 动态规划 C语言完整实现&#xff08;含详细注释&#xff09;总结 数据中心网络地址规划 问题描述 你是一名数据中心网络地址规划人员。每个业务需要一段IP地址区间…...

如何远程访问家中服务器-FRP内网穿透详细

💡 本文会带给你 如何远程访问家中服务器FRP自动运行的方法一、准备工作 准备一台具备公网 IP 的服务器(如阿里云、腾讯云等云服务器,要求不高,几十块一年服务的轻型服务就行),用于部署 FRP 服务端(frps)。 家中电脑(内网设备),用于运行 FRP 客户端(frpc)。 下…...

el-select+vue-virtual-scroller解决数据量大卡顿问题

解决el-select中数据量过大时&#xff0c;显示及搜索卡顿问题&#xff0c;及正确的回显默认选中数据 粗略的封装了组件&#xff0c;有需要各种属性自定义的&#xff0c;自己添加设置下 环境 node 16.20.1 npm 8.19.4 vue2、element-ui "vue-virtual-scroller"…...

数码管静态显示一位字符(STC89C52单片机)

#include <reg52.h> sbit ADDR0 P1^0; sbit ADDR1 P1^1; sbit ADDR2 P1^2; sbit ADDR3 P1^3; sbit ENLED P1^4; //用数组来存储数码管的真值表&#xff0c;数组将在下一章详细介绍 unsigned char code LedChar[] { 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82…...

明心见性与真如三昧

在佛教禅宗体系中&#xff0c;明心见性与真如三昧是修行者追求的核心目标。明心见性作为修行的起点&#xff0c;揭示了众生的真如本性&#xff1b;而真如三昧则是巩固和深化这一证悟的关键修行方法。二者相辅相成&#xff0c;构成了禅宗修行的完整路径。 一、明心见性&#xf…...

并发设计模式之双缓冲系统

双缓冲的本质是 ​​通过空间换时间​​&#xff0c;通过冗余的缓冲区解决生产者和消费者的速度差异问题&#xff0c;同时提升系统的并发性和稳定性。 双缓冲的核心优势 优势具体表现解耦生产与消费生产者和消费者可以独立工作&#xff0c;无需直接同步。提高并发性生产者和消…...

使用谷歌浏览器自带功能将网页转换为PDF文件

将自己喜欢的技术网页转换为PDF文件有多种方法&#xff0c;这里介绍使用谷歌浏览器自带功能。 &#xff08;本文截图仅作为演示使用&#xff09; 使用谷歌浏览器自带功能 1.用Chrome浏览器&#xff0c;打开需要转换的网页&#xff0c;点击浏览器右上角的三个点&#xff08;菜…...

JavaEE--2.多线程

1.认识线程(Thread) 1.1概念 1)什么是线程 ⼀个线程就是⼀个 "执行流". 每个线程之间都可以按照顺序执行自己的代码. 多个线程之间 "同时" 执行着多份代码. 2)为什么要有线程 首先, "并发编程" 成为 "刚需". 1. 单核 CPU 的发展遇到…...

沐渥氮气柜控制板温湿度氧含量氮气流量四显智控系统

氮气柜控制板通常用于实时监控和调节柜内环境参数&#xff0c;确保存储物品如电子元件、精密仪器、化学品等&#xff0c;处于低氧、干燥的稳定状态。以下是沐渥氮气柜控制板核心参数的详细介绍及控制逻辑&#xff1a; 一、控制板核心参数显示模块 1&#xff09;‌温度显示‌&am…...

线性代数-矩阵的秩

矩阵的秩&#xff08;Rank&#xff09;是线性代数中的一个重要概念&#xff0c;表示矩阵中线性无关的行&#xff08;或列&#xff09;的最大数量。它反映了矩阵所包含的“有效信息”的维度&#xff0c;是矩阵的核心特征之一。 直观理解 行秩与列秩&#xff1a; 行秩&#xff1…...

【自然语言处理与大模型】模型压缩技术之量化

在这篇文章中想和大家分享什么是量化&#xff1f;为什么要量化&#xff1f;以及如何实现量化&#xff1f;通过这三个基本问题&#xff0c;我们不仅可以全面了解量化的内涵和外延&#xff0c;还能更清晰地认识到它在实践中的重要性和应用价值。 一、什么是量化呢&#xff1f; 大…...

OneClicker脚本自动运行工具

工作的时候&#xff0c;有很多琐碎的事情需要重复的做 比如打开某个文件&#xff0c;打开某个网站&#xff0c;打开某个软件 这个时候可以写个自动脚本&#xff0c;把机械琐碎的事情交给脚本处理 但是脚本一多&#xff0c;不好管理&#xff0c;而且要选择哪个脚本也是个麻烦的事…...

Activity之间交互

Backgroud&#xff1a; 想要实现Activity之间的交互&#xff0c;需要用到intent工具 本博客中所有第二Activity均为SecActivity&#xff0c;需要预先进行创建 本博客所使用的开发语言为Kotlin 使用intent调用Activity 显式调用 val intent Intent(this, SecActivity::class.…...

【React】搜索时高亮被搜索选中的文案

文章目录 代码实现 代码实现 函数封装&#xff1a; export function highlightKeyword(input: string, keyword: string | undefined) {if (!keyword || !input || !input.includes(keyword)) return input;const startIndex input.indexOf(keyword);return React.createEle…...

MCP(Minecraft Coder Pack)完全指南:从入门到精通

1. 什么是MCP&#xff1f; Minecraft Coder Pack&#xff08;简称MCP&#xff09;是一套用于反编译、修改和重新编译Minecraft Java版源代码的工具集。它允许开发者深入研究Minecraft的底层代码&#xff0c;并在此基础上进行模组&#xff08;Mod&#xff09;开发、代码分析或自…...

stm32week12

stm32学习 九.stm32与HAL库 2.HAL库框架 总架构&#xff1a; 文件介绍&#xff1a; ppp是某一外设&#xff0c;ex是拓展功能 HAL库API函数和变量命名规则&#xff1a; HAL库对寄存器位操作的相关宏定义&#xff1a; HAL库的回调函数&#xff1a; 3.STM32启动过程 MDK编译过…...

mindspeed-rl使用注意事项

1、安装 参考1&#xff1a;docs/install_guide.md R1-CLM/MindSpeed-RL - Gitee.com 参考2&#xff1a;VLLM x Ascend框架_vllm-ascend-CSDN博客 2、SFT微调 整体参考docs/supervised_finetune.md 自定义数据格式同&#xff1a;AUTO-DL 910B mindspeed-llm 4层DeepSeek …...

第 4 篇:平稳性 - 时间序列分析的基石

第 4 篇&#xff1a;平稳性 - 时间序列分析的基石 在上一篇中&#xff0c;我们学习了如何将时间序列分解为趋势、季节性和残差。我们看到&#xff0c;很多真实世界的时间序列&#xff08;比如 CO2 浓度&#xff09;都包含明显的趋势&#xff08;长期向上或向下&#xff09;和/…...

KRaft面试思路引导

Kafka实在2.8之后就用KRaft进行集群管理了 Conroller负责选举Leader&#xff0c;同时Controller管理集群元数据状态信息&#xff0c;并将元数据信息同步给各个分区的Leader 和Zookeeper管理一样&#xff0c;会选出一个Broker作为Controller去管理整个集群&#xff0c;但是元数…...

怎么建立自然语言领域的评价标准

怎么建立自然语言领域的评价标准 明确评价目标与对象 首先要清晰界定评价的目标,比如是评估模型对文本语义的理解能力、生成文本的质量,还是系统在信息检索中的表现等。同时,明确评价对象,可能是一个语言模型、一个问答系统、一个机器翻译工具等。确定评价维度与指标 语言…...

EMQX学习笔记

MQTT简介 MQTT是一种基于发布订阅模式的消息传输协议 消息&#xff1a;设备和设备之间传输的数据&#xff0c;或者服务和服务之间传输的数据 协议&#xff1a;传输数据时所遵循的规则 轻量级&#xff1a;MQTT协议占用的请求源较少&#xff0c;数据报文较小 可靠较强&#xff…...

组件是怎样写的(1):虚拟列表-VirtualList

本篇文章是《组件是怎样写的》系列文章的第一篇&#xff0c;该系列文章主要说一下各组件实现的具体逻辑&#xff0c;组件种类取自 element-plus 和 antd 组件库。 每个组件都会有 vue 和 react 两种实现方式&#xff0c;可以点击 https://hhk-png.github.io/components-show/ …...

CGAL 计算直线之间的距离(3D)

文章目录 一、简介二、实现代码三、实现效果一、简介 这里的计算思路很简单: 1、首先将两个三维直线均平移至过原点处,这里两条直线可以构成一个平面normal。 2、如果两个直线平行,那么两条直线之间的距离就转换为直线上一点到另一直线的距离。 3、如果两个直线不平行,则可…...

定期检查滚珠丝杆的频率是多久?

定期检查滚珠丝杆的频率通常是每半年进行一次‌&#xff0c;根据不同的使用环境和设备类型&#xff0c;滚珠丝杆的检查周期有所不同。接下来我们一起看看滚珠丝杆的维护保养方法&#xff1a;‌ 1、‌清洗‌&#xff1a;每隔一段时间对滚珠丝杆进行清洁&#xff0c;将滚珠丝杆拆…...

Spark-SQL连接Hive全攻略

在大数据处理领域&#xff0c;Spark-SQL与Hive的结合能发挥强大的功能。今天就来给大家分享一下Spark-SQL连接Hive的多种方式。 Spark SQL编译时可选择包含Hive支持&#xff0c;这样就能使用Hive表访问、UDF、HQL等特性&#xff0c;而且无需提前安装Hive。其连接方式丰富多样…...

在Ubuntu 18.04下编译OpenJDK 11

在Ubuntu 18.04下编译OpenJDK 11 源码下载地址&#xff1a; 链接: https://pan.baidu.com/s/1QAdu-B6n9KqeBakGlpBS3Q 密码: 8lho Linux下的环境要求 不同版本的jdk会要求在不同版本的Ubuntu下编译&#xff0c;不要用太高版本的Ubuntu或者gcc&#xff0c;特别是gcc&#xf…...

Spring MVC 一个简单的多文件上传

原始代码逐行解释 PostMapping("/uploads") // ① 声明处理POST请求&#xff0c;路径为"/uploads" ResponseBody // ② 直接返回数据到响应体&#xff0c;不进行视图解析 public String uploads(MultipartFile[] files, // …...

FreeRTos学习记录--1.工程创建与源码概述

1.工程创建与源码概述 1.1 工程创建 使用STM32CubeMX&#xff0c;可以手工添加任务、队列、信号量、互斥锁、定时器等等。但是本课程不想严重依赖STM32CubeMX&#xff0c;所以不会使用STM32CubeMX来添加这些对象&#xff0c;而是手写代码来使用这些对象。 使用STM32CubeMX时&…...