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

这篇具有很好参考价值的文章主要介绍了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 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字符同理。

stm32同串口可以,STM32基础,stm32,嵌入式硬件,单片机文章来源地址https://www.toymoban.com/news/detail-850123.html

到了这里,关于STM32实现三个串口同时开启发送接收数据的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Stm32f103之串口发送数据,只接收到00的原因

    1、时钟选择的对不对, 2、GPIO口的TX引脚应该设置为“复用推挽输出” 3、中断初始化函数也不可加   4、硬件方面RXT、TXD电路接反。一直出现00的时候就要怀疑是不是线接反了。 总结:大概率是代码的问题一定要仔细检查

    2024年02月11日
    浏览(70)
  • 基于STM32F1以及STM32CubeMx实现串口中断通讯(字符串发送与接收)

    首先选好自己的板子并打开软件设置,本实验基于STM32F103ZET6实现,打开软件后如图: 打开外部高速晶振,然后接着配置时钟: 将时钟频率修改为72MHz,接着设置接线方式为SW 接下来需要使用串口中断通讯,打开我们的串口设置并打开中断 这里波特率设置为115200,数据位为

    2024年02月09日
    浏览(44)
  • 极度优雅的用stm32串口接收并分析不定长数据的方法(可用于发送和接收浮点数)

    我准备电赛的时候参加了学校为了准备电赛而举办的的积分赛,队友通过树莓派用给stm32发送执行指令,而我在队里作为写单片机的就需要分析数据包,每一个数据包都比较大也比较复杂,而且不定长,用传统的一个字节一个字节接收数据的方式收串口在代码层面上就显得和

    2024年02月04日
    浏览(59)
  • STM32-串口通信(串口的接收和发送)

    本文在于记录自己的学习过程中遇到的问题和总结,各种情况下串口通信在STM32的实际使用方面占有很大的比重,本文主要对 串口通信 做一个简要的总结。 在STM32里,串口通信是USART,STM32可以通过串口和其他设备进行传输 并行数据 ,是 全双工 , 异步时钟控制 ,设备之间是

    2024年02月03日
    浏览(71)
  • STM32串口通信—串口的接收和发送详解

    目录 前言: STM32串口通信基础知识: 1,STM32里的串口通信 2,串口的发送和接收 串口发送: 串口接收: 串口在STM32中的配置: 1. RCC开启USART、串口TX/RX所对应的GPIO口 2. 初始化GPIO口 3. 串口初始化 4. 串口使能 5. 串口发送数据 串口接收的两种实现方式: 1,轮询方式: 2,中断

    2024年04月08日
    浏览(107)
  • STM32--HAl库串口接收与发送

            在此之前,我们已经学习了单片机串口通信的原理(江科协),再写一遍我个人认知:世界上任何两个事物如果要进行交流的话,那必然需要两个东西进行通信的,就像两个人之间,两个国人之间用普通话就能够清楚的交流,但是让我们中国人和外国人去交流可能会

    2024年04月10日
    浏览(51)
  • 18、江科大stm32视频学习笔记——USART串口发送&串口发送和接收

    目录 一、USART串口发送  1、电路图 2、printf函数的移植方法 3、serial.c 4、main.c 5、解决直接写汉字,编译器报错 二 、USART串口发送和接收 1、查询实现 2、中断实现  (1)在Serial.c中添加的代码 (2)主函数中调用 (3)思路 (4)完整的Serial.c代码 (5)mian.c  要交叉连接,所

    2023年04月08日
    浏览(58)
  • 【STM32】HAL库 串口中断发送与接收

    【STM32】HAL库 新建MDK工程 【STM32】HAL库 串口轮询发送 使用stm32串口中断发送和中断接收 在主函数前开启中断,接受字节数为5 接受5个字节后,进入中断接收完成回调函数,重新再开启中断,并把接收到的数据返回 修改接收数组长度,改为开启串口空闲中断 接收事件回调函数

    2024年02月08日
    浏览(57)
  • STM32标准库开发——串口发送/单字节接收

    串口发送信息 启动串口一的时钟 初始化对应串口一的时钟,引脚,将TX引脚设置为复用推挽输出。 配置串口一配置寄存器,设置波特率为9600,关闭硬件流控,不使用校验位,数据长度为八字节 封装串口发送字节函数 封装串口发送字符串函数 封装串口发送数组函数 封装串口

    2024年01月23日
    浏览(45)
  • STM32实现DMA接收串口数据

    一..首先我们得配置DMA和USARAT,我们的原理是DMA1的通道5为USART1的RX引脚。  1.USART1的配置 2.DMA的配置 二.中断进行数据处理(stm32f10x_it.c) 我们可以串口打印出数组中的数据,验证DMA是否正常工作。可以到数据处理那个地方进行处理。USART1在初始化中就已经波特率为115200.我们可以

    2024年02月16日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包