STM32复习(四)--- RS485串口通讯

STM32RS485通信 阅读详情
AI摘要

本文围绕STM32的RS485串口通讯展开。先介绍RS485通讯协议,其具有差分信号传输、多点通信、长距离传输等特点,还对比了与RS - 232的特性。接着阐述RS485通讯实验,采用土壤传感器、RS485转TTL模块等实现,包括实验原理、编程思想、接线图和程序代码,最后提及串口助手显示。

一、RS485通讯协议简介

        RS485(也称为 EIA-485 或 TIA-485)是一种常用于工业和通信领域的串行通信标准。它定义了一个电气特性规范,用于在多点网络中进行数据传输,特别适用于需要长距离、高速传输和抗干扰的应用场景。RS485标准常用于工业自动化、传感器、智能仪表等系统中。

特点:

        1.差分信号传输

        RS485使用差分信号进行数据传输。它由两根信号线(A和B)组成:

  • A线(+) 和 B线(-) 之间的电压差传输数据。
  • 当电流在这两根线之间的方向发生变化时,接收端会读取这种变化并解码为数据位。

        相比单端信号,差分信号对噪声的抗干扰能力更强,因为噪声通常影响两条线的相同程度,因此它们之间的电压差不会受到噪声的显著影响。

        2.多点通信
        RS485支持多达32个设备(发送器和接收器总和)连接在同一总线上。这使得它非常适合于多节点的网络应用。

        3.长距离传输
        RS485的通信距离可以达到1200米(约4000英尺),这取决于传输速率和电缆质量。在低速率下(如9600bps),可以实现更长的传输距离。

        4.高传输速率
        RS485支持较高的传输速率(如10 Mbps),尽管速度和距离通常是相互制约的。

         5.抗干扰能力强
        由于使用差分信号,RS485能在电磁干扰(EMI)较强的环境下稳定工作,因此常用于工厂、自动化设备和恶劣环境下的通信。

RS-485与RS-232通讯协议的特性对比:  

通讯标准信号线通讯方向电平标准通讯距离通讯节点数
RS232TXD,RXD,GND全双工

逻辑1:+3V ~ +15V

逻辑0:-15V ~ -3V

100米以内只有两个节点
RS485差分线AB半双工

逻辑1:+2V ~ +6V

逻辑0:-6V ~ -2V

1200米支持多个节点,支持多个主设备,任意节点间可以相互通讯

差分信号线具有很强的干扰能力,特别适合应用于电磁环境复杂的工业控制环境中,RS-485协议主要是把RS-232的信号改进成差分信号,从而大大提高了抗干扰特性

二、 RS485通讯实验

 本实验我们采用土壤传感器,RS485转TTL模块以及STM32F103C8T6最小系统板来实现。

1.土壤传感器

以下是土壤传感器的部分参数:

这个协议内容用到了ModBus-Rtu,感兴趣的小伙伴可以看一下这个https://blog.youkuaiyun.com/as480133937/article/details/123197782

2.RS485转TTL模块

实验原理:
485通讯实质上就是软件层的串口通讯,再加上物理层上的485芯片,将TTL信号转化为差分信号进行传输,对待上就按照串口通讯就行。
编程思想:
DE: 1 发送使能;0发送禁止
RE: 0 接收使能;1接收禁止

一般将DE和RE连在一起,这样就是高电平发送,低电平接收

通过单片机串口2的TXD(PA2)将数据发送出去,RXD(PA3)进行接收数据,然后通过串口1打印接收到的数据 。

由于是通过485协议发送数据,每次发送前要对485传输方式设置为发送模式,完成后要改为接收模式,由于是半双工,发送完要有一定的延时,确保数据不会丢失;

 3.接线图

4、程序代码

Usart.h

#ifndef __USART_H__
#define __USART_H__

extern uint8_t Serial_TxPacket[];
extern uint8_t Serial_RxPacket[];

void my_Usart_Init2(void);
void my_Usart_Init(void);
void My_Usart_Send_Byte(USART_TypeDef* USARTx, uint16_t Data);  //发送一个字节
void My_Usart_SendArray(uint8_t *Array,uint16_t Length);  //发送一个数组(用串口2)
void My_Usart_SendArray2(uint8_t *Array,uint16_t Length); //发送一个数组(用串口1)
void My_Usart_Send_String(USART_TypeDef* USARTx, char * str); //发送字符串
uint8_t Serial_GetRxFlag(void);  //实现读后自动清除的功能

#endif

Usart.c

#include "stm32f10x.h"
#include "Usart.h"
#include "stdio.h"
#include "RS485.h"

uint8_t Serial_TxPacket[8];
uint8_t Serial_RxPacket[12];
uint8_t Serial_RxFlag;

void my_Usart_Init2(void)   //初始化串口2
{
  GPIO_InitTypeDef gpio_initstruct;
	USART_InitTypeDef usart_initstruct;
	NVIC_InitTypeDef nvic_initstruct;
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
	
//Tx  PA2
	gpio_initstruct.GPIO_Mode  = GPIO_Mode_AF_PP;//发送数据固定为复用推挽输出
	gpio_initstruct.GPIO_Pin   = GPIO_Pin_2;
	gpio_initstruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&gpio_initstruct);
//Rx  PA3	
	gpio_initstruct.GPIO_Mode = GPIO_Mode_IPU;//接收数据为浮空输入或上拉输入
	gpio_initstruct.GPIO_Pin  = GPIO_Pin_3;
	GPIO_Init(GPIOA,&gpio_initstruct);
	
	usart_initstruct.USART_BaudRate = 9600;
	usart_initstruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//不使用流控
	usart_initstruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
	usart_initstruct.USART_Parity = USART_Parity_No;//不使用校验位
	usart_initstruct.USART_StopBits = USART_StopBits_1;//一位停止位
	usart_initstruct.USART_WordLength = USART_WordLength_8b;//因为不使用校验位所以字节长度为八个
	USART_Init(USART2,&usart_initstruct);
	
	
	USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);
	
	nvic_initstruct.NVIC_IRQChannel = USART2_IRQn;
	nvic_initstruct.NVIC_IRQChannelPreemptionPriority = 2;
	nvic_initstruct.NVIC_IRQChannelSubPriority = 2;
	nvic_initstruct.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&nvic_initstruct);
	
	USART_Cmd(USART2,ENABLE);//一定记得配置完后使能USART2外设
}


void my_Usart_Init(void)    //初始化串口1
{
	GPIO_InitTypeDef gpio_initstruct;
	USART_InitTypeDef usart_initstruct;
	NVIC_InitTypeDef nvic_initstruct;
		
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1,ENABLE);
	
	
//Tx  PA9
	gpio_initstruct.GPIO_Mode  = GPIO_Mode_AF_PP;//发送数据固定为复用推挽输出
	gpio_initstruct.GPIO_Pin   = GPIO_Pin_9;
	gpio_initstruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&gpio_initstruct);
//Rx  PA10	
	gpio_initstruct.GPIO_Mode = GPIO_Mode_IPU;//接收数据为浮空输入或上拉输入
	gpio_initstruct.GPIO_Pin  = GPIO_Pin_10;
	gpio_initstruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&gpio_initstruct);
	
	usart_initstruct.USART_BaudRate = 115200;
	usart_initstruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//不使用流控
	usart_initstruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
	usart_initstruct.USART_Parity = USART_Parity_No;//不使用校验位
	usart_initstruct.USART_StopBits = USART_StopBits_1;//一位停止位
	usart_initstruct.USART_WordLength = USART_WordLength_8b;//因为不使用校验位所以字节长度为八个
	USART_Init(USART1,&usart_initstruct);
	
	USART_Cmd(USART1,ENABLE);//一定记得配置完后使能USART1外设
	USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
	
	nvic_initstruct.NVIC_IRQChannel = USART1_IRQn;
	nvic_initstruct.NVIC_IRQChannelPreemptionPriority = 1;
	nvic_initstruct.NVIC_IRQChannelSubPriority = 1;
	nvic_initstruct.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&nvic_initstruct);
	
}

//发送一个字节
void My_Usart_Send_Byte(USART_TypeDef* USARTx, uint16_t Data)
{
  USART_SendData(USARTx, Data);
	while(USART_GetFlagStatus(USARTx,USART_FLAG_TXE) == RESET);//‘发送数据寄存器空’等于0,即说明寄存器中还有数据,因此需要留在while循环中

}
//发送一个数组
void My_Usart_SendArray(uint8_t *Array,uint16_t Length)
{
	uint16_t i;
	for(i=0;i<Length;i++)
	{
		My_Usart_Send_Byte(USART2,Array[i]);
	}
}
//发送一个数组
void My_Usart_SendArray2(uint8_t *Array,uint16_t Length)
{
	uint16_t i;
	for(i=0;i<Length;i++)
	{
		My_Usart_Send_Byte(USART1,Array[i]);
	}
}
//发送一个字符串
void My_Usart_Send_String(USART_TypeDef* USARTx, char * str)
{
	uint16_t i=0;
	do
	{
		
		My_Usart_Send_Byte(USARTx,*(str+i));//逐个字符发送
		i++;
	
	}while(*(str+i) != '\0');// 直到遇到字符串结束符
	while(USART_GetFlagStatus(USARTx,USART_FLAG_TC) == RESET);

}

uint8_t Serial_GetRxFlag(void)//实现读后自动清除的功能
{
	if(Serial_RxFlag == 1)
	{
		Serial_RxFlag=0;
		return 1;
	}
	return 0;
}

int fputc(int ch,FILE*f)//对printf函数重定向
{
	My_Usart_Send_Byte(USART1,ch);
	return ch;
}

void USART1_IRQHandler(void)//中断函数名称看开始文件
{
	if(USART_GetITStatus(USART1,USART_IT_RXNE) == SET)
	{

		USART_ClearITPendingBit(USART1,USART_IT_RXNE);//清除标志位,如果读取DR是可以自动清除的
	}
}

void USART2_IRQHandler()
{
	if(USART_GetITStatus(USART2,USART_IT_RXNE) == SET)
	{
		static uint8_t RxState = 0;
		static uint8_t pRxState = 0;
		
		uint8_t RxData = USART_ReceiveData(USART2);
		
		if(RxState == 0)
		{
			if(RxData==0x01) //如果地址是0x01再接收其他返回的数据并存在Serial_RxPacket数组里
			{
				RxState=1;
				pRxState=0;
			}
		}
		else if(RxState == 1)
		{
			Serial_RxPacket[pRxState]=RxData;
			
			pRxState ++;
			
			if(pRxState>=12)
			{
					RxState=0;
					Serial_RxFlag=1;
			}
		}

		USART_ClearITPendingBit(USART2,USART_IT_RXNE);//清除标志位,如果读取DR是可以自动清除的
	}
}

这样我们就把发送接收数据的串口2和打印数据的串口1配置好了,接下来配置控制RS485发送还是接收的PA7

RS485.h

#ifndef __RS485_H__
#define __RS485_H__

void RS485_Init(void);

#endif

RS485.c

#include "stm32f10x.h"
#include "RS485.h"

void RS485_Init(void)
{
	GPIO_InitTypeDef gpio_initstruct;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	
	gpio_initstruct.GPIO_Mode  = GPIO_Mode_Out_PP;
	gpio_initstruct.GPIO_Pin   = GPIO_Pin_7;       
	gpio_initstruct.GPIO_Speed = GPIO_Speed_50MHz;
	
	GPIO_Init(GPIOA,&gpio_initstruct);

}

main.c

#include "stm32f10x.h" // Device header
#include "stdio.h"
#include "dht11.h"
#include "delay.h"
#include "Usart.h"
#include "RS485.h"
#include "relay.h"
#include "OLED.h"

int main(void)
{
	
	Relay_Init();
	my_Usart_Init();
	my_Usart_Init2();
	RS485_Init();
	
	Serial_TxPacket[0]=0x01;
	Serial_TxPacket[1]=0x03;
	Serial_TxPacket[2]=0x00;
	Serial_TxPacket[3]=0x00;
	Serial_TxPacket[4]=0x00;
	Serial_TxPacket[5]=0x04;
	Serial_TxPacket[6]=0x44;
	Serial_TxPacket[7]=0x09;
	
	
	u8 tem1=0;
	u8 hum1=0;
	
	float temp=0;
	float humi=0;
	 u16  EC=0;
	float PH=0;
	
	
	while(1)
	{
		delay_s(5); //5s采集一次数据
		GPIO_SetBits(GPIOA,GPIO_Pin_7); //给高电平,设置为发送模式
		My_Usart_SendArray(Serial_TxPacket,8); //将询问帧发给土壤传感器
		delay_ms(1); //发送完延时1ms保证数据不会丢失
		GPIO_ResetBits(GPIOA,GPIO_Pin_7); //给低电平,设置为接收模式,接收土壤传感器返回的数据
		if(Serial_GetRxFlag() == 1) //如果返回的数据满足中断函数的要求将会返回1
		{
			temp  = ((float)(Serial_RxPacket[4]*256 + Serial_RxPacket[5]))/10.0;
			humi  = ((float)(Serial_RxPacket[2]*256 + Serial_RxPacket[3]))/10.0;
			 EC   = Serial_RxPacket[6]*256 + Serial_RxPacket[7];
			 PH   = ((float)(Serial_RxPacket[8]*256 + Serial_RxPacket[9]))/10.0;
			printf("\r\ntemp: %.1f \r\nhumi: %.1f \r\nEC: %d \r\nPH: %.1f \r\n",temp,humi,EC,PH);
			
		} //打印收到的各个数据
		
            
            if(humi <= 30)
			{
				GPIO_ResetBits(GPIOA,GPIO_Pin_0);
			}
			else
			{
				GPIO_SetBits(GPIOA,GPIO_Pin_0);
			}
		
		//这个后续可以加一个继电器来控制水泵的开关,如果湿度过低就打开水泵,这里就先不加了
		
		
		
	}
}

三、串口助手显示 

这个Airtemp和Airhumi是我测试的空气温度和湿度,可以不看

在STM32上实现RS485通信 在STM32上实现RS485通信,需要连接USART外设的TX和RX引脚到RS485芯片的A和B线,并连接DE/RE引脚到RS485芯片的控制引脚。在RS485通信中,数据传输使用某种规定的通信协议,如Modbus等。通过合理配置USART外设和GPIO引脚,并结合相应的通信协议,可以实现稳定可靠的RS485通信,并与外部设备进行数据交换和控制。本文将介绍如何在STM32上实现RS485通信,包括硬件连接、串口配置和通信协议,并给出相应的代码示例。☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。 阅读详情

相关推荐

STM32开发(六)STM32F103 通信 —— RS485 Modbus通信编程详解

本实验基于STM32F103开发,实现 通过RS-485实现Modbus通信。Modbus是主从方式通讯,不能同步进行通信,总线上每次只有一个数据进行传输。主机发送,从机应答,主机不发送,总线上就没有数据通讯。MODBUS 协议允许在各种网络体系结构内进行简单通信。

weixin_43564241的博客 5万+

【正点原子STM32】RS485串行通信标准(串口基础协议 和 MODBUS协议、总线连接、通信电路、通信波形图、RS485相关HAL库驱动、RS485配置步骤、)

RS485是一种串行通信标准,它利用差分信号对(通常是一对非绝缘的导线A和B)来传输数据,由于其差分信号的性质,使得它具有很强的抗共模干扰能力,特别适用于工业控制环境,能够确保在长距离、复杂电磁环境下稳定通信。:是一种全双工、差分传输的串行通信标准,它具有较高的抗干扰能力和较长的传输距离,支持多点传输,每个信号都有明确的方向(发送和接收分离),常用于工业控制领域。:是一种逻辑电平标准,通常在集成电路内部或者集成电路之间近距离通信时使用,它的高低电平相对较低,通常为3.3V或5V表示逻辑1,0V表示逻辑0。

咖喱年糕的博客 3万+

计算机控制系统实践:从STM32到Python上位机的闭环监控平台

从传感器数据采集到上位机实时监控,计算机控制系统在工业现场与实验室中扮演关键角色。系统通过下位机(如STM32)执行定时采样、滤波与PID闭环控制,依靠RS485/串口协议与MQTT网关实现数据可靠传输。上位机可选用PyQt桌面端或Web仪表盘,以满足本地调参与远程监控的不同需求。针对温度控制等典型场景,正确设计通讯帧格式、处理线程安全、调校PID参数是工程落地的关键。这套可运行的计算机控制系统,完整覆盖了硬件选型、固件逻辑、协议设计、部署流程与常见问题排查,为嵌入式与物联网开发提供参考。

weixin_29194817的博客 221

STM32的485

无

qq_45578181的博客 5941

linux 内核vxlan收发包流程

1.vxlan口收包处理流程 前面几章详细介绍了vxlan接口的使用,而且已经知道vxlan是 MAC IN UDP中的封装,因此,在解封装之前,一切按照原有流程走,在此复习一下内核收发包流程(驱动层的数据处理这次不再解析,直接从__netif_receive_skb_core开始) #物理网卡处理中断,触发softirq i40e_intr └─napi_schedule_irqoff #i40e softirq把包放到per cpu backlog,触发softirq i40e_napi_p

魏言华的博客 3826

图解5G HARQ-ACK反馈:从DCI解析到PUCCH发送的完整数据流

本文详细解析了5G通信系统中HARQ-ACK反馈机制的完整流程,从DCI解码到PUCCH发送的实战指南。重点介绍了HARQ-ACK码本生成、DCI关键参数解读以及PUCCH资源映射等核心技术环节,帮助工程师深入理解5G NR中的数据传输可靠性保障机制。

weixin_27722377的博客 396

STM中USART串口通讯:RS232,RS485

作为单片机开发,经常使用的协议,进行程序的正确性的测试使用。但其实I2C,SPI(串行通信使用最多)在各个器件中使用最多,后面再复习。8位,16位并行通讯也使用多。USART使用也多,蓝牙转串口,wifi转串口这2个模块就是使用USART口实现的,你只需要配置好波特率,分频等一些参数。再使用数据缓存寄存器接收发送就可以使用这2个模块了。(但是这2个模块前提是集成了程序例如:我使用过的蓝牙转串口,用

入山砍柴郎 3236

FANUC机器人PROFINET通讯方式组态

6 然后对模块进行命名及更改IP地址,点击“Network Detection”,进行扫描,会生成下图,双击商科模块会生成下边的对话框,对模块进行命名及更改IP地址,在“Permanent Name”处点对勾,完成后点击“Apply Name及Apply”进行命名。此处注意,上图左上在线在不了,网络扫描处上面也灰色的,扫描不了。5双击abcc-prt-2-port RT(FW1.13),生成下面图标,在右边点击1、2把原来内容删掉,从新在左侧加载 ,使1、2是输出,3、4为输入,完成后点击OK。

dxs93的博客 8429

STM32 基于串口RS485双机通信原理浅析

RS485通信想必大家都知道,在学习RS232时,都会拿485(RS485下文就用485代替)和其作对比。485优缺点不说,网上有 我用的是STM32库函数学的485通信,所以接下来就讲讲STM32串口实现485双机通信的原理:       485和232都是基于串口的通讯接口,在数据的收发操作上都是一致的。但是他两的通讯模式却大不相同~!232是全双工(例:A->B的同时B->A,瞬时同步)工作模

cyb519的博客 2164

EtherCAT应用层协议选型指南:CoE、SoE、EoE、FoE、AoE到底怎么选?看完这篇就懂了

本文深入解析EtherCAT应用层协议(CoE、SoE、EoE、FoE、AoE)的选型策略,从实时性、数据吞吐量和功能完整性三大核心指标出发,提供工业场景下的实战决策框架。通过技术特性对比、混合协议架构设计和常见故障规避指南,帮助工程师优化自动化设备通信性能。

weixin_28718793的博客 493

SerDes电路的PCB仿真设计规则及策略

SerDes的PCB设计中,重点工作是使用3D 电磁 (EM) 场求解器,进行过孔结构优化,包括 BGA的扇入和扇出区域以及布线的过孔区域,并且,利用连接器供应商提供加密的 3D 模型,进行连接器和 PCB 的级联仿真,最终获取系统级的通道性能参数,如插入损耗、回波损耗、串扰和模式转换、阻抗曲线等,如果发现任何缺陷,再进行进一步优化,这一过程中,推荐进行拆分仿真,以提高设计效率。

一只豌豆象的博客 2192

STM32快速复习(六)USART串口

USART:TX(Transmit Exchange)数据发送脚、RX(Receive Exchange)数据接收脚。

DianZeF的博客 2277

Android SystemUI——车载CarSystemUI加载(八)

车载 CarSystemUI 是指专门为汽车环境设计的用户界面和用户体验(UI/UX),它通常与 Android Automotive OS 或其他嵌入式操作系统一起工作,为驾驶者和乘客提供安全、直观且高效的交互方式。Android Automotive OS 是 Google 专门为汽车开发的操作系统版本,它基于 Android 平台,并针对车辆内部的使用进行了优化。

小旭的专栏 2174

STM32串口实现485双机通信原理

RS485通信想必大家都知道,在学习RS232时,都会拿485(RS485下文就用485代替)和其作对比。485优缺点不说,网上有。 我用的是STM32库函数学的485通信,所以接下来就讲讲STM32串口实现485双机通信的原理: 485和232都是基于串口的通讯接口,在数据的收发操作上都是一致的。但是他两的通讯模式却大不相同~!232是全双工(例:A->B的同时B->A,瞬时同步

JH17369320302的博客 8135

《MATLAB项目实战》,专栏目录和介绍

MATLAB 是一款强大且广泛应用的数值计算和数据可视化软件工具,它提供了一个高效、简洁的编程环境,使用户能够进行从简单的矩阵运算到复杂的多维数据分析的各种计算任务。无论是在人工智能、计算机视觉、图像处理还是其他领域,MATLAB 都能够提供精准、快速的解决方案,因此成为了全球科研人员、工程师以及数据分析师的得力工具。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 6478

RS485去接收TTL电平的串口数据,真的可行吗?...

当人家叫我把RS485接口直接接到TTL串口上时,一开始我是拒绝的。但是,看到对方坚定不移的眼神,我抱着试试看的态度(反正打坏了也不是我的板子)还是接上去了。我了个趣,还真收到数据了。 一、问题来源: 这事情发生在某个1+x的嵌入式考证培训中,但是具体是什么原理,对方老师也没很明白的给我们分析,只是告诉我们开发板的厂家工程师推荐这么去监听数据的。 就是上面这张图,用了一个无源的“232转485”模块的485端口,去对接STM32板子上的UART1-TTL串口。当然,数据通讯的场...

kimiyang123的专栏 1万+

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

.net thread操作串口_一文解析STM32串口实现485双机通信原理

RS485通信想必大家都知道,在学习RS232时,都会拿485(RS485下文就用485代替)和其作对比。我用的是STM32库函数学的485通信,所以接下来就讲讲STM32串口实现485双机通信的原理。485和232都是基于串口的通讯接口,在数据的收发操作上都是一致的。但是他两的通讯模式却大不相同~!232是全双工(例:A->B的同时B->A,瞬时同步)工作模式,而485是半双工(发...

weixin_28867883的博客 415

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

【STM32】485接口原理

本文详细介绍了RS485通信的原理与应用,对比分析了RS485与RS232的主要差异。RS485采用差分传输、半双工通信方式,具有传输距离远(1200米)、抗干扰强、支持多点通信(最多400个节点)等优势。文章重点讲解了RS485的硬件连接要点,包括总线拓扑结构、终端匹配电阻(120Ω)配置、SP3485收发器使用方法等,并提供了STM32控制DE/RE引脚的编程实现。最后指出RS485特别适合工业控制、智能电网等长距离、多设备的通信场景,并为开发者提供了实用的调试建议和硬件连接注意事项。

猫猫的小茶馆 2222

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

485通信原理_一文解析STM32串口实现485双机通信原理

RS485通信想必大家都知道,在学习RS232时,都会拿485(RS485下文就用485代替)和其作对比。我用的是STM32库函数学的485通信,所以接下来就讲讲STM32串口实现485双机通信的原理。485和232都是基于串口的通讯接口,在数据的收发操作上都是一致的。但是他两的通讯模式却大不相同~!232是全双工(例:A->B的同时B->A,瞬时同步)工作模式,而485是半双工(发...

weixin_39573981的博客 1812

STM32学习进阶~总贴

目录 分享库!!! 梳理STM32F429之通信传输部分包含以下内容: 再造STM32汇总贴包含以下内容: STM32从入门到精通包含以下内容: 分享库!!! 分享!史上最容易入手的STM51库.... 分享!史上最容易入手的STM32库.... 分享!史上最全的STM32库.... 备战电赛---赛前:准备篇 梳理STM32F429之通信传输部分包含以下内容: 1、梳理ST...

sumjess 2071

rs485接收中断函数使能_好书推荐:精通STM32F4-库函数版本

本书由浅入深,带领读者学习STM32F407的各个功能。本书总共分为3篇:第一篇为硬件篇,主要介绍本书的实验平台;第二篇为软件篇,主要介绍STM32F4常用开发软件的使用以及一些下载调试的技巧,并详细介绍几个常用的系统文件(程序);第三篇为实战篇,通过41个实例带领读者一步步深入了解STM32F4。本书可配套ALIENTEK 探索者STM32F4开发板学习使用,配套资料里面包含详细原理图以及所有...

weixin_42330839的博客 145

03原理图:接口、无线、电机、STM32主控、整体模块化设计总结

在一个通信系统中,信号源和接收端的阻抗一般都是确定的,我们要做的就是找一根阻抗和它们相等的走线,把它们连接起来,否则的话阻抗不匹配就会产生反射,影响信号质量。新手入门高速PCB?先搞清楚什么是阻抗匹配。_哔哩哔哩_bilibili本节课核心思想提炼如下:无论是硬件设计还是软件设计,一定要注意模块化的设计。比如将大的系统设计在原理图栏分成一个一个模块的原理图纸,而不是一整页原理图。比如将一个大的系统设计提供一个原理图设计总览,可以一目了然的看清各个模块之间的联系。

小醒爱硬件的博客 5399

嵌入式面试通讯协议高频考点:UART、I2C、SPI、CAN与RS485实战解析

通讯协议是嵌入式系统设计的基础,也是工程师面试中的核心考察点。无论是UART的异步帧格式、RS485的差分传输与收发切换,还是I2C的时序与仲裁、SPI的四种模式,以及CAN的多主优先级机制,都决定了数据通路的可靠性与实时性。掌握这些协议的原理与工程实践,不仅能应对通讯协议选型、Modbus报文格式、CRC16校验等高频面试题,还能帮助开发者在实际项目中快速定位并解决通信异常问题。本文从协议概念出发,梳理物理层特性、帧结构、仲裁机制等关键知识点,并结合环形缓冲、超时重传等工程实践,系统呈现嵌入式开发中最常考

weixin_29191761的博客 276

STM32省IO设计:旋转开关编码与Modbus浮点传输实战

在嵌入式开发中,IO资源紧张与通信数据解析往往是工程师面临的两大核心挑战。当GPIO引脚不足以直接连接多个开关时,通过二进制编码方式,仅用两路IO即可识别四档旋转开关状态,这种IO扩展思路在按键扫描、拨码开关等场景中同样适用。同时,工业控制领域广泛使用的Modbus RTU协议以16位寄存器为单位,传输32位浮点数据时必然涉及字节序处理。IEEE 754标准规定了单精度浮点的存储格式,但在不同平台和协议约定下,存在ABCD、BADC、CDAB、DCBA等多种排列组合,字节序不一致会导致数据解析为天价或负值。

weixin_34284188的博客 402
上一篇: STM32复习(三)--- DHT11读取温湿度数据并显示在串口助手上
do_while__
博客等级 码龄4年 27粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值