STM32外设串口资源用完了怎么办--------串口模拟解决问题(再也不用多个STM32或其它MCU)

2023-05-16

之前做项目的时候遇到了一个问题,当把MCU本身的串口资源用完的时候,却还需要使用多几个串口,又不想使用几个MCU解决这个问题。那么模拟串口是解决这个问题的一种方法。


下图是我对串口通信时序图的个人理解:在这里插入图片描述


好对串口有了大致的了解后我们将理解的捋一下编写程序的思路去实现串口的通信:

1、 使能PA时钟。

RCC->RCC_APB2ENR|=1<<2;      //PA时钟使能

2、 我们是IO模拟的串口传输实验,所以要配置两个IO口。因为数据传输本质就是0和1的传输,所以我这里将PA5设置为推挽输出(0、1变换),PA6设置为上拉输入(高电平时停止状态,只有低电平才会触发数据传输)。

GPIOA->GPIO_CRL&=0xFF00FFFF;	//将要设置的位清零
GPIOA->GPIO_CRL|=0x00300000;   //PA5推挽输出
GPIOA->GPIO_CRL|=0X00080000;   //PA4输入模式
GPIOA->GPIO_ODR|=1<<5;			//PA5默认高电平
GPIOA->GPIO_ODR|=0x30;			//PA4上拉输入模式

3、 设置发送数据的波特率,例如我这里用的波特率是9600,那么节拍时间是104us,我编写的例程没用写太多的波特率对应节拍值。
我们可以写出一一对应的节拍值,如:

									  #define BuadRate1200	832		/* 波特率1200 */
									  #define BuadRate2400 	416		/* 波特率2400 */
									  #define BuadRate4800 	208		/* 波特率4800 */
									  #define BuadRate9600 	104		/* 波特率9600 */
													.
													.
												    .

4、 编写发送一个字节数据函数。(开始信号->节拍时间->第零位数据->节拍时间->第一位数据->节拍时间…第七位数据->节拍时间->停止位信号->节拍时间)。

void TX_Byte(u8 data)
{
	int i=0;	
	TX_Low();	//低电平,起始位
	delay_us(BuadRate);		//节拍时间
	for(i=0;i<8;i++)
	{
		if(data & 0x01)
		{
			TX_Hight();
		}
		else
		{
			TX_Low();
		}
		delay_us(BuadRate);	//每传一个数据就需要延迟一个脉冲
		data>>=1;			//是从最低位开始传输的
	}
	TX_Hight();	//高电平,停止位
	delay_us(BuadRate);
}

5、 编写发送一个字符串数据的函数。

void TX_String(u8 *str)
{
	while(*str!=0)
	{
	TX_Byte(*str);
	str++;
	}
}

6、 编写接收数据的函数;
① 一些说明:
接收数据和发送数据是同一个原理的,只不过我们不可能将接收数据放到while循环上面让它一直重复查询等待接收数据信号,不然整个MUC都为它服务了,其它事啥都不用干了。
那我们用什么来识别接收数据信号呢?我们可以使用中断来触发,当高电平信号跳变为低电平信号时中断就触发,接收数据就开始启动,这样就不会一直占用MCU的资源。
这里我还说一下,我接收数据还使用了定时器作为节拍时间,很多人有疑问,为什么要用定时器做节拍时间呢,不是已经有delay延时函数来做节拍时间了吗? 因为delay延时函数的原理是让MCU在那空运行,等于啥事也没干。而定时器时间精准、有条序的
启动、接收、结束,充分利用MCU资源。降低了MCU资源占用率(比起寄存器那是没法比的)。
我这里用图描述一下定时器工作:

在这里插入图片描述

② 中断初始化配置和定时器初始化配置(这里中断我就不多说明了,我上一篇博客有详细说明)
Ⅰ、 中断:

ex_nvic_config(0,4,1);		//设置连接中断总线,PA4,下降沿触发
NVIC_Init(2,2,10,2);		//EXTIX-PY.X

Ⅱ、 定时器:
在这里插入图片描述

RCC->RCC_APB1ENR|=1<<1;	//TIME3时钟使能
TIME3->TIME_PSC=psc;	//预分频器72,得到1Mhz的计数时钟	
TIME3->TIME_ARR=arr;	//设定计数器自动重装值//刚好1MHz TIME3->TIME_CR1&=~(1<<4);//计数器向上计数
TIME3->TIME_DIER|=1<<0;	//允许更新中断(开启中断)
TIME3->TIME_CR1&=~(1<<0);//禁用定时器
NVIC_Init(1,3,29,2);	//抢占1,子优先级3,组2	

③ 原理:
接收起始信号触发中断(打开定时器)->节拍时间(delay)->定时器打开开始计数->运行接收第0个数据位的程序->定时器计数值到达复位->定时器重新开始计数->运行接收第1个数据位的程序->定时器计数值到达复位…->定时器重新开始计数->运行接收第7个数据位的程序->定时器计数值到达复位->定时器重新开始计数->结束接收程序,停止定时器等待下一次数据的接收并将接收的一个字节数据保存定义好的缓冲区中->定时器计数值到达复位。

void EXTI4_IRQHandler(void)
{
   if( (EXTI->PR&(1<<4)) != 0 )     //中断事件发生,挂起寄存器置位
   {
     if(!(GPIOA->GPIO_IDR&(1<<4)))	 //下降沿低电平
     { 	
		if(receiverstate==STOP_BIT)
		{
			receiverstate = START_BIT;    //接收开始
			delay_us(BuadRate/2);		//因为这里跳转到定时器接收数据需要时间,所以节拍就不是BuadRate这个了	
			TIME3->TIME_CR1|=1<<0;		//定时器使能			
		}
     }
   }
	//清除中断挂起标志位,否则会被认为中断没有被处理而循环再次进入中断
	EXTI->PR|=1<<4;   // //清除LINE3上的中断标志位 
}

//定时器接收数据服务函数
void TIM3_IRQHandler(void)
{
	if(TIME3->TIME_SR&0x0001)	//溢出中断
	{
		TIME3->TIME_SR&=~(1<<0);  //清除中断标志
		receiverstate+=1;          //接收数据位往下移动   也就是到了数据位0 -> D0_BIT,
		if(receiverstate == STOP_BIT)  //如果是停止标志就关闭定时器接收
		{
			TIME3->TIME_CR1&=~(1<<0);	//禁用定时器
			USART_BUF[len_buf] = receiverdata;
			len_buf+=1;
			return;
		}
		if((GPIOA->GPIO_IDR&(1<<4)))  //如果是高电平
		{
			receiverdata |= (1<<(receiverstate-1));   //存放的是8位数据,要从第0位开始存储
		}
		else
		{
			receiverdata &= ~(1<<(receiverstate-1));	
		}
	}
	
}

串口调试窗口:
在这里插入图片描述

完整的程序:

TIME.h

/***************************************************************
著作人 	邓家文  广州大学华软软件学院   
文件名	:TIME.h
作者	   : 邓家文
版本	   : V1.0
描述	   : 基于中断与定时器的IO模拟驱动文件。
其他	   : 无
博客 	   : https://blog.csdn.net/morecrazylove?spm=1011.2124.3001.5343
日志	   : 初版V1.0 2021/7/12 邓家文创建
***************************************************************/
#ifndef __TIME_H
#define __TIME_H
#include "RCC.h"

#define TIME2_BASE 							(0x40000000)
#define TIME3_BASE							(0x40000400)
#define TIME4_BASE							(0x40000800)
#define TIME5_BASE							(0x40000C00)

typedef struct
{
	volatile unsigned int TIME_CR1;
	volatile unsigned int TIME_CR2;
	volatile unsigned int TIME_SMCR;
	volatile unsigned int TIME_DIER;
	volatile unsigned int TIME_SR;
	volatile unsigned int TIME_EGR;
	volatile unsigned int TIME_CCMR1;
	volatile unsigned int TIME_CCMR2;
	volatile unsigned int TIME_CCER;
	volatile unsigned int TIME_CNT;
	volatile unsigned int TIME_PSC;
	volatile unsigned int TIME_ARR;
	unsigned int SAVE1;
	volatile unsigned int TIME_CCR1;
	volatile unsigned int TIME_CCR2;
	volatile unsigned int TIME_CCR3;
	volatile unsigned int TIME_CCR4;
	unsigned int SAVE2;
	volatile unsigned int TIME_DCR;
	volatile unsigned int TMIE_DMAR;
}TIME_Type;

#define TIME2 				((TIME_Type*) TMIE2_BASE)
#define TIME3				((TIME_Type*) TIME3_BASE)
#define TIME4				((TIME_Type*) TMIE4_BASE)
#define TIME5				((TIME_Type*) TMIE5_BASE)

void TIME3_init(u16 arr,u16 psc);

#endif

TIME.c

#include "TIME.h"
#include "nvic.h"

//模拟串口初始化 TIME3   psc=71
void TIME3_init(u16 arr,u16 psc)
{
	RCC->RCC_APB1ENR|=1<<1;	//TIME3时钟使能
	TIME3->TIME_PSC=psc;	//预分频器72,得到1Mhz的计数时钟	
	TIME3->TIME_ARR=arr;	//设定计数器自动重装值//刚好1MHz
	TIME3->TIME_CR1&=~(1<<4);//计数器向上计数
	TIME3->TIME_DIER|=1<<0;	//允许更新中断(开启中断)
	TIME3->TIME_CR1&=~(1<<0);//禁用定时器
	NVIC_Init(1,3,29,2);	//抢占1,子优先级3,组2	
}

IO_SIMULATE_USART.h

IO_SIMULATE_USART.h
/***************************************************************
著作人 	邓家文  广州大学华软软件学院   
文件名	:IO_SIMULATE_USART.h
作者	   : 邓家文
版本	   : V1.0
描述	   : 定时器驱动文件。
其他	   : 无
博客 	   : https://blog.csdn.net/morecrazylove?spm=1011.2124.3001.5343
日志	   : 初版V1.0 2021/7/12 邓家文创建
***************************************************************/
#ifndef __IO_SIMULATE_USART_H
#define __IO_SIMULATE_USART_H
#include "RCC.h"
#include "gpio.h"
#include "delay.h"
#include "exti.h"

/* 用来表示数据接收的是哪一位了 */
enum{
	START_BIT,	//起始位
	D0_BIT,
	D1_BIT,
	D2_BIT,
	D3_BIT,
	D4_BIT,
	D5_BIT,
	D6_BIT,
	D7_BIT,
	STOP_BIT,		//停止位
};

void USART_IO_init(void);     //IO初始化配置
void TX_Byte(u8 data);		//一个字节发送
void TX_String(u8 *str);		//一个字符串发送

extern u8 USART_BUF[11];   //接收缓冲区
extern u8 len_buf;         //接收的数据长度

#endif

IO_SIMULATE_USART.c

#include "IO_SIMULATE_USART.h"
#include "TIME.h"

#define BuadRate		104          //设置波特率的

#define TX_Hight()		{GPIOA->GPIO_ODR|=1<<5;}			//PA5输出高电平
#define TX_Low()		{GPIOA->GPIO_ODR&=~(1<<5);}		//PA5输出低电平

u8 USART_BUF[11];   //接收缓冲区
u8 len_buf = 0;     //接收的数据长度
u8 receiverstate = STOP_BIT;  //定义状态机,检测第一次下降沿信号到来
u8 receiverdata = 0;          //接收的数据,这是一个字节8位的数据
	
void USART_IO_init(void)
{
	RCC->RCC_APB2ENR|=1<<2;      //PA时钟使能
	GPIOA->GPIO_CRL&=0xFF00FFFF;	//将要设置的位清零
	GPIOA->GPIO_CRL|=0x00300000;  //PA5推挽输出
	GPIOA->GPIO_CRL|=0X00080000;  //PA4输入模式
	GPIOA->GPIO_ODR|=1<<5;		//PA5默认高电平
	GPIOA->GPIO_ODR|=0x30;		//PA4上拉输入模式
	ex_nvic_config(0,4,1);		//设置连接中断总线,PA4,下降沿触发
	NVIC_Init(2,2,10,2);		//EXTIX-PY.X
}

/* 发送单字节数据 */
void TX_Byte(u8 data)
{
	int i=0;	
	TX_Low();	//低电平,起始位
	delay_us(BuadRate);		//节拍时间
	for(i=0;i<8;i++)
	{
		if(data & 0x01)
		{
			TX_Hight();
		}
		else
		{
			TX_Low();
		}
		delay_us(BuadRate);	//每传一个数据就需要延迟一个脉冲
		data>>=1;			//是从最低位开始传输的
	}
	TX_Hight();	//高电平,停止位
	delay_us(BuadRate);
}

/* 发送一个字符串数据 */
void TX_String(u8 *str)
{
	while(*str!=0)
	{
		TX_Byte(*str);
		str++;
	}
}

/* 中断服务函数,判断开始信号的 */
void EXTI4_IRQHandler(void)
{
   if( (EXTI->PR&(1<<4)) != 0 )     //中断事件发生,挂起寄存器置位
   {
     if(!(GPIOA->GPIO_IDR&(1<<4)))	 //下降沿低电平
     { 	
		if(receiverstate==STOP_BIT)
		{
			receiverstate = START_BIT;    //接收开始
			delay_us(BuadRate/2);		//因为这里跳转到定时器接收数据需要时间,所以节拍就不是BuadRate这个了	
			TIME3->TIME_CR1|=1<<0;		//定时器使能			
		}
     }
   }
	//清除中断挂起标志位,否则会被认为中断没有被处理而循环再次进入中断
	EXTI->PR|=1<<4;   // //清除LINE3上的中断标志位 
}

//定时器接收数据服务函数
void TIM3_IRQHandler(void)
{
	if(TIME3->TIME_SR&0x0001)	//溢出中断
	{
		TIME3->TIME_SR&=~(1<<0);  //清除中断标志
		receiverstate+=1;          //接收数据位往下移动   也就是到了数据位0 -> D0_BIT,
		if(receiverstate == STOP_BIT)  //如果是停止标志就关闭定时器接收
		{
			TIME3->TIME_CR1&=~(1<<0);	//禁用定时器
			USART_BUF[len_buf] = receiverdata;
			len_buf+=1;
			return;
		}
		if((GPIOA->GPIO_IDR&(1<<4)))  //如果是高电平
		{
			receiverdata |= (1<<(receiverstate-1));   //存放的是8位数据,要从第0位开始存储
		}
		else
		{
			receiverdata &= ~(1<<(receiverstate-1));	
		}
	}
	
}

test.c

/***************************************************************
著作人 	邓家文  广州大学华软软件学院
文件名	:test.c
作者	   : 邓家文
版本	   : V1.0
描述	   : 主函数
其他	   : 无
博客 	   : https://blog.csdn.net/morecrazylove?spm=1011.2124.3001.5343
日志	   : 初版V1.0 2021/7/12 邓家文创建
***************************************************************/
#include "gpio.h"
#include "clock.h"
#include "nvic.h"
#include "exti.h"
#include "key.h"
#include "beep.h"
#include "delay.h"
#include "IO_SIMULATE_USART.h"
#include "TIME.h"
	
int main(void)
{  
	RCC_Config(9);
	delay_init(72);
	exti_init();
	USART_IO_init();
	TIME3_init(104,71);  //1MHz , 9600=104us
	while(1)
	{
	
		if(len_buf>0)
		{
			TX_String(USART_BUF);
			len_buf = 0;
		}
	}
}

总结

谢谢大家的关注,希望给大家有所帮助。本人技术有限,写的哪里不好的地方大家多多包涵,欢迎大家提出问题,给予纠正。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32外设串口资源用完了怎么办--------串口模拟解决问题(再也不用多个STM32或其它MCU) 的相关文章

  • 柔性上肢康复机器人研究中的VR技术

    上肢康复机器人用于对脑卒中患者进行上肢康复治疗 xff0c 能够维持和扩大患者关节活动度 增强肌肉力和协调性 xff0c 以防止肌肉萎缩 关节痉挛等各类症状的出现 xff0c 最终重建肢体功能 xff0c 以便回归正常生活 现有的上肢康复机
  • 动作捕捉在动物神经与运动研究领域的应用

    对于由神经系统疾病引起的运动障碍的康复治疗方案 xff0c 需要预先进行动物实验 xff0c 利用结果分析病症机理 xff0c 并为制定治疗 康复方案提供实验依据 脊髓损伤是中枢神经损伤的一种 xff0c 它会引发运动功能部分或完全丧失 研
  • 工业机器人协作控制研究

    当前工业焊接大多由工业机器人完成 在弧焊焊接领域 xff0c 传统的由焊接机器人 43 变位机 43 工装夹具组成的焊接工作站已不能满足当前小批量 定制化的柔性自动化生产需求 而由多个机器人构成的协作焊接系统具有更强的作业能力 更大范围的工
  • 几种智能机器人室内定位方法对比

    近年来随着控制算法的研究进展 xff0c 无人机 无人车等智能机器人在各领域中发展迅速 研发人员在对智能机器人进行相关研究时 xff0c 通常需要完成室内环境下的模拟调试实验 xff0c 在这些实验中 xff0c 确定各智能体自身定位以及与
  • NOKOV度量动作捕捉用于多智能体协同系统等效验证实验

    现代战争中 xff0c 无人机 无人车及无人艇等无人系统已逐渐在战场部署 xff0c 但是无人系统单体存在负载和任务能力有限 作战能力单一等不足 为了弥补单体能力不足 xff0c 同时提高其对作战任务的适应能力 xff0c 无人系统可以以集
  • NOKOV度量动捕软件教程(2):系统标定

    1 确认场地中央已放置好 L 型标定杆 xff0c 并将场地内的其他反光标识点遮挡或移出场地 xff1b 2 可通过点击 XINGYING 软件界面右下方的 全开 按钮 xff0c 同时观察全部镜头 xff08 如图 1 xff09 xff
  • NOKOV度量动捕软件教程(3):数据采集

    1 采集数据前 xff0c 需确保软件已加载配置文件 xff0c 可通过 文件 加载标定文件 选项进行加载 xff0c 或者通过通过标定生成一个新的配置文件 xff1b 2 将被捕捉物贴好反光标识点 xff0c 放入场地内 图 1 3 在软
  • NOKOV度量动捕软件教程(4):创建刚体与markerset

    一 创建 Markerset xff08 刚体 xff09 1 XINGYING软件支持在实时下创建 Markerset 刚体 xff0c 需在场地内放置有已贴好反光标识点的刚体 xff0c 并且能在软件中的 3D 视图下看到每一个反光标识
  • NOKOV度量动捕软件教程(5):数据处理

    目录 一 导入数据 二 建立MarkerSet 三 调用已有的MarkerSet 四 数据修复 五 建立刚体 六 实时应用MarkerSet 一 导入数据 1 点击 XINGYING 软件界面右下角的 后处理模式 按钮 xff0c 进入后处
  • 大小端模式

    数据在内存中以字节形式存放 xff0c X86结构是小端模式 xff0c 而KEIL C51则为大端模式 很多的ARM xff0c DSP都为小端模式 有些ARM处理器还可以随时在程序中 在ARM Cortex 系列使用REV REV16
  • c语言中的__FILE__和__LINE__的作用

    这是编译器内置宏 xff0c 这些宏定义不仅可以帮助我们完成跨平台的源码编写 xff0c 灵活使用也可以巧妙地帮我们输出非常有用的调试信息 例如 xff1a printf 34 FILE d LINE d s n 34 34 FILE LI
  • NOKOV度量动捕软件教程(6):数据分析

    1 点击界面上方 窗口分割 2 个窗口 xff1a 上 下 选项 xff0c 让主界面分割为上下两个窗格 xff08 如图 xff09 xff0c 选中窗格时会有橙色边框 xff0c 此时点击 视图类型 xff0c 让其中一个窗口显示 3D
  • crazyswarm+crazyflie+NOKOV动捕飞控方案操作说明(3):通过VRPN协议对接

    一 crazyflie配置 1 查看 crazyflie 固件更新完毕后 xff0c 取下crazyflie xff0c 并连接电池 xff0c 把crazyradio接上电脑usb口 xff0c 运行以下命令 xff1a rosrun c
  • crazyswarm+crazyflie+NOKOV动捕飞控方案操作说明(4):SDK对接

    一 crazyswarm nokov 支持 1 更换libmotioncapture crazyswarm 支持nokov首先需要更换nokov专有libmotioncapture xff0c 进入路径 xff1a cd crazyswar
  • UE5与NOKOV度量动捕系统连接教程

    目录 一 动捕软件安装与数据准备 二 插件安装与 UE5 设置 一 xff09 插件安装 二 xff09 UE5 设置 xff08 实时播放模式 使用设备 xff1a 从仔动作捕捉套装 xff08 NOKOV度量 xff09 软件 xff1
  • Unity与NOKOV度量动捕系统连接教程

    目录 一 动捕软件安装与数据准备 二 插件安装与 Unity 设置 xff08 实时播放模式 xff09 三 插件安装与 Unity 设置 xff08 后处理下实时模式 xff09 使用设备 xff1a 从仔动作捕捉套装 xff08 NOK
  • MotionBuilder与NOKOV度量动捕系统连接教程

    目录 一 动捕软件安装 二 数据录制 导入与导出 xff08 一 xff09 创建 Markerset xff08 二 xff09 数据采集 xff08 三 xff09 数据导入 xff08 四 xff09 数据导出 三 插件安装与 Mot
  • NOKOV动作捕捉系统使多场协同无人机自主建造成为可能

    近年来 xff0c 工业机器人的兴起使得建造的效率和安全性得以提升 xff0c 但由于机器人由于大小与活动范围的限制 xff0c 在大型建筑上难以施展拳脚 上海同济大学建筑系的无人机自主建造小组 xff0c 正在进行以无人机取代工业机器人进
  • 多智能体系统集群协同控制实验平台详解与典型案例

    目录 一 机器人实验是智能体集群研究必要手段 二 动作捕捉系统解决智能体集群实验系统多个痛点 三 多智能体集群协同控制实验平台 1 Crazyswarm多无人机集群编队实验平台 2 Robotarium机器人平台 3 中科院自动化所智能集群
  • NOKOV度量动作捕捉协助完成无人机室内定位研究

    随着工业发展 技术进步 xff0c 无人机的使用在各行各业愈发普遍 xff0c 开始出现无人机飞行送外卖 智能无人机自主巡检等多方面应用 在这一过程中 xff0c 无人机飞行定位就成为了重中之重 西北工业大学无人机特种技术国防科技重点实验室

随机推荐

  • 光学动作捕捉系统构成

    一套光学动作捕捉系统由红外动作捕捉镜头 动作捕捉软件 反光标识点 POE交换机 和若干配件组成 xff08 如标定框和镜头固定装置等 xff09 其本质是定位系统 xff0c 通过计算分析 xff0c 来获取与其相关的速度 加速度等多种运动
  • vscode命令行起本地服务,可发送http请求

    在我们vscode中默认打开的是file协议 xff0c 但是往往我们会有ajax等请求 xff0c 需要发送http等其他协议 xff0c 所以我们需要搭起本地服务器 xff1a 1 xff1a cd 进去到文件位置 xff0c 运行 n
  • 动作捕捉用于仿生机器人的运动规划

    随着机器人 三维动画 虚拟现实等产业的发展 xff0c 关于仿生机器人的动作研究早已成为重要的热点课题 如何让机器人或虚拟人物做出合理 流畅的姿态呢 xff1f 这就要涉及到逆运动学算法研究 人体很复杂 xff0c 传统算法需优化 由于人体
  • 智能化人机协作 遮挡情况下准确识别目标信息

    研究背景 废旧产品 xff08 end of life products xff09 的拆卸是工程全生命周期管理的一个基本步骤 在减少资源消耗和温室气体排放的同时 xff0c 回收可重复使用的部件可能创造相当的经济价值 xff0c 同时也能
  • 线下·香港 | 工业大数据与智能系统前沿会议

    由香港理工大学主办的工业大数据与智能系统前沿会议将于2023年4月28日至5月1日在香港举行 届时来自海外 内地及香港的知名科学家将聚首 xff0c 将围绕大会主题 面向人机共融的工业转型 发表演讲 xff0c 分享他们的独到见解并探讨最新
  • 人机耦合模型研究及其在下肢外骨骼机器人设计中的应用

    在外骨骼研究中 xff0c 一个合适的人机耦合模型非常重要 xff0c 它可以帮助预测外骨骼系统直接作用于人体产生的影响 xff0c 避免不必要的伤害和能量损失 xff0c 同时也有助于优化外骨骼系统的设计和控制 xff0c 提高其佩戴的舒
  • STM32】 DMA原理,步骤超细详解,一文看懂DMA

    如需转载请注明地址 xff1a https blog csdn net as480133937 article details 104927922 DMA的基本介绍 什么是DMA DMA的基本定义 DMA xff0c 全称Direct Me
  • float类型数据在报文中的传输方法

    方法1 xff1a 转化成整型传输 假如保留float类型数据为两位小数 xff0c 我们可以将float数据 100 转换成整型数据传输 xff0c 对端收到后 xff0c 再 100 xff0c 转换成float类型 方法2 xff1a
  • 101、104规约解析

    转载 xff1a 电网101 104规约解析 xff08 Java xff09 张二狗和苗翠花的博客 CSDN博客 iec101 java 1 前言 最近在研究广东电网的101与104规约 xff0c 也就是DL T634 5101 200
  • Ubuntu:Python多版本切换。

    使用 update alternatives更改系统Python版本 1 查看可选版本 sudo update alternatives list python 如果提示 xff1a update alternatives error no
  • ROS(melodic)安装问题汇总及解决方法

    终于装上了ROS xff0c 费了很大的波折 xff0c 基本上能遇到的问题都遇到了 xff0c 记在这里希望能给遇到同样问题的朋友一点参考 首先是在虚拟机上装ubuntu 18 04 xff0c 这个没什么问题 xff0c 所用的镜像文件
  • Http请求出现invalid http response问题的原因分析

    发生场景 xff1a A系统发送Http请求调用B系统提供的接口 xff1b 发生问题 xff1a A系统报错 xff0c 提示 invalid http response 错误信息 xff1b 问题分析 xff1a 根据翻译 xff0c
  • STM32利用CUBEMX建立自定义HID工程,并且完成64字节的IN,OUT传输功能。

    STM32 Customed HID开发流程 本文介绍的是STM32的cubeMX自定义HID的开发流程 cubeMX配置customed HID模式 更多详细配置壳查看代码CubeMX的配置文件 修改usbd custome hid if
  • STM32 uart 单线半双工模式(cube版本)

    STM32 uart 单线半双工模式 xff08 cube版本 xff09 1 引言 在某些场合下需要进行三线制串口通信 xff08 信号线只有一根 xff09 xff0c 这就要求进行单线半双工的模式进行通信 在这种情况进行数据协议传输的
  • AS5600磁编码器开发记录

    AS5600使用简介 xff08 程序员版 xff09 本文由 智御电子 提供 xff0c 同时提供范例教程 xff0c 以便电子爱好者交流学习 前言 xff1a 最近由于工作需要接触到AS5600这颗磁角度传感器 xff0c 以前就对相关
  • STM32 硬件UART接收超时检测设置

    STM32 硬件UART接收超时检测设置 本文作者 智御电子 xff0c 期待与电子爱好者交流学习 应用场景 在uart应用中有时候需要进行双工通信 xff0c 主机需要对从机的数据进行接收超时检测 xff0c 例如modbus协议 xff
  • 发送GET请求 示例

    发送GET请求 64 param url 请求地址 64 param param 请求参数 64 param headers 64 return private String requestByGet String url Map lt S
  • STL不同容器的优缺点

    一 容器的分类 1 序列容器 xff08 1 xff09 vector 典型的序列容器 xff0c 任意元素的读取 修改具有O 1 xff0c 在序列尾部进行插入 删除是O 1 xff0c 但在序列的头部插入 删除的时间复杂度是O n xf
  • c语言(数组)

    交换算法 xff08 将最小值换到第一位 xff0c 最大值换到最后一位 xff09 include lt stdio h gt void main int o 61 0 int buf 10 接收用户输入的数组 for o lt 10 o
  • STM32外设串口资源用完了怎么办--------串口模拟解决问题(再也不用多个STM32或其它MCU)

    之前做项目的时候遇到了一个问题 xff0c 当把MCU本身的串口资源用完的时候 xff0c 却还需要使用多几个串口 xff0c 又不想使用几个MCU解决这个问题 那么模拟串口是解决这个问题的一种方法 下图是我对串口通信时序图的个人理解 xf