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

news2024/12/22 18:56:25

程序目的:

        实现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 TX
		GPIO_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 RX
		GPIO_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;                                          //波特率设置为115200
		USART_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 TX
		GPIO_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 RX
		GPIO_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;                                          //波特率设置为115200
		USART_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 header

void 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_H

void 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://www.coloradmin.cn/o/1552558.html

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

相关文章

C#String的remove的用法

string test "abc";string temp test;temp.Remove(0, 1);temp temp.Remove(0, 1);Console.WriteLine(temp);Console.WriteLine(test);执行结果

UE RPC 外网联机(1)

技术&#xff1a;RPC TCP通信 设计&#xff1a;大厅服务<---TCP--->房间服务<---RPC--->客户端&#xff08;Creator / Participator&#xff09; 1. PlayerController 用于RPC通信控制 2.GameMode 用于数据同步 3.类图 4. 注意 &#xff08;1&#xff09;RPC&a…

uniapp h5 touch事件踩坑记录

场景&#xff1a;悬浮球功能 当我给悬浮球设置了 position: fixed; 然后监听悬浮球的touch事件&#xff0c;从事件对象中拿到clientY和clientX赋值给悬浮球的left和top属性。当直接赋值后效果应该是这样子&#xff1a; 注意鼠标相对悬浮球的位置&#xff0c;应该就是左上角&a…

深度学习论文: Attention is All You Need及其PyTorch实现

深度学习论文: Attention is All You Need及其PyTorch实现 Attention is All You Need PDF:https://arxiv.org/abs/1706.03762.pdf PyTorch: https://github.com/shanglianlm0525/PyTorch-Networks 大多数先进的神经序列转换模型采用编码器-解码器结构&#xff0c;其中编码器将…

力扣热门算法题 135. 分发糖果,146. LRU 缓存,148. 排序链表

135. 分发糖果&#xff0c;146. LRU 缓存&#xff0c;148. 排序链表&#xff0c;每题做详细思路梳理&#xff0c;配套Python&Java双语代码&#xff0c; 2024.03.28 可通过leetcode所有测试用例。 目录 135. 分发糖果 解题思路 完整代码 Python Java 146. LRU 缓存 …

Mybatis别名 动态sql语句 分页查询

给Mybatis的实体类起别名 给Mybatis的xml文件注册mapper映射文件 动态sql语句 1 if 2 choose 3 where 4 foreach 一&#xff09;if 查询指定名称商品信息 语法&#xff1a; SELECT * FROM goods where 11 <if test "gName!null"> and g.g_name like co…

|行业洞察·手机|《2024手机行业及营销趋势报告-18页》

报告的主要内容解读&#xff1a; 手机行业概述及品牌分布&#xff1a; 2022年&#xff0c;受疫情影响&#xff0c;中国国内手机市场出货量下降22.6%&#xff0c;总计2.72亿部。5G手机市场占有率中&#xff0c;苹果领先&#xff0c;其次是vivo、OPPO和华为。消费者换机时更注重性…

【MagicDrive环境配置】新手配俩星期版

1.创建一个新的环境conda create -n newdrive python3.8 2.激活该环境conda activate newdrive 3.下载MagicDrive源码 git clone --recursive https://github.com/cure-lab/MagicDrive.git&#xff0c;如果出现时间超时八成是网的问题&#xff0c;直接自己下载解压就好 3.我的…

【群智能算法改进】一种改进的同核分子优化算法 IHMO算法【Matlab代码#71】

文章目录 【获取资源请见文章第5节&#xff1a;资源获取】1. 原始HMO算法2. 改进HMO算法2.1 改进的距离减小因子2.2 黄金正弦策略扰动 3. 部分代码展示4. 仿真结果展示5. 资源获取说明 【获取资源请见文章第5节&#xff1a;资源获取】 1. 原始HMO算法 同核分子优化算法&#x…

HarmonyOS 应用开发之UIAbility组件生命周期

概述 当用户打开、切换和返回到对应应用时&#xff0c;应用中的UIAbility实例会在其生命周期的不同状态之间转换。UIAbility类提供了一系列回调&#xff0c;通过这些回调可以知道当前UIAbility实例的某个状态发生改变&#xff0c;会经过UIAbility实例的创建和销毁&#xff0c;…

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

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

如何构建一台机器学习服务器

系统信息 系统安装 系统安装这里就不再赘述&#xff0c;推荐使用ventory作为PE盘&#xff0c;来安装系统&#xff0c;这样方便快捷&#xff0c;可同时包含多个镜像&#xff0c;无需重复制作&#xff0c;需要注意的是在安装系统的时候需要手动进行分区&#xff0c;我们可以看一下…

uniApp使用XR-Frame创建3D场景(3)光源投影的运用。

上一篇讲解了如何在uniApp中创建xr-frame子组件并创建简单的3D场景。 这篇我们讲解光源在场景中的运用以及相关属性。 在子组件 xr-start的index.wxml文件中我们加入如下代码 <xr-scene render-system"alpha:true" bind:ready"handleReady"><xr…

睿尔曼超轻量仿人机械臂之复合机器人底盘介绍及接口调用

机器人移动平台是一个包含完整成熟的感知、认知和定位导航能力的轮式机器人底盘产品级平台&#xff0c;产品致力于为各行业细分市场的商用轮式服务机器人提供一站式移动机器人解决方案&#xff0c;让合作伙伴专注在核心业务/人机交互的实现。以下是我司产品双臂机器人以及复合升…

主机安全-德迅卫士

什么是主机安全&#xff1f; 主机安全&#xff0c;其核心内容包括安全应用交付系统、应用监管系统、操作系统安全增强系统和运维安全管控系统。它的具体功能是指保证主机在数据存储和处理的保密性、完整性&#xff0c;可用性&#xff0c;它包括硬件、固件、系统软件的自身安全&…

HCIA-Datacom H12-811 题库补充(3/28)

完整题库及答案解析&#xff0c;请直接扫描上方二维码&#xff0c;持续更新中 OSPFv3使用哪个区域号标识骨干区域&#xff1f; A&#xff1a;0 B&#xff1a;3 C&#xff1a;1 D&#xff1a;2 答案&#xff1a;A 解析&#xff1a;AREA 号0就是骨干区域。 STP下游设备通知上游…

蓝桥杯_day6

文章目录 不同路径不同路径II拿金币珠宝的最高价值 不同路径 【题目描述】 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为…

啥也不会的大学生看过来,这8步就能系统入门stm32单片机???

大家好&#xff0c;今天给大家介绍啥也不会的大学生看过来&#xff0c;这8步就能系统入门stm32单片机&#xff0c;文章末尾附有分享大家一个资料包&#xff0c;差不多150多G。里面学习内容、面经、项目都比较新也比较全&#xff01;可进群免费领取。 对于没有任何基础的大学生来…

GPT:多轮对话并搭建简单的聊天机器人

1 多轮对话 多轮对话能力至关重要&#xff0c;它不仅能深化交流&#xff0c;精准捕捉对方意图&#xff0c;还能促进有效沟通&#xff0c;增强理解。在智能客服、教育辅导等领域&#xff0c;多轮对话更是提升服务质量、增强用户体验的关键。 注意&#xff1a;大模型没有多轮对话…

JAVA使用POI实现Excel单元格合并-02

JAVA使用POI实现Excel单元格合并 实现效果 解释&#xff1a;只要是遇见与前一行相同的数据就合并 引入jar <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.2</version></depe…