STM32实现三个串口同时开启发送接收数据

程序目的:

        实现STM32开通三个串口,每个串口都可以实现接收和发送数据。

注意事项:

        编程时,严禁在中断函数中写入发送串口数据代码,否则会出错,具体原因不清楚(有大佬知道的话帮我指出),可能原因是DR寄存器冲突导致。

开始编程:

Serial.c

#include "stm32f10x.h"                  // Device header
#include <stdio.h>
//#include "OLED.h"
//#include "Delay.h"
#include <stdarg.h>
char Serial_RxPacket1[100];
char Serial_RxPacket2[100];
uint8_t Serial_RxFlag1;
uint8_t Serial_RxFlag2;
uint8_t Serial_RxFlag3;
void Serial_Init(USART_TypeDef *USARTx) {GPIO_InitTypeDef GPIO_Init_Structure;                            //定义GPIO结构体USART_InitTypeDef USART_Init_Structure;                          //定义串口结构体NVIC_InitTypeDef  NVIC_Init_Structure;							 //定义中断结构体if(USARTx == USART1){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,  ENABLE);              //开启GPIOA时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,  ENABLE);            	//开启APB2总线复用时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,  ENABLE);         	//开启USART1时钟GPIO_Init_Structure.GPIO_Mode = GPIO_Mode_AF_PP;				//复用推挽输出GPIO_Init_Structure.GPIO_Pin = GPIO_Pin_9;GPIO_Init_Structure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_Init_Structure);GPIO_Init_Structure.GPIO_Mode = GPIO_Mode_IPU;					//浮空输入或者上拉输入,使用上拉输入抗干扰能力更强GPIO_Init_Structure.GPIO_Pin = GPIO_Pin_10;GPIO_Init_Structure.GPIO_Speed = GPIO_Speed_50MHz;USART_Init_Structure.USART_BaudRate = 115200;					//波特率USART_Init_Structure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//硬件流控制(不使用,CTS,CTS&RTS)USART_Init_Structure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;	//串口模式 可以使用(或)|符号实现Tx和Rx同时设置USART_Init_Structure.USART_Parity = USART_Parity_No;				//校验位,无需校验USART_Init_Structure.USART_StopBits = USART_StopBits_1;				//停止位,选择1位USART_Init_Structure.USART_WordLength = USART_WordLength_8b;		//字长USART_Init(USART1, &USART_Init_Structure);USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);						//开启RXNE到NVIC的输出,开启中断NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_Init_Structure.NVIC_IRQChannel = USART1_IRQn;NVIC_Init_Structure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init_Structure.NVIC_IRQChannelPreemptionPriority = 1;NVIC_Init_Structure.NVIC_IRQChannelSubPriority = 1;NVIC_Init(&NVIC_Init_Structure);}if(USARTx == USART2) {RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,  ENABLE);           //开启GPIOA时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,  ENABLE);            //开启APB2总线复用时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,  ENABLE);          //开启USART1时钟//配置PA2 TXGPIO_Init_Structure.GPIO_Mode  = GPIO_Mode_AF_PP;                //复用推挽GPIO_Init_Structure.GPIO_Pin   = GPIO_Pin_2;GPIO_Init_Structure.GPIO_Speed = GPIO_Speed_10MHz;GPIO_Init(GPIOA, &GPIO_Init_Structure);//配置PA3 RXGPIO_Init_Structure.GPIO_Mode  = GPIO_Mode_IPU;         GPIO_Init_Structure.GPIO_Pin   = GPIO_Pin_3;GPIO_Init(GPIOA, &GPIO_Init_Structure);USART_Init_Structure.USART_BaudRate = 115200;                                          //波特率设置为115200USART_Init_Structure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;       //硬件流控制为无USART_Init_Structure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;                       //模式设为收和发USART_Init_Structure.USART_Parity = USART_Parity_No;                                   //无校验位USART_Init_Structure.USART_StopBits = USART_StopBits_1;                                //一位停止位USART_Init_Structure.USART_WordLength = USART_WordLength_8b;                           //字长为8位  USART_Init(USART2, &USART_Init_Structure);  USART_Cmd(USART2, ENABLE);USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_Init_Structure.NVIC_IRQChannel 			=   USART2_IRQn;NVIC_Init_Structure.NVIC_IRQChannelCmd   	=   ENABLE;NVIC_Init_Structure.NVIC_IRQChannelPreemptionPriority  =  1;NVIC_Init_Structure.NVIC_IRQChannelSubPriority         =  1;NVIC_Init(&NVIC_Init_Structure);}if(USARTx == USART3) {RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,  ENABLE);                 //开启GPIOA时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,  ENABLE);            	   //开启APB2总线复用时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,  ENABLE);          	   //开启USART1时钟//配置PB10 TXGPIO_Init_Structure.GPIO_Mode  = GPIO_Mode_AF_PP;                	   //复用推挽GPIO_Init_Structure.GPIO_Pin   = GPIO_Pin_10;GPIO_Init_Structure.GPIO_Speed = GPIO_Speed_10MHz;GPIO_Init( GPIOB, &GPIO_Init_Structure);//配置PB11 RXGPIO_Init_Structure.GPIO_Mode  = GPIO_Mode_IN_FLOATING;GPIO_Init_Structure.GPIO_Pin   = GPIO_Pin_11;GPIO_Init( GPIOB, &GPIO_Init_Structure);USART_Init_Structure.USART_BaudRate = 115200;                                          //波特率设置为115200USART_Init_Structure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;       //硬件流控制为无USART_Init_Structure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;                       //模式设为收和发USART_Init_Structure.USART_Parity = USART_Parity_No;                                   //无校验位USART_Init_Structure.USART_StopBits = USART_StopBits_1;                                //一位停止位USART_Init_Structure.USART_WordLength = USART_WordLength_8b;                           //字长为8位   USART_Init(USART3, &USART_Init_Structure);   USART_Cmd(USART3, ENABLE);USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_Init_Structure.NVIC_IRQChannel 				   = USART3_IRQn;NVIC_Init_Structure.NVIC_IRQChannelCmd				   = ENABLE;NVIC_Init_Structure.NVIC_IRQChannelPreemptionPriority  = 1;NVIC_Init_Structure.NVIC_IRQChannelSubPriority         = 1;NVIC_Init(&NVIC_Init_Structure);}
}
void Serial_SendByte(USART_TypeDef *USARTx,uint8_t Byte) {USART_SendData(USARTx, Byte);//发送数据while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET) {//等待发送寄存器空,//TXE就是发送寄存器空的标志位,不需要手动清零,下一次发送数据时候会自动清零}
}
void Serial_SendArray(USART_TypeDef *USARTx, uint8_t *Array, uint16_t Length){uint16_t i;for(int i = 0; i < Length; i++) {Serial_SendByte(USARTx, Array[i]);}}
void Serial_SendString(USART_TypeDef *USARTx, char *Str) {//字符串自带结束标志位uint8_t i;for(int i = 0; Str[i] != '\0'; i++) {Serial_SendByte(USARTx, Str[i]);}
}//*****************************************发送数字
uint32_t Serial_Pow(uint32_t X, uint32_t y) {uint32_t Result = 1;while(y--) {Result *= X;}return Result;
}
void Serial_SendNumber(USART_TypeDef *USARTx, uint32_t Number, uint8_t Length) {uint8_t i;for(int i = 0; i < Length; i++){Serial_SendByte(USARTx, (Number / Serial_Pow(10, Length - i - 1)) % 10 + '0');}}
//*****************************************发送数字int fputc(int ch, FILE* f){Serial_SendByte(USART1, ch);//重定向到串口1,使得Printf打印到串口return ch;}
//使用sprintf让其他的串口也能使用,sprintf可以把格式化字符输出到一个字符串里
void Serial_Printf(USART_TypeDef *USARTx, char* format,...){char String[100];va_list arg;va_start(arg, format);vsprintf(String, format, arg);va_end(arg);Serial_SendString(USARTx,String);
}uint8_t Serial_GetRxFlag(USART_TypeDef *USARTx) {if(USARTx == USART1) {if(Serial_RxFlag1 == 1){Serial_RxFlag1 = 0;return 1;}}else if(USARTx == USART2) {if(Serial_RxFlag2 == 1){Serial_RxFlag2 = 0;return 1;}}else if(USARTx == USART3) {if(Serial_RxFlag3 == 1){Serial_RxFlag3 = 0;return 1;}}return 0;
}
void Serial_SendPacket(USART_TypeDef *USARTx){}void USART1_IRQHandler() {static uint8_t RxState = 0;//类似全局变量,函数进入只会初始化一次0,函数退出仍然有效,与全局函数不同,静态变量只能在本函数中使用static uint8_t pRxPacket = 0;char temp;//Serial_SendString(USART1,"Led Open Successful\r\n");//Delay_ms(1000);if(USART_GetITStatus(USART1,USART_IT_RXNE)!= RESET){uint8_t RxData = USART_ReceiveData(USART1);if(RxState == 0){//若在这里将RxState置为1,那么下面就会立马执行,因此要加上else,也可用switch case语句if(RxData == '@') {RxState = 1;pRxPacket = 0;}}else if(RxState == 1) {if(RxData == '\r'){RxState = 2;}else {Serial_RxPacket1[pRxPacket] = RxData;pRxPacket ++;}}else if(RxState ==  2){if(RxData == '\n') {RxState = 0;Serial_RxFlag1 = 1;Serial_RxPacket1[pRxPacket] = '\0';//不加不能使用OLED_ShowString}}USART_ClearITPendingBit(USART1, USART_IT_RXNE);}
}
void USART2_IRQHandler() {static uint8_t RxState = 0;//类似全局变量,函数进入只会初始化一次0,函数退出仍然有效,与全局函数不同,静态变量只能在本函数中使用static uint8_t pRxPacket = 0;char temp;//Serial_SendString(USART2,"Led Open Successful\r\n");//Delay_ms(10);if(USART_GetITStatus(USART2,USART_IT_RXNE)!= RESET){uint8_t RxData = USART_ReceiveData(USART2);if(RxState == 0){//若在这里将RxState置为1,那么下面就会立马执行,因此要加上else,也可用switch case语句if(RxData == '@') {RxState = 1;pRxPacket = 0;}}else if(RxState == 1) {if(RxData == '\r'){RxState = 2;}else {Serial_RxPacket2[pRxPacket] = RxData;pRxPacket ++;}}else if(RxState ==  2){if(RxData == '\n') {RxState = 0;Serial_RxFlag2 = 1;Serial_RxPacket2[pRxPacket] = '\0';//不加不能使用OLED_ShowString}}USART_ClearITPendingBit(USART2, USART_IT_RXNE);}
}
void USART3_IRQHandler(void)
{char temp;if(USART_GetITStatus(USART3,USART_IT_RXNE)!= RESET){temp = USART_ReceiveData(USART3);if(temp == 'O'){GPIO_ResetBits(GPIOC,GPIO_Pin_13);Serial_SendString(USART3,"Led Open Successful\r\n");		}if(temp == 'C'){GPIO_SetBits(GPIOC,GPIO_Pin_13);Serial_SendString(USART3,"Led Close Successful\r\n");}}
}

Serial.h

#ifndef __SERIAL_H
#define __SERIAL_H
#include <stdio.h>
extern char Serial_RxPacket1[];
extern char Serial_RxPacket2[];
void Serial_Init(USART_TypeDef *USARTx);
void Serial_SendByte(USART_TypeDef *USARTx,uint8_t Byte);
void Serial_SendArray(USART_TypeDef *USARTx,uint8_t *Array, uint16_t Length);
void Serial_SendString(USART_TypeDef *USARTx,char *String);
void Serial_SendNumber(USART_TypeDef *USARTx,uint32_t Number, uint8_t Length);
void Serial_Printf(USART_TypeDef *USARTx,char* format,...);
uint8_t Serial_GetRxFlag(USART_TypeDef *USARTx);#endif

GpioControl.c

#include "stm32f10x.h"                  // Device headervoid GpioInit(GPIO_TypeDef *GPIOx, uint16_t Pin, GPIOMode_TypeDef GpioMode){uint32_t RCC_APB2Periph_GPIOx;if(GPIOx == GPIOA) {RCC_APB2Periph_GPIOx = RCC_APB2Periph_GPIOA;}else if(GPIOx == GPIOB) {RCC_APB2Periph_GPIOx = RCC_APB2Periph_GPIOB;}else if(GPIOx == GPIOC) {RCC_APB2Periph_GPIOx = RCC_APB2Periph_GPIOC;}RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOx, ENABLE);//ctrl + Alt + 空格:可以出现代码提示GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GpioMode;//推挽输出GPIO_InitStructure.GPIO_Pin = Pin;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOx, &GPIO_InitStructure);GPIO_ResetBits(GPIOx, Pin);
}
void GpioTurn(GPIO_TypeDef *GPIOx, uint16_t GPIO_PIN) {//反转当前引脚状态if(GPIO_ReadOutputDataBit(GPIOx,GPIO_PIN) == 0){GPIO_SetBits(GPIOx,GPIO_PIN);}else{GPIO_ResetBits(GPIOx, GPIO_PIN);}
}
void GpioControl(GPIO_TypeDef *GPIOx, uint16_t GPIO_PIN, uint8_t sign) {//控制引脚if(sign == ENABLE){GPIO_SetBits(GPIOx, GPIO_PIN);}if(sign == DISABLE){GPIO_ResetBits(GPIOx, GPIO_PIN);}
}

GpioControl.h

#ifndef __GPIOCONTROL_H
#define __GPIOCONTROL_Hvoid GpioInit(GPIO_TypeDef *GPIOx, uint16_t Pin, GPIOMode_TypeDef GpioMode);
void GpioTurn(GPIO_TypeDef *GPIOx, uint16_t GPIO_PIN);
void GpioControl(GPIO_TypeDef *GPIOx, uint16_t GPIO_PIN, uint8_t sign);#endif 

main.c

#include "stm32f10x.h"                  // Device header
//#include "DELAY.h"
//#include "OLED.h"
#include "Serial.h"
//#include "DigitalSwitch.h"
#include "GpioControl.h"
#include <string.h>
uint8_t RxData;
uint8_t KeyNum;int main() {GpioInit(GPIOC, GPIO_Pin_13, GPIO_Mode_Out_PP);GPIO_SetBits(GPIOC,GPIO_Pin_13);
//	DigitalSwitchInit(GPIOA, GPIO_Pin_1, GPIO_Mode_IPU);OLED_Init();Serial_Init(USART1);Serial_Init(USART2);Serial_Init(USART3);//OLED_ShowString(1, 1, "TxData:");//OLED_ShowString(3, 1, "RxData:");while(1){if(Serial_GetRxFlag(USART1) == 1) {if(strcmp(Serial_RxPacket1, "LED_ON") == 0) {GPIO_ResetBits(GPIOC,GPIO_Pin_13);Serial_SendString(USART1,Serial_RxPacket1);}else if(strcmp(Serial_RxPacket1, "LED_OFF") == 0) {GPIO_SetBits(GPIOC,GPIO_Pin_13);Serial_SendString(USART1,Serial_RxPacket1);}}if(Serial_GetRxFlag(USART2) == 1) {if(strcmp(Serial_RxPacket2, "LED_ON") == 0) {GPIO_ResetBits(GPIOC,GPIO_Pin_13);Serial_SendString(USART2,Serial_RxPacket2);}else if(strcmp(Serial_RxPacket2, "LED_OFF") == 0) {GPIO_SetBits(GPIOC,GPIO_Pin_13);Serial_SendString(USART2,Serial_RxPacket2);}}}
}

程序现象:

        RX,TX连接到A9,A10使用串口1,使用串口工具发送@LED_ON指令(记得发送时候按下回车,将\n也发送出去),串口回传LED_ON,同时LED灯被打开,发送LED_OFF同理。

        RX,TX连接到A2,A3使用串口2,使用串口工具发送@LED_ON指令(记得发送时候按下回车,将\n也发送出去),串口回传LED_ON,同时LED灯被打开,发送LED_OFF同理。

        RX,TX连接到B10,B11使用串口3,使用串口工具发送O字符,串口回传Led Open Successful\r\n,同时LED灯被打开,发送C字符同理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2904635.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

YOLOv9改进策略 | 损失函数篇 | InnerIoU、InnerMPDIoU二次创新损失函数助力小目标检测(全网独家首发)

一、本文介绍 本文给大家带来的改进机制是InnerIoU以及包含其它二次创新的代码InnerCIoU、InnerMPDIoU等一些列利用Inner形成的二次创新损失函数&#xff0c;到此大家可能比较模糊为啥Inner能够和其他损失函数形成二次创新&#xff0c;Inner又是一个什么样的机制&#xff0c;开…

边缘计算与云计算总结

一. EdgeGallery 简介 MEC场景下的EdgeGallery是让资源边缘化&#xff0c;实时完成移动网络边缘的业务处理&#xff0c;MEC场景下的EdgeGallery让开发者能更便捷地使用 5G 网络能力&#xff0c;让5G能力在边缘触手可及。 EdgeGallery是由华为、信通院、中国移动、中国联通、…

网络原理-传输层-UDP报文结构

本文介绍UDP报文 有很多友友搞不清楚UDP报文的详细结构还有TCP的详细结构,所以专门分开来讲 以免弄混. 首先我们先看一下整个UDP结构,让大家有一个全方面的认识 下面我们来详细解释UDP报 16位源端口号(本机):就是2字节大小,16个二进制位. 16位目的端口号(目的机):也是2字节…

C++优先队列——priority_queue,函数对象,labmda表达式,pair等

头文件&#xff1a;#include<queue> 内部使用堆来实现&#xff0c;在需要或得最大的几个值或最小的几个值而不关心整个数组的顺序时非常好用。 用法&#xff1a; priority_queue<int, vector<int>, greater<int>>q; 第一个参数为堆中存储的元素。 …

基础算法-去重字符串,辗转相除法,非递归前序遍历二叉树题型分析

目录 不同子串 辗转相除法-求最大公约数 二叉树非递归前序遍历 不同子串 从a开始&#xff0c;截取 a aa aaa aaab 从第二个下标开始a aa aab 从第三个 a ab 从第四个 b 使用set的唯一性&#xff0c;然后暴力遍历来去去重&#xff0c;从第一个下标开始截取aaab a aa aaa aaab…

【python基础教程】2. 算法的基本要素与特性

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;python基础教程 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、…

Svg Flow Editor 原生svg流程图编辑器(四)

系列文章 Svg Flow Editor 原生svg流程图编辑器&#xff08;一&#xff09; Svg Flow Editor 原生svg流程图编辑器&#xff08;二&#xff09; Svg Flow Editor 原生svg流程图编辑器&#xff08;三&#xff09; Svg Flow Editor 原生svg流程图编辑器&#xff08;四&#xf…

RabbitMQ 实验消费原始队列消息, 拒绝(reject)投递死信交换机过程

如果你想通过 RabbitMQ 的死信队列功能实现消费者拒绝消息投递到死信交换机的行为&#xff0c;你可以按照以下步骤操作&#xff1a; 创建原始队列&#xff0c;并将其绑定到一个交换机上&#xff1a; export RABBITMQ_SERVER127.0.0.1 export RABBITMQ_PORT5672 export RAB…

Jenkins升级中的小问题

文章目录 使用固定版本安装根据jenkins页面下载war包升级jenkins重启jenkins报错问题解决 K8s部署过程中的一些小问题 ##### Jenkins版本小插曲 ​ 在Jenkins环境进行插件安装时全部清一色飘红&#xff0c;发现是因为Jenkins版本过低导致&#xff0c;报错的位置可以找到更新je…

Unity 实现鼠标左键进行射击

发射脚本实现思路 分析 确定用户交互方式&#xff1a;通过鼠标左键点击发射子弹。确定子弹发射逻辑&#xff1a;每次点击后有一定时间间隔才能再次发射。确定子弹发射源和方向&#xff1a;子弹从枪口&#xff08;Transform&#xff09;位置发射&#xff0c;沿枪口方向前进。 变…

win11蓝牙图标点击变灰,修复过程

问题发现 有一天突然心血来潮想着连接蓝牙音响放歌来听,才发现win11系统右下角菜单里的蓝牙开关有问题。 打开蓝牙设置,可以正常直接连上并播放声音,点击右下角菜单里的蓝牙开关按钮后,蓝牙设备也能正常断开,但是按钮直接变深灰色,无法再点击打开。 重启电脑,蓝牙开关显…

Linux(CentOS)/Windows-C++ 云备份项目(客户端文件操作类,数据管理模块设计,文件客户端类设计)

文章目录 1. 客户端文件操作类2. 客户端数据管理模块设计3. 文件客户端类设计项目代码 客户端负责的功能 指定目录的文件检测&#xff0c;获取文件夹里面的文件 判断这个文件是否需要备份&#xff0c;服务器备份过的文件则不需要进行备份&#xff0c;已经备份的文件如果修改也…

【Frida】【Android】04_Objection安装和使用

&#x1f6eb; 系列文章导航 【Frida】【Android】01_手把手教你环境搭建 https://blog.csdn.net/kinghzking/article/details/136986950【Frida】【Android】02_JAVA层HOOK https://blog.csdn.net/kinghzking/article/details/137008446【Frida】【Android】03_RPC https://bl…

Rabbitmq消息顺序的问题以及解决方案

1.1消息顺序的场景 场景1&#xff1a;一个queue&#xff0c;多个consumer 一个queue&#xff0c;有多个consumer去消费&#xff0c;这样就会造成顺序的错误&#xff0c;consumer从MQ里面读取数据是有序的&#xff0c;但是每个consumer的执行时间是不固定的&#xff0c;无法保…

Radio Silence for mac 好用的防火墙软件

Radio Silence for Mac是一款功能强大的网络防火墙软件&#xff0c;专为Mac用户设计&#xff0c;旨在保护用户的隐私和网络安全。它具备实时网络监视和控制功能&#xff0c;可以精确显示每个网络连接的状态&#xff0c;让用户轻松掌握网络活动情况。 软件下载&#xff1a;Radio…

【案例·增】获取当前时间、日期(含,SQL中DATE数据类型)

问题描述&#xff1a; 需要使用当前时间、日期&#xff0c;可以使用 SQL 中的 CURDATE() 、NOW()、CURTIME()运算符 案例&#xff1a; INSERT INTO table_name(current_time, column_name2,...) VALUES (NOW(),, ...)规则(Date 相关函数)&#xff1a; 规则(Date数据类型)

Redis命令-List命令

4.6 Redis命令-List命令 Redis中的List类型与Java中的LinkedList类似&#xff0c;可以看做是一个双向链表结构。既可以支持正向检索和也可以支持反向检索。 特征也与LinkedList类似&#xff1a; 有序元素可以重复插入和删除快查询速度一般 常用来存储一个有序数据&#xff…

HackTheBox-Machines--Legacy

文章目录 1 端口扫描2 测试思路3 445端口漏洞测试4 flag Legacy 测试过程 1 端口扫描 nmap -sC -sV 10.129.227.1812 测试思路 目标开启了135、139、445端口&#xff0c;445 SMB服务存在很多可利用漏洞&#xff0c;所以测试点先从445端口开始。而且在Nmap扫描结果中&#xff0c…

关于使用vscode搭建c/c++编程环境

目录 关于使用vscode搭建c/c编程环境一、前言二、安装 IDE 二、安装TDM-GCC安装三、安装C/C环境四、编写代码并进行编译 关于使用vscode搭建c/c编程环境 一、前言 一直觉得vscode是生产强有力的生产工具&#xff0c;基于此&#xff0c;做一篇学习笔记进行记录。 二、安装 ID…

react-navigation:

我的仓库地址&#xff1a;https://gitee.com/ruanjianbianjing/bj-hybrid react-navigation&#xff1a; 学习文档&#xff1a;https://reactnavigation.org 安装核心包: npm install react-navigation/native 安装react-navigation/native本身依赖的相关包: react-nativ…