【genius_platform软件平台开发】第九十三讲:串口通信(485通信)
485通信
- 1. 485通信
- 1.1 termios结构
- 1.2 头文件
- 1.3 函数讲解
- 1.3.1 tcgetattr
- 1.3.2 tcsetattr
- 1.4 示例工程
- 1.5 参考文献
- 1.5.1 stty命令
- 1.5.2 命令格式
- 1.5.2 microcom命令
- 1.5.2.1介绍
- 1.5.2.2指令
- 1.5.3 echo命令
- 1.5.3.1 语法
- 1.5.3.2 选项列表
- 1.5.3.3 使用示例
- 1.5.3.4 e cho > 输出重定向
- 1.5.3.5 echo > >输出追加重定向
1. 485通信
- 在进行代码撰写前先熟悉这个串口termios结构体
1.1 termios结构
-
termios
结构定义于<termios.h>
头文件中,描述了提供的通用终端接口,用于控制异步通信端口。该文件中还定义了一组函数调用,通过该结构体
和函数
调用即可对终端进行一系列的设置。对于termios结构而言,可以简单地将其理解为是一个用于描述一个终端属性的结构体
。 -
struct termios 结构用来持有所有的当前线路设置, 给这个 tty 设备的一个特定端口. 这些线路设置控制当前波特率, 数据大小, 数据流控设置。
-
termios结构如下:
#include <termios.h>
struct termios {tcflag_t c_iflag;tcflag_t c_oflag;tcflag_t c_cflag;tcflag_t c_lflag;cc_t c_cc[NCCS];
}
该结构的5个成员分别代表了:
输入模式输出模式控制模式本地模式特殊控制字符
关于函数调用,这篇笔记中先描述两个:
1.2 头文件
#include <termios.h>
1.3 函数讲解
1.3.1 tcgetattr
int tcgetattr(int fd, struct termios *termios_p);
- 函数
tcgetattr
起初始化
的作用,它将一个终端与一个termios结构关联起来
,然后用termios_p指针指向这个termios结构。成功调用后,termios_p所指向的结构中就保存着指定终端当前的属性。
1.3.2 tcsetattr
int tcsetattr(int fd, int actions, const struct termios *termios_p);
- 函数
tcsetattr
一般用于重新配置终端
,它会将指定的终端配置成第三个指针参数所指向的termios结构。至于第二个参数actions用于调整tcsetattr函数行为上的一些细节,它有三个可选值:
TCSANOW:立刻进行修改。
TCSADRAIN:等当前的输出完成后再进行修改
TCSAFLUSH:等当前的输出完成后再进行修改,但丢弃还未从read调用返回的当前可用的任何输入
- 关于修改终端属性的代码一般有如下的结构:
struct termios initset, newset;
tcgetattr(fd , &initset);
newset = initset;
.......
tcsetattr(int fd , actions , &initset);
exit(0);
- Linux 为我们提供了专门的设置修改参数的接口如下:
NAMEtermios, tcgetattr, tcsetattr, tcsendbreak, tcdrain, tcflush, tcflow, cfmakeraw, cfgetospeed, cfgetispeed, cfsetispeed, cfsetospeed, cfsetspeed - get and set terminal attributes, line con‐trol, get and set baud rateSYNOPSIS#include <termios.h>#include <unistd.h>int tcgetattr(int fd, struct termios *termios_p);int tcsetattr(int fd, int optional_actions,const struct termios *termios_p);int tcsendbreak(int fd, int duration);int tcdrain(int fd);int tcflush(int fd, int queue_selector);int tcflow(int fd, int action);void cfmakeraw(struct termios *termios_p);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);Feature Test Macro Requirements for glibc (see feature_test_macros(7)):cfsetspeed(), cfmakeraw(): _BSD_SOURCE
tcsetattr()
- 从termios_p引用的termios结构中设置与终端关联的参数(除非需要不可用的基础硬件的支持)。 optional_actions指定更改何时生效:
TCSANOW:更改立即发生。
TCSADRAIN:在传输完所有写入fd的输出之后,将发生更改。 更改影响输出的参数时,应使用此功能。
TCSAFLUSH:更改发生在所有写入fd引用的对象的输出已发送之后,并且在进行更改之前,已接收但未读取的所有输入将被丢弃。
原始模式
cfmakeraw()将终端设置为类似于旧版本7终端驱动程序的“原始”模式:逐字符可用输入,禁用回显,并且禁用终端输入和输出字符的所有特殊处理。 终端属性设置如下:
termios_p->c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL | IXON);termios_p->c_oflag &= ~OPOST;termios_p->c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN);termios_p->c_cflag &= ~(CSIZE | PARENB);termios_p->c_cflag |= CS8;
Line controltcsendbreak() transmits a continuous stream of zero-valued bits for a specific duration, if the terminal is using asynchronous serial data transmission. If duration is zero, it transmitszero-valued bits for at least 0.25 seconds, and not more that 0.5 seconds. If duration is not zero, it sends zero-valued bits for some implementation-defined length of time.If the terminal is not using asynchronous serial data transmission, tcsendbreak() returns without taking any action.tcdrain() waits until all output written to the object referred to by fd has been transmitted.tcflush() discards data written to the object referred to by fd but not transmitted, or data received but not read, depending on the value of queue_selector:TCIFLUSHflushes data received but not read.TCOFLUSHflushes data written but not transmitted.TCIOFLUSHflushes both data received but not read, and data written but not transmitted.tcflow() suspends transmission or reception of data on the object referred to by fd, depending on the value of action:TCOOFF suspends output.TCOON restarts suspended output.TCIOFF transmits a STOP character, which stops the terminal device from transmitting data to the system.TCION transmits a START character, which starts the terminal device transmitting data to the system.The default on open of a terminal file is that neither its input nor its output is suspended.Line speedThe baud rate functions are provided for getting and setting the values of the input and output baud rates in the termios structure. The new values do not take effect until tcsetattr() issuccessfully called.Setting the speed to B0 instructs the modem to "hang up". The actual bit rate corresponding to B38400 may be altered with setserial(8).The input and output baud rates are stored in the termios structure.cfgetospeed() returns the output baud rate stored in the termios structure pointed to by termios_p.cfsetospeed() sets the output baud rate stored in the termios structure pointed to by termios_p to speed, which must be one of these constants:B0B50B75B110B134B150B200B300B600B1200B1800B2400B4800B9600B19200B38400B57600B115200B230400The zero baud rate, B0, is used to terminate the connection. If B0 is specified, the modem control lines shall no longer be asserted. Normally, this will disconnect the line. CBAUDEX is amask for the speeds beyond those defined in POSIX.1 (57600 and above). Thus, B57600 & CBAUDEX is nonzero.cfgetispeed() returns the input baud rate stored in the termios structure.cfsetispeed() sets the input baud rate stored in the termios structure to speed, which must be specified as one of the Bnnn constants listed above for cfsetospeed(). If the input baud rateis set to zero, the input baud rate will be equal to the output baud rate.cfsetspeed() is a 4.4BSD extension. It takes the same arguments as cfsetispeed(), and sets both input and output speed.
1.4 示例工程
- dataType.h
#ifndef DATE_TYPE_H
#define DATE_TYPE_H#include <stdio.h>typedef unsigned char ubyte;
typedef char BYTE;
typedef unsigned short ushort;
typedef unsigned int uint32;#endif
- rs485Service.h
#ifndef __RS485_SERVER_H__
#define __RS485_SERVER_H__#include "dataType.h"typedef enum
{OPEN_485_SUCCESS = 0,OPEN_485_FAIL,
}Open485State;class Rs485Service
{private:Rs485Service();~Rs485Service();public:static Rs485Service& Get();public:int Rs485Read(ubyte *buf, uint32 size);int Rs485Write(const ubyte *data, uint32 len);int InitRs485Dev(uint32 bound);void UninitRs485Dev();private:int m_devFd;int m_bound;int32_t m_485WriteState; //true 485处于写状态
};#endif
- rs485Service.cpp
#include <algorithm>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <termios.h>
#include <netinet/in.h>
#include "rs485Service.h"#define RS485COM "/dev/ttyS1"Rs485Service::Rs485Service()
{m_devFd = -1;
}Rs485Service::~Rs485Service()
{
}Rs485Service& Rs485Service::Get()
{static Rs485Service Rs485server;return Rs485server;
}int Rs485Service::InitRs485Dev(uint32 bound)
{system("/usr/local/bin/amba_debug -g 71 -d 1");m_devFd = open(RS485COM, O_RDWR | O_NOCTTY); //加上O_NDELAY,就变为了非阻塞if (m_devFd != -1){struct termios cfg;memset(&cfg, 0, sizeof(cfg));tcgetattr(0, &cfg);switch(bound){case 19200:cfsetispeed(&cfg, B19200);cfsetispeed(&cfg, B19200);m_bound = 19200;break;case 9600:cfsetispeed(&cfg, B9600);cfsetispeed(&cfg, B9600);m_bound = 9600;break;default:cfsetispeed(&cfg, B19200);cfsetispeed(&cfg, B19200);m_bound = 19200;break;}cfg.c_oflag &= ~(ONLCR);cfg.c_oflag &= (OCRNL);cfg.c_iflag &= (INLCR);cfg.c_cflag |= CLOCAL | CREAD; //使能串口输入//cfg.c_lflag |= ICANON; //标准模式cfg.c_lflag &= ~ICANON;//原始模式cfg.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);//8bit数据cfg.c_cflag &= ~CSIZE;cfg.c_cflag |= CS8;//1bit停止位cfg.c_cflag &= ~CSTOPB;//无校验cfg.c_cflag &= ~PARENB;//禁用硬件流控制:cfg.c_cflag &= ~CRTSCTS;// cfg.c_cc[VTIME] = 1; //设置超时时间,如果采用非阻塞模式则不设置cfg.c_cc[VMIN] = 1; //设置最小接收的数据长度//清楚输入输出缓冲区tcflush(m_devFd, TCIOFLUSH);tcsetattr(m_devFd, TCSANOW, &cfg);return OPEN_485_SUCCESS;}else{printf("open dev err.\n");return OPEN_485_FAIL;}
}void Rs485Service::UninitRs485Dev()
{if (m_devFd != -1){struct termios cfg;memset(&cfg, 0, sizeof(cfg));tcgetattr(0, &cfg);cfg.c_cc[VTIME] = 1;tcflush(m_devFd, TCIOFLUSH);tcsetattr(m_devFd, TCSANOW, &cfg);close(m_devFd);}
}int Rs485Service::Rs485Read(ubyte* buf, uint32 size)
{int rlen = -1;if (m_devFd != -1){rlen = read(m_devFd, buf, size);tcflush(m_devFd, TCIOFLUSH);}return rlen;
}int Rs485Service::Rs485Write(const ubyte* data, uint32 len)
{int wlen = -1;//485是半双工,置为发送状态system("/usr/local/bin/amba_debug -g 71 -d 1");if (m_devFd != -1){wlen = write(m_devFd, data, len);}//等待数据输出完毕tcdrain(m_devFd);//清空输入输出缓冲区tcflush(m_devFd, TCIOFLUSH);//485是半双工,置为接收状态system("/usr/local/bin/amba_debug -g 71 -d 0");return wlen;
}
- main.cpp
#include <iostream>
#include <string>
#include <cstring>
#include <thread>
#include <chrono>
#include "rs485Service.h"int main()
{auto &ser = Rs485Service::Get();ser.InitRs485Dev(9600);std::thread r([&ser](){const int SIZE = 1024;char buf[SIZE] = {};while (true){std::this_thread::sleep_for(std::chrono::seconds(1));std::memset(buf, 0, SIZE);ser.Rs485Read((unsigned char *)buf, SIZE);std::cout << "read: " << buf << std::endl;} });std::thread w([&ser](){char buf[16] = {};while (true){std::this_thread::sleep_for(std::chrono::seconds(1));buf[0]++;buf[15]++;ser.Rs485Write((unsigned char *)buf, 16);std::cout << "write: " << std::to_string(buf[0]) << std::endl;} });r.join();w.join();return 0;
}
- 说明.txt
# 示例编译
aarch64-linux-gnu-g++ main.cpp rs485Service.cpp -lpthread -o testcom# 库错误修正
rs485Service.cpp 中有两处需要修改,
1. #define RS485COM "/dev/ttyS1", 旧的是海思版本的设备名2. InitRs485Dev 当前只支持了19200和9600, 其他波特率需要增加case# Smart485相机及串口线测试相机终端1:# 初始化
stty -F /dev/ttyS1 ispeed 115200 ospeed 115200 cs8
/usr/bin/microcom -s 115200 /dev/ttyS1相机终端2:# 设为发送
/usr/local/bin/amba_debug -g 71 -d 1
echo "abc" > /dev/ttyS1# 设为接收
/usr/local/bin/amba_debug -g 71 -d 0
1.5 参考文献
1.5.1 stty命令
1.5.2 命令格式
用法:stty [-F 设备 | --file=设备] [设置]…
或:stty [-F 设备 | --file=设备] [-a|–all]
或:stty [-F 设备 | --file=设备] [-g|–save]
输出或修改终端参数。
-a, --all 以可读性较好的方式输出全部当前设置
-g, --save 以stty 可读取的格式输出当前全部设置
-F, --file=设备 打开并使用指定设备代替标准输入
–help 显示此帮助信息并退出
–version 显示版本信息并退出
可选- 在设置前的指示中,* 标记出了非POSIX 标准的设置。以下系
统定义象征了哪些设置是有效的。
特殊字符:
- dsusp 字符 每当输入刷新时会发送一个用于终端阻塞信号的字符
eof 字符 表示文件末尾而发送的字符(用于终止输入)
eol 字符 为表示行尾而发送的字符 - eol2 字符 为表示行尾而发送的另一个可选字符
erase 字符 擦除前一个输入文字的字符
intr 字符 用于发送中断信号的字符
kill 字符 用于擦除当前终端行的字符 - lnext 字符 用于输入下一个引用文字的字符
quit 字符 用于发送退出信号的字符 - rprnt 字符 用于重绘当前行的字符
start 字符 在停止后重新开启输出的字符
stop 字符 停止输出的字符
susp 字符 发送终端阻断信号的字符 - swtch 字符 在不同的shell 层次间切换的字符
- werase 字符 擦除前一个输入的单词的字符
特殊设置:
N 设置输入输出速度为N 波特
- cols N 统治内核终端上有N 栏
- columns N 等于cols N
ispeed N 设置输入速度为N 波特 - line N 设置行约束规则为N
min N 和 -icanon 配合使用,设置每次一完整读入的最小字符数为
ospeed N 设置输出速度为N 波特 - rows N 向内核通告此终端有N 行
- size 根据内核信息输出当前终端的行数和列数
speed 输出终端速度(单位为波特)
time N 和-icanon 配合使用,设置读取超时为N 个十分之一秒
控制设置:
[-]clocal 禁用调制解调器控制信号
[-]cread 允许接收输入
- [-]crtscts 启用RTS/CTS 握手
csN 设置字符大小为N 位,N 的范围为5 到8
[-]cstopb 每个字符使用2 位停止位 (要恢复成1 位配合"-“即可)
[-]hup 当最后一个进程关闭标准终端后发送挂起信号
[-]hupcl 等于[-]hup
[-]parenb 对输出生成奇偶校验位并等待输入的奇偶校验位
[-]parodd 设置校验位为奇数 (配合”-"则为偶数)
输入设置:
[-]brkint 任务中断会触发中断信号
[-]icrnl 将回车转换为换行符
[-]ignbrk 忽略中断字符
[-]igncr 忽略回车
[-]ignpar 忽略含有奇偶不对称错误的字符
- [-]imaxbel 发出终端响铃但不刷新字符的完整输入缓冲
[-]inlcr 将换行符转换为回车
[-]inpck 启用输入奇偶性校验
[-]istrip 剥除输入字符的高8 位比特 - [-]iutf8 假定输入字符都是UTF-8 编码
- [-]iuclc 将大写字母转换为小写
- [-]ixany 使得任何字符都会重启输出,不仅仅是起始字符
[-]ixoff 启用开始/停止字符传送
[-]ixon 启用XON/XOFF 流控制
[-]parmrk 标记奇偶校验错误 (结合255-0 字符序列)
[-]tandem 等于[-]ixoff
输出设置:
- bsN 退格延迟的风格,N 的值为0 至1
- crN 回车延迟的风格,N 的值为0 至3
- ffN 换页延迟的风格,N 的值为0 至1
- nlN 换行延迟的风格,N 的值为0 至1
- [-]ocrnl 将回车转换为换行符
- [-]ofdel 使用删除字符代替空字符作填充
- [-]ofill 延迟时使用字符填充代替定时器同步
- [-]olcuc 转换小写字母为大写
- [-]onlcr 将换行符转换为回车
- [-]onlret 使得换行符的行为表现和回车相同
- [-]onocr 不在第一列输出回车
[-]opost 后续进程输出 - tabN 水平制表符延迟的风格,N 的值为0 至3
- tabs 等于tab0
- -tabs 等于tab3
- vtN 垂直制表符延迟的风格,N 的值为0 至1
本地设置:
[-]crterase 擦除字符回显为退格符
- crtkill 依照echoprt 和echoe 的设置清除所有行
- -crtkill 依照echoctl 和echol 的设置清除所有行
- [-]ctlecho 在头字符中输出控制符号(“^c”)
[-]echo 回显输入字符 - [-]echoctl 等于[-]ctlecho
[-]echoe 等于[-]crterase
[-]echok 在每清除一个字符后输出一次换行 - [-]echoke 等于[-]crtkill 意义相同
[-]echonl 即使没有回显任何其它字符也输出换行 - [-]echoprt 在"“和”/"之间向后显示擦除的字符
[-]icanon 启用erase、kill、werase 和rprnt 等特殊字符
[-]iexten 允许POSIX 标准以外的特殊字符
[-]isig 启用interrupt、quit和suspend 等特殊字符
[-]noflsh 在interrupt 和 quit 特殊字符后禁止刷新 - [-]prterase 等于[-]echoprt
- [-]tostop 中止尝试向终端写入数据的后台任务
- [-]xcase 和icanon 配合使用,用转义符""退出大写状态
综合设置:
- [-]LCASE 等于[-]lcase
cbreak 等于-icanon
-cbreak 等于icanon
cooked 等于brkint ignpar istrip icrnl ixon opost isig icanon eof eol 等的默认值
-cooked 等于-raw
crt 等于echoe echoctl echoke
dec 等于echoe echoctl echoke -ixany intr ^c erase 0177 kill ^u - [-]decctlq 等于[-]ixany
ek 清除所有字符,将它们回溯为默认值
evenp 等于parenb -parodd cs7
-evenp 等于-parenb cs8 - [-]lcase 等于xcase iuclc olcuc
litout 等于-parenb -istrip -opost cs8
-litout 等于parenb istrip opost cs7
nl 等于-icrnl -onlcr
-nl 等于icrnl -inlcr -igncr onlcr -ocrnl -onlret
oddp 等于parenb parodd cs7
-oddp 等于-parenb cs8
[-]parity 等于[-]evenp
pass8 等于-parenb -istrip cs8
-pass8 等于parenb istrip cs7
raw 等于-ignbrk -brkint -ignpar -parmrk -inpck -istrip
-inlcr -igncr -icrnl -ixon -ixoff -iuclc -ixany
-imaxbel -opost -isig -icanon -xcase min 1 time 0
-raw 等于cooked
sane 等于cread -ignbrk brkint -inlcr -igncr icrnl -iutf8
-ixoff -iuclc -ixany imaxbel opost -olcuc -ocrnl onlcr
-onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh
-xcase -tostop -echoprt echoctl echoke,所有特殊字符均
使用默认值
处理连接到标准输入的tty 终端行设置。当不附加参数时,程序会输出波特率、行约束
规则以及与标准stty 设置间的偏差。在设置中,字符会被逐字读取或是被编码为^c、
0x37、0177 或127 这样的字符,其中有特殊值^- 或undef 被用于禁止特殊字符。
1.5.2 microcom命令
1.5.2.1介绍
microcom是一个串口调试指令,经常用于串口调试,相当于linux自带的串口调试助手
1.5.2.2指令
microcom [-d DELAY] [-t TIMEOUT] [-s SPEED] [-X] TTY
参数如下:
-d 表示延时时间,一般我都不设置。
-t 表示超时时间,超多少时间就自动退出。单位为ms
-s 表示传输速度,波特率的意思,这个根据自己的情况而定。
-X 不加
最后指定你的串口设备。如 /dev/ttyO0 , 这是TI的串口设备节点
测试方式如下:
将要测试串口与pc端连接,在pc端开启串口调试工具,波特率设定跟等下microcom设定一样。
使用示例:
microcom -s 115200 /dev/ttyUSB2
1.5.3 echo命令
- echo指令可以输出内容到标准输出,以空白分割字符串,并且后面增加换行。此命令的适用范围:RedHat、RHEL、Ubuntu、CentOS、Fedora。
1.5.3.1 语法
echo [-neE] [arg ...]
1.5.3.2 选项列表
Linux基础命令:echo的使用Linux基础命令:echo的使用
1.5.3.3 使用示例
使用“\f”换行
[root@localhost ~]# echo -e "hello\fworld" //必须使用-e选项,\f换行之后,光标还在结尾helloworld
[root@localhost ~]#
使用“\n”换行
[root@localhost ~]# echo -e "hello\nworld" //必须使用-e选项,\n换行之后,光标在开头helloworld
输出ascii字符
[root@localhost ~]# echo -e "\x31" //十六进制的31,换算成49,代表的ascii字符就是11
1.5.3.4 e cho > 输出重定向
用法:echo abc > 1.txt
这句话的意思即是:输出abc字符串到一个位置,如果1.txt存在,我们即【清空其1.txt内容,更新为abc】,不存在,创建之
这个过程,echo没有像之前那样向终端打印参数,为什么?
原因是因为,>输出重定
向把echo的参数输出到某个文件(而不是输出到终端,这就是输出重定向)。
1.5.3.5 echo > >输出追加重定向
操作符>>输出追加
重定向和>输出重定向功能类似。
相同的地方是:如果重定向的文件不存在,创建之
唯一不同的地方是:【如果重定向的文件存在,追加之(>符是清空后新增内容,>>是在文件末尾追加字符串)
】
相关文章:
【genius_platform软件平台开发】第九十三讲:串口通信(485通信)
485通信1. 485通信1.1 termios结构1.2 头文件1.3 函数讲解1.3.1 tcgetattr1.3.2 tcsetattr1.4 示例工程1.5 参考文献1.5.1 stty命令1.5.2 命令格式1.5.2 microcom命令1.5.2.1介绍1.5.2.2指令1.5.3 echo命令1.5.3.1 语法1.5.3.2 选项列表1.5.3.3 使用示例1.5.3.4 e cho > 输出…...
JavaScript动画相关讲解
JavaScript是一种非常流行的脚本语言,广泛应用于Web开发、游戏开发、移动应用开发等领域。在Web开发中,动画效果是非常重要的一部分,可以提高网站的用户体验和吸引力。JavaScript提供了一些基本的动画函数,但是这些函数往往不能满…...

InnoSetup制作安装包(EXE)
功能描述 1.666666.war为项目war包,666666.bat为启动war包脚本,通过InnoSetup将它们打包到安装包666666.exe 2.666666.exe安装包安装过程中将666666.bat注册为自启动服务,安装结束自动执行脚本启动项目666666.war --------------------------…...

CASE WHEN函数语句多条件下使用详解
目录 CASE 的两种格式: 简单CASE函数 和 CASE搜索函数 同时配合 SUM 以及 COUNT 方法的使用 ① SUM函数 ② COUNT函数 CASE WHEN函数语句,实现简单CASE函数和CASE搜索函数两种格式。同时配合 SUM以及COUNT方法的使用 CASE 的两种格式: 简…...
2.31、守护进程(2)
2.31、守护进程(2)1.守护进程的创建步骤2.什么情况下子进程不会继承父进程的组ID3.哪些操作会导致子进程的组ID发生改变4.kill怎么杀掉守护进程的实现守护进程1.守护进程的创建步骤 执行一个 fork(),之后父进程退出,子进程继续执…...

记录上传文件异常 /tmp/tomcat... (No space left on device)
一,问题描述 用postman调用上传接口,基本每两次调用会有一次报错,如下 {"timestamp": "2023-04-11T03:00:15.4690000","status": 500,"error": "Internal Server Error","exceptio…...

无向连通图中长度为 n 的循环
给定一个无向连通图和一个数字 n,计算图中长度为 n 的循环总数。长度为 n 的圈简单地表示该圈包含 n 个顶点和 n 条边。我们必须计算所有存在的此类循环。 示例: 输入:n = 4 输出:总周期数 = 3 解释 :遵循 3 个独特的循环0 -> 1 -> 2 -> 3 -> 0 0 -> 1 …...

打造出ChatGPT的,是怎样一群人?
震惊世界的ChatGPT,要多少人才能开发出来?几百,还是几千? 答案是:87个人。 老实说,刚看到这个数字真是惊到我了,印象里,之前看媒体报道各大巨头人工智能人才储备时,动辄…...

数据结构——栈与队列相关题目
数据结构——栈与队列相关题目232. 用栈实现队列思路225. 用队列实现栈1.两个队列实现栈2.一个队列实现栈20. 有效的括号思路1047. 删除字符串中的所有相邻重复项思路155. 最小栈150. 逆波兰表达式求值思路239. 滑动窗口最大值单调队列347. 前 K 个高频元素思路232. 用栈实现队…...

Redhat6.7离线安装rabbitmq
一、下载资源文件(.rpm文件) 链接: https://pan.baidu.com/s/1j2Ze_Jjm0oMrP-r95PPCtA?pwdv3is 提取码: v3is 复制这段内容后打开百度网盘手机App,操作更方便哦 创建rabbit文件夹Mkdir rabbit 三、通过ftp上传文件 四、安装erlang环境 …...

EasyCVR平台基于GB28181协议的语音对讲配置操作教程
EasyCVR基于云边端协同,具有强大的数据接入、处理及分发能力,平台可支持海量视频的轻量化接入与汇聚管理,可提供视频监控直播、视频轮播、视频录像、云存储、回放与检索、智能告警、服务器集群、语音对讲、云台控制、电子地图、平台级联等功能…...

谷歌发布Self-Debug方法,让大模型学会自己修bug,一次性生成正确代码
文 | 智商掉了一地你有没有想过,让一台计算机诊断和修复自己生成的错误代码?一篇最新的研究论文介绍了一种名为 Self-Debugging 的技术,通过在生成的代码中添加自解释的信息,让计算机像一个可以自己修复代码的程序员一样调试自己的…...
行为型模式-模板方法
行为型模式-模板方法 模板方法(Template Method)解决算法框架问题描述适用环境优点:缺点:违反原则:代码实现模板方法(Template Method) 解决算法框架问题 描述 定义了一个算法的骨架,并将某些步骤延迟到子类中进行实现,从而使得算法的具体实现能够在子类中自由变化…...
正则表达式识别日期
正则表达式识别日期 正则表达式识别各种格式的日期 import redef extract_dates(text):# 正则表达式,用于识别常见的日期格式date_pattern r"""(?P<date>(?P<year_only>\d{4}(?![\d年]))| # …...
如何设计一个秒杀架构设计?
文章目录 1. 秒杀业务的特点2. 总体思路2.1 削峰限流安全保护页面优化,动静分离异步处理热点分离2.2 Nginx的设计细节2.3 页面优化细节降低交互的压力安全控制2.4 Redis集群的应用分布式悲观锁(参考redis悲观锁的代码)异步处理订单2.5 消息队列限流2.6 数据库设计2.7 答题验…...

Elasticsearch:配置选项
Elasticsearch 带有大量的设置和配置,甚至可能让专家工程师感到困惑。 尽管它使用约定优于配置范例并且大部分时间使用默认值,但在将应用程序投入生产之前自定义配置是必不可少的。 在这里,我们将介绍属于不同类别的一些属性,并讨…...

消息中间件Kafka分布式数据处理平台+ZooKeeper
目录 一.消息队列基本介绍 1.为什么需要消息队列(MQ) 2.使用消息队列的好处 2.1 解耦 2.2 可恢复性 2.3 缓冲 2.4 灵活性 & 峰值处理能力 2.5 异步通信 3.消息队列的两种模式 3.1 点对点模式 3.2 发布/订阅模式 二.Kafka基本介绍 1.Kaf…...

Linux 用户文件磁盘网络进程指令
用户相关指令 useradd 用户名添加用户useradd -g 组名 用户名 向组添加用户passwd 用户名 设置密码id 用户名 查看用户名的具体信息cat /etc/passwd 查看创建了哪些用户su 用户名 切换用户名(不能获得环境变量)su - 用户名获得环境变量以及执行权…...
如何使用Socks5代理IP提高网络安全性
随着网络的快速发展,网络安全问题变得越来越重要。为了保障网络安全,人们普遍使用代理IP,其中Socks5代理IP是一种常用的选择。本文将介绍什么是Socks5代理IP,以及如何使用它提高网络安全性。 一、什么是Socks5代理IP Socks5代…...

《Java8实战》第3章 Lambda 表达式
利用行为参数化来传递代码有助于应对不断变化的需求。它允许你定义一段代码块来表示一个行为,然后传递它。采用匿名类来表示多种行为并不令人满意:代码十分啰唆,这会影响程序员在实践中使用行为参数化的积极性。 3.1 Lambda 管中窥豹 可以…...

C++语法系列之模板进阶
前言 本次会介绍一下非类型模板参数、模板的特化(特例化)和模板的可变参数,不是最开始学的模板 一、非类型模板参数 字面意思,比如: template<size_t N 10> 或者 template<class T,size_t N 10>比如:静态栈就可以用到&#…...

小黑大语言模型通过设计demo进行应用探索:langchain中chain的简单理解demo
chain简介 LangChain 中的 Chain 模块在开发大型语言模型(LLM)驱动的应用程序中起着至关重要的作用。Chain是串联LLM能力与实际业务的关键桥梁,通过将多个工具和模块按逻辑串联起来,实现复杂任务的多步骤流程编排。 案例 通过…...
Qt 窗口标志(Window Flags)详解:控制窗口样式与行为
在 Qt 中,windowFlags 用于控制窗口的样式和行为,包括标题栏、边框、最大化/最小化按钮等。合理设置 windowFlags 可以自定义窗口的外观和交互方式。本文将详细介绍常用的窗口标志及其组合效果。 1. 基本概念 windowFlags 是一个 Qt::WindowFlags 类型的…...

(新)MQ高级-MQ的可靠性
消息到达MQ以后,如果MQ不能及时保存,也会导致消息丢失,所以MQ的可靠性也非常重要。 一、数据持久化 为了提升性能,默认情况下MQ的数据都是在内存存储的临时数据,重启后就会消失。为了保证数据的可靠性,必须…...

【机器学习】支持向量机
文章目录 一、支持向量机简述1.概念2.基本概念3.算法介绍4.线性可分5.算法流程 二、实验1.代码介绍2.模型流程3.实验结果4.实验小结 一、支持向量机简述 1.概念 支持向量机(SVM)是一类按监督学习方式对数据进行二元分类的广义线性分类器,其…...

【Java开发日记】基于 Spring Cloud 的微服务架构分析
目录 1、Spring Cloud 2、Spring Cloud 的核心组件 1. Eureka(注册中心) 2. Zuul(服务网关) 3. Ribbon(负载均衡) 4. Hystrix(熔断保护器) 5. Feign(REST转换器&a…...
接口性能优化
一、耗时统计 在做接口的性能优化时,最重要的是知道时间消耗在哪里。 可以用StopWatch,进行耗时统计。 详情见: https://blog.csdn.net/sinat_32502451/article/details/148350451 二、链路追踪 如果团队使用了Skywalking,可以…...

mysql慢sql的实际处理方案之一
复习mysql架构图 当大批量慢sql过来,显然就是占用了线程池的链接,然后长久不释放,所以会出现线程池满的问题,致使正常业务sql也全部阻塞,影响整个业务。 AI搜索如下: 可以考虑一种方案: 将线…...
Elasticsearch 分析器介绍
在 Elasticsearch 的世界里,构建高效搜索引擎的关键一环,便是透彻理解分析器(Analyzer)的工作机制。一个优秀的搜索引擎,能够精准地返回与用户查询紧密相关的文档,而这背后,正是分析器在默默发挥着核心作用。它不仅负责处理待索引的文档,还在用户发起查询时,智能评估哪…...

【LUT技术专题】图像自适应3DLUT
3DLUT开山之作: Learning Image-adaptive 3D Lookup Tables for High Performance Photo Enhancement in Real-time(2020 TPAMI ) 专题介绍一、研究背景二、图像自适应3DLUT方法2.1 前置知识2.2 整体流程2.3 损失函数的设计 三、实验结果四、局限五、总结…...