济南市网站建设_网站建设公司_页面加载速度_seo优化
2026/1/7 22:10:24 网站建设 项目流程

通信概念

电信号传输方式

在数据的传输过程中主要是通过电信号进行传输的,电信号通过物理介质(如导线、光纤、空气等)从发送端传递到接收端的技术范式,其核心差异体现在信号载体形式、传输介质、抗干扰能力、传输距离等维度。根据电信号的本质特征和工程应用场景,可将其分为以下几大类:

电平信号

概念:以 “单个信号线上的电平值” 相对 “公共地线(GND)” 的电压差来表示逻辑(0/1)或模拟量

可以理解为:“用一根线传递信号,另一根线传递‘基准 0 点’(地线),接收端通过对比信号线与地线的电压差判断信号含义”。

差分信号

概念:以 “两根互补信号线(如 A+、A-,或 D+、D-)之间的电压差” 来表示逻辑(0/1)或模拟量,不依赖公共地线,两根线的信号幅度相等、极性相反。

可以理解为:“用两根线传递‘相反的信号’,接收端通过计算两根线的电压差判断信号含义 —— 外部噪声会同时耦合到两根线,差值抵消,从而消除干扰”。

电平信号和差分信号的区别:

电平信号✅ 优点:线路简单(仅需 2 线)、成本低、实现容易

❌ 缺点:抗干扰能力弱(地线噪声会直接影响信号)、传输距离短(通常 < 10 米)

应用场景:开发板内部通信采用电平信号,如串口通信(TTL\RS232)、SPI、IIC等

差分信号✅ 优点:抗干扰能力极强(外部噪声会同时耦合到两根线,差值抵消)、传输距离远(可达百米级)

❌ 缺点:线路复杂(需 2 线)、成本略高、需差分芯片处理

应用场景:开发板与外部设备通信采用差分信号,如RS485串口通信、以太网、USB、CAN等

通信划分

对于有线通信中按照不同的通信维度,划分了多种通信类别

​​​​​​​通信方向划分

单工:要么收,要么发,只能做接收设备或者发送设备一根信号线只能单向发送或单向接收比如收音机

半双工可以收,可以发,但是不能同时收发,一根信号线可以接收数据也可以发送数据,但是两者不能同时进行比如对讲机

全双工可以在同一时刻既接收,又发送两根信号线,一根发送数据,另一根接收数据,真正实现同时收发数据,速度快;比如:手机打电话

​​​​​​​通信方式划分

串行通信指的是同一时刻只能收或发一个bit位信息。因此只用1根信号线即可。数据一位一位串起来,逐个传输,数据按位顺序传输。

优点:占用引脚资源少

缺点:速度相对较慢

并行通信:指的是同一时刻可以收或发多个bit位的信息,因此需要多根信号线才行使用多根线同时传输一个字的多个位,如 8 根线一次传输 8 个位。

优点:速度快

缺点:占用引脚资源多

应用:像屏幕显示用的是并行

​​​​​​​时钟信号划分

同步通信发送方和接收方通过同一时钟信号来协调数据传输节奏,确保双方同步的读取 / 发送数据(时钟信号由主机产生,从机被动同步)。

异步通信发送方和接收方无共用时钟信号,有自己独立的时钟信号,通过预设的波特率(数据传输速率)和起始 / 停止位来实现数据通信(双方需提前约定波特率,允许微小误差)。

因此,同步通信和异步通信主要区别,就看有没有时钟线(SCL/SCK)

uart:串行异步全双工 SPI:串行同步全双工

IIC:串行同步半双工 单总线:串行异步半双工

串口通信

在串口通信中主要包含两类UART和USART(通用同步sync/异步async收发器),他们主要区别是:

  • USART: 支持同步\异步通信、全双工、串行
  • UART :没有时钟线,只支持异步通信、全双工、串行

在串口通信(如UART协议)中,TXD和RXD是两条核心数据传输线,分别代表发送数据(Transmit Data)和接收数据(Receive Data)

​​​​​​​协议格式

在通信中数据的交互需要遵循一定的格式,接收方才能按照规定的格式进行接收并解析数据,协议格式也叫数据帧或帧格式

传输过程:空闲状态默认为高电平,开始传输数据时将电平拉低,表示起始位,接下来传输实际数据,遵循低位先行原则,校验位根据用户设置确定是否有校验位,最后数据传输结束把电平拉高,表示停止位。

起始位:表示要开始发送数据,占1位

数据位:表示通信中数据位的个数,一般位5、7、8位。对于stm32u5数据位为7、8、9位(通过cubemx配置串口属性能看到)

校验位:在串口通信中一种简单的检错方式。一般不设置,因为校验位不能完全保证数据无误传输。

奇校验:就是让原有数据序列中(包括你要加上的一位)1的个数为奇数

如:1000110(0)

偶校验:就是让原有数据序列中(包括你要加上的一位)1的个数为偶数

如:1000110(1)

停止位:数据传输结束标志,停止位典型的值为1、1.5和2位。

波特率数据传输的速率,指每秒数据传输的位数,单位为bit/s

常见的波特率:9600bit/s、115200bit/s

​​​​​​​USART框图

UART数据发送和接收的过程:

发送过程:由CPUDMA向数据发送寄存器(TDR)中写入要发送的数据,由发送移位寄存器将数据按位移到发送端口输出。

接收过程通过端口接收到的数据先存入接收移位寄存器中,将移位寄存器中数据存入数据接收寄存器,再由CPUDMA读取接收数据寄存器(RDR)中的数据。

注意:如果CPU发送数据过快,会出现数据被覆盖情况,此时需要通过ISR中断和状态寄存器来标志数据是否可以发送。

USART寄存器

​​​​​​​中断和状态寄存器

USART_ISR

  • 第七位:TXFNF,发送数据标记,当发送数据寄存器为空,此位为1,也就是数据写入到发送数据寄存器之后,发送数据移位寄存器,从发送数据寄存器中将数据全部移走之后ISR第七位置1(TXFNF为1时表示可以往TDR写数据)
  • 第五位:RXFNE,接收数据标记,当接收数据寄存器非空,这个位置为1,数据被接受数据移位寄存器搬到接收数据寄存器中以后,ISR第五位置1(RXFNE为1表示可以读取RDR中数据)

​​​​​​​数据发送寄存器

USART_TDR决定发送的数据将要发送的数据写入,0-8位有效(u5可以发送的数据位是7、8、9位)

​​​​​​​数据接收寄存器

USART_RDR决定接收的数据将要接收数据进行读取

​​​​​​​原理图分析

找到核心板的typec口,丝印为J4,这个是usart1

CH340E:是电平转换芯片,将USB差分信号转换为TTL电平信号

​​​​​​​cubemx配置

​​​​​​​代码实现

while(1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */USART1->TDR='A';HAL_Delay(1000);}

printf重定向

int printf(const char * format,...)

在Linux中实现向终端输出时使用了printf,printf函数底层调用的是fputc函数,fputc是将要发送的数据写入到标准输出流stdout因此如果想让printf将数据输出到串口,需要重写fputc

函数原型:int fputc(int /*c*/, FILE * /*stream*/),这里的fputc是一个弱函数,前面有weak修饰。

WEAK弱符号

weak 顾名思义是“弱”的意思,所以如果函数名称前面加上__weak 修饰符,我们一般称这个函数为“弱函数”。

加上了__weak 修饰符的函数,用户可以在用户文件中重新定义一个同名函数,最终编译器编译的时候,会选择用户定义的函数,如果用户没有重新定义这个函数,

那么编译器就会执行__weak 修饰的函数,并且编译器不会报错。

步骤:

  1. 在keil5中如果使用C库相关函数,需要勾选上微库

勾完这个库后必须全部编译,要不会报以下两个错误

  1. 添加stdio.h头文件,并实现重定向
#include<stdio.h>intfputc(intch,FILE*p){while(!(USART1->ISR&1<<7));//等待TDR为空,即TXE置1,跳出while,然后往TDR中放数据USART1->TDR=ch;}intmain(){printf("hello world");HAL_Delay(1000);}

​​​​​​​HAL库实现通信

​​​​​​​​​​​​​​代码实现

uint8_t buf[32]="";/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while(1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */HAL_UART_Receive(&huart1,buf,sizeof(buf),100);HAL_UART_Transmit(&huart1,buf,sizeof(buf),100);memset(buf,0,sizeof(buf));}


​​​​​​​​​​​​​​

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询