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

11.1Linux串口应用程序开发

UART简介

UART的全称是Universal Asynchronous Receiver and Transmitter,即异步发送和接收。
串口在嵌入式中用途非常的广泛,主要的用途有:

  • 打印调试信息;
  • 外接各种模块:GPS、蓝牙;
    串口因为结构简单、稳定可靠(通过RXD 、TXD、GND三根线即可完成通信),广受欢迎。
    在这里插入图片描述

串口的参数

  • 波特率:常用的有9600、19200、115200、230400、921600等,其实意思就是每秒传输这么多个比特位数(bit)
  • 起始位:先发出一位或两位逻辑”0”的信号,表示传输数据的开始。
  • 数据位:可以是5~8位逻辑”0”或”1”。如ASCII码(7位),扩展BCD码(8位)。
  • 校验位:数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验数据传送的正确性。
  • 停止位:它是一个字符数据的结束标志,通常一位或两位逻辑”1”。

串口传输数据

  • 双方约定好波特率(每一位占据的时间)。
  • 双方约定好传输电平,即高电平是多少v,低电平是但是v。
  • 双方约定好起始位位数。
  • 双方约定好奇偶校验。
  • 双方约定好停止位位数。
    在这里插入图片描述

tty 设备节点命名规则

  • /dev/ttyS0 、 /dev/ttySTM0 :串口终端。
  • /dev/tty1 、 /dev/tty2 、 …… :虚拟终端设备。
  • /dev/tty0 :当前正在使用的虚拟终端的别名。
  • /dev/tty :本进程自己的终端。
  • /dev/console :控制台,由内核的命令行参数确定,可以认为是一个拥有更高权限的终端,不管当前正在使用哪个终端,系统信息都会发送到控制台上。

串口编程

头文件

编写串口应用程序时需要先包含如下头文件:

#include <stdio.h>   /* Standard input/output definitions */
#include <string.h>  /* String function definitions */
#include <unistd.h>  /* UNIX standard function definitions */
#include <fcntl.h>   /* File control definitions */
#include <errno.h>   /* Error number definitions */
#include <termios.h> /* POSIX terminal control definitions */

打开串口

int open_port(void)
{int fd;/* 打开串口* "/dev/ttyf1" 串口文件名* O_RDWR 以读写方式打开* O_NOCTTY 不将此端口作为控制终端* O_NDELAY 表示不关心 DCD 信号线的状态,同时它还将串口设置为非阻塞模式,在没有数据时进行读取返回0,*          后面可以通过fcntl(fd, F_SETFL, 0)将其设置为阻塞式**/fd = open("/dev/ttyf1", O_RDWR | O_NOCTTY | O_NDELAY);if (fd == -1){/* 打开失败 */perror("open_port: Unable to open /dev/ttyf1 - ");}else{/* 设置为阻塞式读取 */fcntl(fd, F_SETFL, 0);}return (fd);
}

读写串口

通过write函数写数据(发送数据),通过read函数都数据(接收数据)

关闭串口

通过close函数关闭串口设备

配置串口

可以通过如下来读取或配置串口参数:

 /* tcgetattr 获取串口配置参数, tcsetattr 设置串口配置参数- fd- optional_actions 配置模式:-                  TCSANOW 改变立即发生 -                  TCSADRAIN 改变在写入 fd 的数据都被传输后生效-                  TCSAFLUSH 改变在写入 fd 的数据都被传输后生效,且已接收但未读取的数据全部丢弃- termios_p 串口配置参数**/int tcgetattr(int fd, struct termios *termios_p)int tcsetattr(int fd, int optional_actions, const struct termios *termios_p)

串口的配置参数保存在struct termios 结构体中,此结构体至少包含以下成员:

	/* 输入控制标志 */tcflag_t c_iflag;/* 输出控制标志 */tcflag_t c_oflag;/* 控制模式标志 */tcflag_t c_cflag;/* 本地模式标志 */tcflag_t c_lflag;/* 行规程 */cc_t c_cc[NCCS];/* 输入波特率 */int c_ispeed;/* 输出波特率 */int c_ospeed;
  • 输入控制标志选项(c_iflag)
    INPCK :启用输入奇偶校验
    IGNPAR :忽略奇偶校验错误
    PARMRK :标记奇偶校验错误
    ISTRIP :去掉奇偶校验位
    IXON :启用输出的 XON/XOFF 流控制
    IXOFF :启用输入的 XON/XOFF 流控制
    IXANY :允许任何字符来重新开始输出
    IGNBRK :忽略输入中的 BREAK 状态
    BRKINT :检测到中断条件时发送 SIGINT
    INLCR :将换行映射到回车
    IGNCR :忽略回车
    ICRNL :将回车映射到换行
    IUCLC :将大写映射到小写
    启用输入奇偶校验并剥离奇偶校验位:
	c_iflag |= (INPCK | ISTRIP)
启用软件流控制:
	c_iflag |= (IXON | IXOFF | IXANY);
禁用软件流控:
	c_iflag &= ~(IXON | IXOFF | IXANY);
  • 输出控制标志选项(c_oflag)
    OPOST :启用输出处理(未设置 = 原始输出)
    OLCUC :将小写映射到大写
    ONLCR :将换行映射到回车+换行
    OCRNL :将回车映射到换行
    NOCR :不在第 0 列输出回车
    ONLRET :将换行映射到回车
    OFILL :发送填充字符作为延时,而不是使用定时来延时
    OFDEL :填充字符为 DEL
    NLDLY :新行延时掩码
    NL0 :新行没有延迟
    NL1 :换行后延迟100ms
    CRDLY :回车延时掩码
    CR0 :回车没有延迟
    CR1 :回车后的延迟取决于当前列位置
    CR2 :回车后延迟 100 毫秒
    CR3 :回车后延迟 150 毫秒
    TABDLY :tab延时掩码
    TAB0 :TAB 没有延迟
    TAB1 :TAB 后的延迟取决于当前列位置
    TAB2 :发送 TAB 后延迟 100 毫秒
    TAB3 :将 TAB 字符扩展为空格
    BSDLY :回退延时掩码
    BS0 :回退没有延迟
    BS1 :回退后延迟 50 毫秒
    VTDLY :竖直跳格延时掩码
    VT0 :竖直跳格无延迟
    VT1 :竖直跳格后延迟 2 秒
    FFDLY :进表延时掩码
    FF0 :进表没有延迟
    FF1 :进表后延迟 2 秒
    选择原始输出:
	/* 禁用OPOST选项时,将忽略 c_oflag中的所有其他选项位 */c_oflag &= ~OPOST;
  • 控制模式标志(c_cflag)
    CSIZE :字符长度掩码
    CS5 :5 个数据位
    CS6 :6 个数据位
    CS7 :7 个数据位
    CS8 :8 个数据位
    CSTOPB :2 个停止位(否则为 1 个)
    CREAD :启用接收器
    PARENB :启用奇偶校验位
    PARODD :使用奇校验而不是偶校验
    HUPCL :关闭时挂断 moden
    CLOCAL :忽略 modem 控制线
    CRTSCTS :启用硬件流控制
    设置字符大小:
	c_cflag &= ~CSIZE; /* 屏蔽字符大小位 */ c_cflag |= CS8; /* 选择 8 个数据位 */
设置奇偶校验:
	/*无奇偶校验 (8N1) */c_cflag &= ~PARENB;c_cflag &= ~CSTOPB;c_cflag &= ~CSIZE;c_cflag |= CS8;/* 偶校验(7E1) */c_cflag |= PARENB;c_cflag &= ~PARODD;c_cflag &= ~CSTOPB;c_cflag &= ~CSIZE;c_cflag |= CS7;/* 奇校验(7O1) */c_cflag |= PARENB;c_cflag |= PARODD;c_cflag &= ~CSTOPB;c_cflag &= ~CSIZE;c_cflag |= CS7;
设置硬件流控制:
c_cflag |= CRTSCTS;
禁用硬件流控制:
	c_cflag &= ~CRTSCTS;
  • 本地模式标志(c_lflag)
    ISIG :启用 SIGINTR、SIGSUSP、SIGDSUSP 和 SIGQUIT 信号
    ICANON :使能规范输入,这使 EOF 、 EOL 、 EOL2 、 ERASE 、 KILL 、 REPRINT 、 STATUS 、 WERASE 字符起作用,输入字符被装配成行
    XCASE :如果同时设置了 ICANON ,则输入被转换为小写(除有前缀 / 的字符以外),输出一个大写字符也在其前加一个 /
    ECHO :回显输入字符
    ECHOE :如果同时设置了 ICANON ,字符 ERASE 擦除前一个输入字符, WERASE 擦除前一个词
    ECHOK :如果同时设置了 ICANON,字符 KILL 删除当前行
    ECHONL :如果同时设置了 ICANON,回显字符 NL,即使没有设置 ECHO
    NOFLSH :禁止在产生 SIGINT, SIGQUIT 和 SIGSUSP 信号时刷新输入和输出队列
    IEXTEN :启用扩展字符处理,这个标志必须与 ICANON 同时使用才能解释特殊字符 EOL2 、 LNEXT 、 REPRINT 、 WERASE, IUCLC 标志才有效
    ECHOCTL :如果同时设置了 ECHO,除了 TAB, NL, START, 和 STOP 之外的 ASCII 控制字符被回显为 ^X (这里 X 是比控制字符加 0x40 的 ASCII 码)
    ECHOPRT :如果同时设置了 ICANON 和 IECHO,字符在删除的同时被打印
    ECHOKE :如果同时设置了 ICANON ,回显 KILL 时将删除一行中的每个字符
    FLUSHO :输出被刷新,这个标志可以通过键入字符 DISCARD 来开关
    PENDIN :在读入下一个字符时,输入队列中所有字符被重新输出
    TOSTOP :向试图写控制终端的后台进程组发送 SIGTTOU 信号
    选择规范输入:
	c_lflag |= (ICANON | ECHO | ECHOE);
选择原始输入:
	c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
  • 控制字符(c_cc )
    VINTR :中断字符。发出 SIGINT 信号,当设置 ISIG 时可被识别
    VQUIT :退出字符。发出 SIGQUIT 信号,当设置 ISIG 时可被识别
    VERAS :删除字符。删除上一个还没有删掉的字符,但不删除上一个 EOF 或行首,当设置 ICANON 时可被识别
    VKILL :终止字符。删除自上一个 EOF 或行首以来的输入,当设置 ICANON 时可被识别
    VEOF :文件尾字符。这个字符使得 tty 缓冲中的内容被送到等待输入的用户程序中,而不必等到 EOL,当设置ICANON 时可被识别
    VEOL : 行结束字符,当设置 ICANON 时可被识别
    VEOL2 :替换的行结束,当设置 ICANON 时可被识别
    VMIN :要读取的最小字符数
    VTIME :等待数据的时间(100毫秒)
    MIN与TIME组合有以下四种:
//有数据立即读取,并返回读取的字节数,无数据立即返回0
MIN = 0 , TIME = 0;
//在 TIME 指定的时间内有数据则返回读取的字节数,无数据返回0
MIN = 0 , TIME > 0;
//在最少读取到 MIN 个字节数才返回
MIN > 0 , TIME = 0;
//读取到的一个字节时启动计时,此后每收到一个字符都会重新计时,在最少读取到 MIN 个字节数或超时返回读取的字节数
MIN > 0 , TIME > 0;
  • 波特率(c_ispeed & c_ospeed)
    波特率的设置和读取通过下列函数实现:
	/* 获取输入波特率 */speed_t cfgetispeed(const struct termios *termios_p);/* 获取输出波特率 */speed_t cfgetospeed(const struct termios *termios_p);/* 设置输入波特率 */int cfsetispeed(struct termios *termios_p, speed_t speed);/* 设置输出波特率 */int cfsetospeed(struct termios *termios_p, speed_t speed);/* 设置输入输出波特率 */int cfsetspeed(struct termios *termios_p, speed_t speed);

串口应用程序编写

原理图

在这里插入图片描述

在这里插入图片描述

编写设备树

在设备树stm32mp157d-atk.dtsi中引用uart3和uart4节点,并加入如下内容:

&usart3 {pinctrl-names = "default", "sleep";pinctrl-0 = <&usart3_pins_mx>;pinctrl-1 = <&usart3_sleep_pins_mx>;/delete-property/dmas;/delete-property/dma-names;status = "okay";
};&uart5 {pinctrl-names = "default", "sleep";pinctrl-0 = <&uart5_pins_mx>;pinctrl-1 = <&uart5_sleep_pins_mx>;/delete-property/dmas;/delete-property/dma-names;status = "okay";
};

在设备树stm32mp15-pinctrl.dtsi中引用的&pinctrl节点中加入如下内容:

	uart5_pins_mx: uart5_mx-0 {pins1 {pinmux = <STM32_PINMUX('B', 12, AF14)>; /* UART5_RX */bias-disable;};pins2 {pinmux = <STM32_PINMUX('B', 13, AF14)>; /* UART5_TX */bias-disable;drive-push-pull;slew-rate = <0>;};};uart5_sleep_pins_mx: uart5_sleep_mx-0 {pins {pinmux = <STM32_PINMUX('B', 12, ANALOG)>, /* UART5_RX */<STM32_PINMUX('B', 13, ANALOG)>; /* UART5_TX */};};usart3_pins_mx: usart3_mx-0 {pins1 {pinmux = <STM32_PINMUX('D', 8, AF7)>; /* USART3_TX */bias-disable;drive-push-pull;slew-rate = <0>;};pins2 {pinmux = <STM32_PINMUX('D', 9, AF7)>; /* USART3_RX */bias-disable;};};usart3_sleep_pins_mx: usart3_sleep_mx-0 {pins {pinmux = <STM32_PINMUX('D', 8, ANALOG)>, /* USART3_TX */<STM32_PINMUX('D', 9, ANALOG)>; /* USART3_RX */};};

在设备树stm32mp157d-atk.dts的aliases节点中增加如下内容:

		//usart3的设备文件名是ttySTM1//uart5的设备文件名是ttySTM2serial1 = &usart3;serial2 = &uart5;

用make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- dtbs -j8编译设备树,然后用新的.dtb文件启动系统

编写应用程序

编写一个应用程序,从串口读取数据,然后显示读取到的字节数,并将读取的数据返回到PC,程序包含以下几个部分:

  1. 打开串口设备
  2. 配置串口设备
  3. 读写串口设备
    完整的应用程序如下:
#include <stdio.h>   /* Standard input/output definitions */
#include <string.h>  /* String function definitions */
#include <unistd.h>  /* UNIX standard function definitions */
#include <fcntl.h>   /* File control definitions */
#include <errno.h>   /* Error number definitions */
#include <termios.h> /* POSIX terminal control definitions */int set_port(int fd, int baud_rate, int n_bits, char parity, int n_stop)
{struct termios options;/* 读取配置 */if(tcgetattr(fd, &options) < 0) { perror("SetupSerial 1");return -1;}options.c_iflag = 0x00;options.c_oflag = 0x00;options.c_cflag = 0x00;options.c_lflag = 0x00;/* 禁用软件流控 */options.c_iflag &= ~(IXON | IXOFF | IXANY);if((parity == 'O') || (parity == 'E')) {/* 启用输入奇偶校验并剥离奇偶校验位 */options.c_iflag |= (INPCK | ISTRIP);}/* 选择原始输出 */options.c_oflag &= ~OPOST;/* 设置字符大小 */options.c_cflag &= ~CSIZE;switch(n_bits){case 7:options.c_cflag |= CS7;break;case 8:default:options.c_cflag |= CS8;break;}/* 设置奇偶校验 */switch(parity){case 'O':options.c_cflag |= PARENB;options.c_cflag |= PARODD;break;case 'E':options.c_cflag |= PARENB;options.c_cflag &= ~PARODD;break;case 'N':default:options.c_cflag &= ~PARENB;break;}/* 禁用硬件流控制 */options.c_cflag &= ~CRTSCTS;/* 设置停止位 */switch(n_stop){case 2:options.c_cflag |= CSTOPB;break;case 1:default:options.c_cflag &= ~CSTOPB;break;}/* 启用接收器,并忽略 modem 控制线 */options.c_cflag |= CLOCAL | CREAD; /* 选择原始输入 */options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);/* 设置波特率 */switch(baud_rate){case 2400:cfsetispeed(&options, B2400);cfsetospeed(&options, B2400);break;case 4800:cfsetispeed(&options, B4800);cfsetospeed(&options, B4800);break;case 9600:cfsetispeed(&options, B9600);cfsetospeed(&options, B9600);break;case 115200:default:cfsetispeed(&options, B115200);cfsetospeed(&options, B115200);break;}/* 设置读取超时和每次读取的最小字节数 */options.c_cc[VMIN] = 1;options.c_cc[VTIME] = 1;/* 刷新缓冲区 */tcflush(fd, TCIFLUSH);/* 配置串口 */if((tcsetattr(fd, TCSANOW, &options))!=0){perror("com set error");return -1;}return 0;
}int open_port(const char *com)
{int fd;/* 打开串口 */fd = open(com, O_RDWR | O_NOCTTY | O_NDELAY);if (fd == -1){/* 打开失败 */perror("open_port");}else{/* 设置为阻塞式读取 */fcntl(fd, F_SETFL, 0);}return (fd);
}int main(int argc, char **argv)
{int fd;int result;char buffer[64];if (argc != 2){printf("Usage: \n");printf("%s </dev/ttySAC1 or other>\n", argv[0]);return -1;}/* 打开串口设备 */fd = open_port(argv[1]);if (fd < 0){printf("open %s err!\n", argv[1]);return -1;}/* 设置串口设备 */result = set_port(fd, 115200, 8, 'N', 1);if(result < 0){printf("set port err!\n");return -1;}while(1){/* 读取串口接收到的数据 */result = read(fd, &buffer, sizeof(buffer));if(result > 0){printf(" read %d bytes\r\n", result);/* 通过串口发送数据 */result = write(fd, &buffer, result);}elseperror(NULL);}return 0;
}

上机测试

  1. 根据原理图修改设备树,主要是使能需要用到的串口,然后编译设备树,用新的设备树启动串口
  2. 从这里下载代码,并进行编译,然后将编译得到的可执行程序拷贝到目标板的root目录中
  3. 连接串口线到电脑
  4. 在终端运行命令./uart_teat.out /dev/ttySTM2进行串口测试,其中/dev/ttySTM2是串口设备文件名,如下分别是串口测试软件输出和串口调试软件的截图
    串口测试软件输出串口调试助手

相关文章:

11.1Linux串口应用程序开发

UART简介 UART的全称是Universal Asynchronous Receiver and Transmitter&#xff0c;即异步发送和接收。 串口在嵌入式中用途非常的广泛&#xff0c;主要的用途有&#xff1a; 打印调试信息&#xff1b;外接各种模块&#xff1a;GPS、蓝牙&#xff1b; 串口因为结构简单、稳…...

log4j学习

依赖 <!--log4j依赖--> <dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version> </dependency><!--测试--> <dependency><groupId>org.junit.jupiter</g…...

【Vue2+3入门到实战】(4)Vue基础之指令修饰符 、v-bind对样式增强的操作、v-model应用于其他表单元素 详细示例

目录 一、今日学习目标1.指令补充 二、指令修饰符1.什么是指令修饰符&#xff1f;2.按键修饰符3.v-model修饰符4.事件修饰符 三、v-bind对样式控制的增强-操作class1.语法&#xff1a;2.对象语法3.数组语法4.代码练习 四、京东秒杀-tab栏切换导航高亮1.需求&#xff1a;2.准备代…...

【数据结构和算法】找到最高海拔

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、题目描述 二、题解 2.1 前缀和的解题模板 2.1.1 最长递增子序列长度 2.1.2 寻找数组中第 k 大的元素 2.1.3 最长公共子序列…...

redis相关问题

1、概述&#xff1a; 1. 非关系型数据库 2. 是分布式缓存数据库 3. 使用 key -value结构存储 2、作用&#xff1a; 用作缓存降低数据库压力&#xff0c;提高性能&#xff1b;可以用作消息队列&#xff08;削峰、解耦、异步调用&#xff09; 3、基础语法&#xff1a; 基础命令…...

第41节: Vue3 watch函数

在UniApp中使用Vue3框架时&#xff0c;你可以使用watch函数来观察和响应Vue实例上的数据变化。以下是一个示例&#xff0c;演示了如何在UniApp中使用Vue3框架使用watch函数&#xff1a; <template> <view> <input v-model"message" type"text…...

Centos7:升级gcc、g++到版本5.2.0

背景 Centos7.9版本默认的g版本是4.8.5&#xff0c;在实践golang项目中&#xff0c;用到C14&#xff0c;编译时会报错&#xff1a;gcc: error: unrecognized command line option ‘-stdc14’ 因此&#xff0c;gcc需要升级到更高版本&#xff0c;我这里使用源码编译形式升级到g…...

Pytohn data mode plt

文章目录 文件的读写创建.csv类型的文件&#xff0c;并读取文件创建.xlsx文件 使用Python做图生成数据集切片取值操作修改张量中指定位置的数据 知识点torch.arange(x)torch.tensor(2)Atorch.randn(36).reshape(6,6)shapenumel()reshape(x,y,z)torch.zeros(3,3,4)torch.ones(2,…...

内网离线搭建之----kafka集群

1.系统版本 虚拟机192.168.9.184 虚拟机192.168.9.185 虚拟机192.168.9.186系统 centos7 7.6.1810 2.依赖下载 ps&#xff1a;置顶资源里已经下载好了&#xff0c;直接用&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;…...

5.1 显示窗口的内容(一)

一&#xff0c;如何显示窗口的内容&#xff1f; 显示器用于在物理硬件&#xff08;如计算机显示器或触摸屏显示器&#xff09;上显示窗口的内容。 屏幕API提供的功能允许我们创建同时写入多个窗口和显示的应用程序。屏幕支持多个显示器&#xff0c;但创建和管理使用多个显示器…...

基于包围盒算法的三维点云数据压缩和曲面重建matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 包围盒构建 4.2 点云压缩 4.3 曲面重建 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ...........................................…...

关于Python里xlwings库对Excel表格的操作(十八)

这篇小笔记主要记录如何【设置单元格数据的对齐方式】。前面的小笔记已整理成目录&#xff0c;可点链接去目录寻找所需更方便。 【目录部分内容如下】【点击此处可进入目录】 &#xff08;1&#xff09;如何安装导入xlwings库&#xff1b; &#xff08;2&#xff09;如何在Wps下…...

VScode远程连接服务器,Pycharm专业版下载及远程连接(深度学习远程篇)

Visual Code、PyCharm专业版&#xff0c;本地和远程交互。 远程连接需要用到SSH协议的技术&#xff0c;常用的代码编辑器vscode 和 pycharm都有此类功能。社区版的pycharm是免费的&#xff0c;但是社区版不支持ssh连接服务器&#xff0c;只有专业版才可以&#xff0c;需要破解…...

Vue2和Vue3组件间通信方式汇总(3)------$bus

组件间通信方式是前端必不可少的知识点&#xff0c;前端开发经常会遇到组件间通信的情况&#xff0c;而且也是前端开发面试常问的知识点之一。接下来开始组件间通信方式第三弹------$bus,并讲讲分别在Vue2、Vue3中的表现。 Vue2Vue3组件间通信方式汇总&#xff08;1&#xff09…...

PyTorch加载数据以及Tensorboard的使用

一、PyTorch加载数据初认识 Dataset:提供一种方式去获取数据及其label 如何获取每一个数据及其label 总共有多少的数据 Dataloader:为后面的网络提供不同的数据形式 数据集 在编译器中导入Dataset from torch.utils.data import Dataset 可以在jupyter中查看Dataset官方文档&…...

TensorFlow是什么

TensorFlow是什么 Tensorflow是一个Google开发的第二代机器学习系统&#xff0c;克服了第一代系统DistBelief仅能开发神经网络算法、难以配置、依赖Google内部硬件等局限性&#xff0c;应用更加广泛&#xff0c;并且提高了灵活性和可移植性&#xff0c;速度和扩展性也有了大幅…...

docker-compose 安装Sonar并集成gitlab

文章目录 1. 前置条件2. 编写docker-compose-sonar.yml文件3. 集成 gitlab4. Sonar Login with GitLab 1. 前置条件 安装docker-compose 安装docker 创建容器运行的特有网络 创建挂载目录 2. 编写docker-compose-sonar.yml文件 version: "3" services:sonar-postgre…...

支付平台在选择服务器租用时要注意什么?

如果要建设一个支付平台的话要进行服务器租用&#xff0c;一旦涉及到钱的方面就必须要顾虑到多方面&#xff0c;这样才能保证安全性&#xff0c;今天小编就给大家讲一讲要注意什么呢&#xff1f; 1、带宽:带宽是业务稳定性的直接因素&#xff0c;只有带宽充足&#xff0c;这样…...

IDEA2018升级2023,lombok插件不兼容导致get/set方法无法使用

1、问题 最近了解到一款叫CodeGeeX 的智能编程助手&#xff0c;想要试用一下&#xff0c;但是IDEA2018版本太低了&#xff0c;没有CodeGeeX插件&#xff0c;于是打算将IDEA升级到2023.2.5版本&#xff0c;具体升级过程略过&#xff0c;升级完成后&#xff0c;启动项目&#xf…...

企业微信服务商代开发模式获取授权企业的客户信息

服务商代开发素材&#xff1a; 服务商可信ip 企业微信认证 测试时不用再次创建一个企业微信&#xff0c;可以用当前的企业微信作为授权企业使用一、创建代开发应用模板 1&#xff0c;代开发模板回调URL配置 参考 注意&#xff1a;保存代开发应用模板时的corpId是服务商的企业…...

库存管理方法有哪些

库存管理是工作中一个离不开的话题&#xff0c;不管是仓管还是业务员都或多或少接触过库存管理方面的工作&#xff0c;例如&#xff1a;进货、销售、库存盘点等等这些都属于库存管理的范筹&#xff0c;那么库存管理方法有哪些&#xff1f;用哪种方法管理库存比较好&#xff0c;…...

数字化车间推动制造业生产创新

一、数字化车间应用场景 1&#xff1a;资源智能化管理 数字化车间通过搭建智能化的设备监测系统&#xff0c;实时采集和监控设备的运行状态和生产数据&#xff0c;对设备进行实时管理和维护&#xff0c;降低故障率和维修成本。同时&#xff0c;通过对生产过程中的数据采集和分…...

Linux的安装及管理程序

一、如何在linux安装卸载软件 1. 编译安装 灵活性较高 难度较大 可以安装较新的版本 2. rpm安装&#xff08;redhat&#xff09; linux 包安装 查软件信息&#xff1a;是否安装&#xff0c;文件列表 rpm 软件名 3. yum yum是RPM升级版本&#xff0c;解决rpm的弊端 安装软件 首…...

c语言-表达式求值

目录 前言一、隐式类型转换1.1 整型提升 二、算术转换三、操作符的属性四、问题表达式总结 前言 表达式求值的顺序一部分由操作符的优先级和结合性决定。 有些表达式的操作数在求值的过程中可能需要转换为其他类型 一、隐式类型转换 隐式类型转换是在编译器自动进行的类型转换…...

小型洗衣机哪个牌子质量好?口碑最好的四款小型洗衣机推荐

随着科技的快速发展&#xff0c;现在的人们越来越注重自己的卫生问题&#xff0c;不仅在吃上面会注重卫生问题&#xff0c;在用的上面也会更加严格要求&#xff0c;而衣服做为我们最贴身的东西&#xff0c;我们对它的要求也会更加高&#xff0c;所以最近这几年较火爆的无疑是内…...

springCould中的Ribbon-从小白开始【5】

目录 1.什么是Ribbo❤️❤️❤️ 2.eureka自带Ribbon ❤️❤️❤️ 3. RestTemplate❤️❤️❤️ 4.IRule❤️❤️❤️ 5.负载均衡算法❤️❤️❤️ 1.什么是Ribbo 1.Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端,负载均衡的工具。2.主要功能是提供客户端的软件…...

持续集成交付CICD:Jira 发布流水线

目录 一、实验 1.环境 2.GitLab 查看项目 3.Jira 远程触发 Jenkins 实现合并 GitLab 分支 4.K8S master节点操作 5.Jira 发布流水线 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 主机架构版本IP备注master1K8S master节点1.20.6192.168.204.180 jenkins…...

JuiceSSH结合内网穿透实现公网远程访问本地Linux虚拟机

文章目录 1. Linux安装cpolar2. 创建公网SSH连接地址3. JuiceSSH公网远程连接4. 固定连接SSH公网地址5. SSH固定地址连接测试 处于内网的虚拟机如何被外网访问呢?如何手机就能访问虚拟机呢? cpolarJuiceSSH 实现手机端远程连接Linux虚拟机(内网穿透,手机端连接Linux虚拟机) …...

使用 pytest.ini 文件控制输出 log 日志

一、前置说明 pytest.ini 文件中可以配置参数来控制 pytest 的运行行为,其存放路径要求与 conftest.py 一样。 项目根目录project_root/ ├── pytest.ini ├── tests/ │ └── test_demo.py以test开头的测试子目录project_root/ ├── tests/ │ ├── pytest.in…...

【Spring】SpringBoot 配置文件

文章目录 什么是配置文件SpringBoot配置文件配置文件快速入手配置文件的格式properties 配置文件说明properties 基本语法读取配置文件信息properties 配置格式缺点 yml 配置文件说明yml 基本语法使用 yml 连接数据库 yml 使用进阶yml 配置不同数据类型配置对象配置集合配置Map…...

Koordinator 支持 K8s 与 YARN 混部,小红书在离线混部实践分享

作者&#xff1a;索增增&#xff08;小红书&#xff09;、宋泽辉&#xff08;小红书&#xff09;、张佐玮&#xff08;阿里云&#xff09; 背景介绍 Koordinator 是一个开源项目&#xff0c;基于阿里巴巴在容器调度领域多年累积的经验孵化诞生&#xff0c;目前已经支持了 K8s…...

网游逆向分析与插件开发-游戏反调试功能的实现-项目需求与需求拆解

上一个专栏结束位置&#xff1a;网游逆向分析与插件开发-代码保护壳的优化-修改随机基址为固定基址-CSDN博客 上一个专栏是做了一个壳有了一定的保护&#xff0c;但是保护还是不够&#xff0c;最大的保护是根上把问题解决了&#xff0c;就是我不允许你对我进行调试&#xff0c…...

阶段七-GitEE

Git&#xff1a;版本控制软件 Git的优点 1.1 协同修改 多人并行不悖的修改服务器端的同一个文件。 1.2 数据备份 不仅保存目录和文件的当前状态&#xff0c;还能够保存每一个提交过的历史状态。 1.3 版本管理 在保存每一个版本的文件信息的时候要做到不保存重复数据&…...

Redis小记(1)

目录 1.Redis和Mysql的区别 2.Redis常用命令 1.Redis和Mysql的区别 a:mysql和redis的存储方式不同 mysql是关系型数据库&#xff0c;用表来进行存储数据。 redis是通过键值对来存储数据&#xff0c;key使用string来标识&#xff0c;value可以是各种不同的数据结构。 b:mys…...

Flutter windows 环境配置

Flutter windows 环境配置 从零开始&#xff0c;演示flutter环境配置到启动项目&#xff0c;同时支持 vscode 和 android studio 目录 Flutter windows 环境配置一、环境配置1. Flutter SDK2. Android Studio3. JDK4. 拓展安装5. Visual Studio 2022二、项目创建和启动1. vsco…...

odoo17核心概念view5——ir_ui_view.py

这是view系列的第5篇文章&#xff0c;介绍一下view对应的后端文件ir_ui_view.py&#xff0c;它是base模块下的一个文件 位置&#xff1a;odoo\addons\base\models\ir_ui_view.py 该文件一共定义了三个模型 1.1 ir.ui.view.custom 查询数据库这个表是空的&#xff0c;从名字看…...

截断整型提升算数转换

文章目录 &#x1f680;前言&#x1f680;截断&#x1f680;整型提升✈️整型提升是怎样的 &#x1f680;算术转换 &#x1f680;前言 大家好啊&#xff01;这里阿辉补一下前面操作符遗漏的地方——截断、整型提升和算数转换 看这一篇要先会前面阿辉讲的数据的存储否则可能看不…...

阿里云 ECS Docker、Docker Compose安装

https://help.aliyun.com/document_detail/51853.html https://docs.docker.com/compose/install/ Centos https://blog.csdn.net/Alen_xiaoxin/article/details/104850553 systemctl enable dockerdocker-compose安装 https://blog.csdn.net/qq465084127/article/details/…...

LeetCode——1276. 不浪费原料的汉堡制作方案

通过万岁&#xff01;&#xff01;&#xff01; 题目&#xff0c;给你两个数tomatoSlices和cheeseSlices&#xff0c;然后每制作一个巨无霸汉堡则消耗4个tomatoSlices和1和cheeseSlices&#xff0c;每制作一个小皇堡则需要消耗2个tomatoSlices和1和cheeseSlices。问给你这两个…...

隆道吴树贵:生成式人工智能在招标采购中的应用

12月22日&#xff0c;由中国招标投标协会主办的招标采购数字发展大会在北京召开&#xff0c;北京隆道网络科技有限公司总裁吴树贵受邀出席大会&#xff0c;并在“招标采购数字化交易创新成果”专题会议上发言&#xff0c;探讨生成式人工智能如何在招标采购业务中落地应用。 本次…...

docker搭建kali及安装oneforall

前期docker的安装这里就不用多说了&#xff0c;直接看后面的代码 安装oneforall 1.安装git和pip3 sudo apt update sudo apt install git python3-pip -y2.克隆项目 git clone https://gitee.com/shmilylty/OneForAll.git3.安装相关依赖 cd OneForAll/ sudo apt install pyt…...

【MySQL】数据库之事务

目录 一、什么是事务 二、事务的ACID是什么&#xff1f; 三、有哪些典型的不一致性问题&#xff1f; 第一种&#xff1a;脏读 第二种&#xff1a;不可重复读 第三种&#xff1a;幻读 第四种&#xff1a;丢失更新 四、隔离级别有哪些&#xff1f; &#xff08;1&#xf…...

AGV|RGV小车RFID传感器CNS-RFID-01/1S的RS232通讯联机方法

CNS-RFID-01/1S广泛应用于AGV小车&#xff0c;搬运机器人&#xff0c;无人叉车等领域&#xff0c;用于定位&#xff0c;驻车等应用&#xff0c;可通过多种通讯方式进行读写操作&#xff0c;支持上位机控制&#xff0c;支持伺服电机&#xff0c;PLC等控制设备联机&#xff0c;本…...

【Python可视化系列】一文教会你绘制美观的热力图(理论+源码)

一、问题 前文相关回顾&#xff1a; 【Python可视化系列】一文彻底教会你绘制美观的折线图&#xff08;理论源码&#xff09; 【Python可视化系列】一文教会你绘制美观的柱状图&#xff08;理论源码&#xff09; 【Python可视化系列】一文教会你绘制美观的直方图&#xff08;理…...

百度Apollo五步入门自动驾驶:Dreamview与离线数据包分析(文末赠送apollo周边)

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《linux深造日志》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! ⛳️ 粉丝福利活动 ✅参与方式&#xff1a;通过连接报名观看课程&#xff0c;即可免费获取精美周边 ⛳️活动链接&#xf…...

为什么IPv6 可以作为低功耗蓝牙的物联网体系结构?

蓝牙40规范引人了低功耗蓝牙(Bluetooth Low Energy,BLE)技术。低牙是一种低能低延成本的无线通信技术。 与传统蓝牙相比&#xff0c;低功耗蓝牙同样使用24GHz频段,但其将信道重新划分为 40个&#xff0c;包含37 个数据信道和3个广播信道(传统蓝牙共使用 79 个信道)低功蓝牙的协…...

GPT每预测一个token就要调用一次模型

问题&#xff1a;下图调用了多少次模型&#xff1f; 不久以前我以为是调用一次 通过看代码是输出多少个token就调用多少次&#xff0c;如图所示&#xff1a; 我理解为分类模型 预测下一个token可以理解为分类模型&#xff0c;类别是vocab的所有token&#xff0c;每一次调用都…...

运维工程师的出路到底在哪里?

1.35岁被称为运维半衰期&#xff0c;主要是因为运维工作的技术栈和工作方式在不断更新和演进。随着新技术的出现和发展&#xff0c;老旧的技术逐渐被淘汰&#xff0c;运维工作也需要不断学习和适应新技术&#xff0c;否则就容易被市场淘汰。 2.要顺利过渡半衰期&#xff0c;运…...

2312clang,基于访问者的前端动作

原文 基于RecursiveASTVisitor的ASTFrontendActions. 创建用RecursiveASTVisitor查找特定名字的CXXRecordDeclAST节点的FrontendAction. 创建FrontendAction 编写基于clang的工具(如Clang插件或基于LibTooling的独立工具)时,常见入口是允许在编译过程中执行用户特定操作的F…...

怎么搭建实时渲染云传输服务器

实时渲染云传输技术方案&#xff0c;在数字孪生、虚拟仿真领域使用越来越多&#xff0c;可能很多想使用该技术方案项目还不知道具体该怎么搭建云传输服务器&#xff0c;具体怎么使用实时云渲染平台系统。点量云小芹将对这两个问题做集中分享。 一、实时渲染服务器怎么搭建&…...