STM32 HAL库【串口通信】01

一、串口协议

了解串口协议和RS-232电平与TTL电平的区别;以及"USB/TTL转232"模块(以CH340芯片模块为例)的工作原理。

1.串口协议

常用的串口通信协议有RS-232、RS-485和TTL。

关于RS-232

RS-232(又称EIA RS-232)是常用的串行通信接口标准之一,由美国电子工业协会(EIA)联合贝尔系统公司、调制解调器厂家及计算机终端生产厂家于1970年共同制定。

它具有信号线少、灵活的波特率选择、采用负逻辑传送和传送距离较远等特点。

在串行通讯时,要求通讯双方都采用一个标准接口,使不同的设备可以方便地连接起来进行通讯。RS-232-C接口(又称 EIARS-232-C )是目前最常用的一种串行通讯接口。(“RS-232-C”中的“-C”只不过表示RS-232的版本,所以与“RS-232”简称是一样的)

它是在1970年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。它的全名是“数据终端设备(DTE)和数据通讯设备(DCE)之间串行二进制数据交换接口技术标准”该标准规定采用一个 25 个脚的 DB-25 连接器,对连接器的每个引脚的信号内容加以规定,还对各种信号的电平加以规定。后来 IBM 的 PC 机将 RS232 简化成了 DB-9 连接器,从而成为事实标准。而工业控制的 RS-232 口一般只使用 RXD、TXD、GND 三条线
公母接口:
在这里插入图片描述

1)串口协议标准

RS-232C 标准(协议)的全称是 EIA-RS-232C 标准,其中 EIA (Electronic Industry Association)代表美国电子工业协会,RS(recommended standard)代表推荐标准,232 是标识号,该标准对串行通信的物理接口及逻辑电平都做了规定,其输出的电平称为 RS232 电平,C 代表 RS232 的最新一次修改(1969),在这之前,有 RS232B、RS232A。它规定连接电缆和机械、电气特性、信号功能及传送过程。常用物理标准还有EIARS-422A、EIA RS-423A、EIARS-485。这里只介绍 EIA RS-232C(简称232,RS232)。例如,目前在 IBM PC 机上的 COM1、COM2 接口,就是 RS-232C 接口。

2)串口引脚定义

最简单的 RS232 通信由三条数据线组成,即 TXD、RXD 和 GND。RS232 采用负逻辑电平,即 -15V ~ -3V 代表逻辑 “1” ,+ 3V ~ +15V 代表逻辑 “0” 。这里的电平,是 TxD 线(或者 RxD 线)相对于 GND 的电压。

9 芯信号方向来自缩写描述备注
1调制解调器CD载波检测— —
2调制解调器RXD接收数据(终端到计算机)RS-232 接收
3PCTXD发送数据(计算机到终端)RS-232 发送
4PCDTR数据中断准备好— —
5GND信号地RS-232 接地
6调制解调器DSR通讯设备准备好— —
7PCRTS请求发送— —
8调制解调器CTS允许发送— —
9调制解调器RI 响铃指示器— —
3)串口缺点
  1. 接口的信号电平值较高,易损坏接口电路的芯片,又因为与 TTL 电平不兼容故需使用电平转换电路方能与 TTL 电路连接。
  2. 传输速率较低,在异步传输时,波特率为 20Kbps ;因此在 CPLD 开发板中,综合程序波特率只能采用 19200 ,也是这个原因。
  3. 接口使用一根信号线和一根信号返回线而构成共地的传输形式,这种共地传输容易产生共模干扰,所以抗噪声干扰性弱。
  4. 传输距离有限,最大传输距离标准值为 50 英尺,实际上也只能用在 15 米左右。

2.电平标准

根据通讯使用的电平标准不同,串口通讯可分为 TTL 标准及 RS-232 标准,见下表:

通信标准电平标准(发送端)
TTL逻辑1:2.4~5v 逻辑0:0~0.5v
RS-232逻辑1:-15~-3v 逻辑0:+3~+15v

我们知道常见的电子电路中常使用 TTL 的电平标准,理想状态下,使用 5V 表示二进制逻辑 1,使用 0V 表示逻辑 0;而为了增加串口通讯的远距离传输及抗干扰能力,RS232使用 -15V 表示逻辑 1,+15V 表示逻辑 0。
使用 RS232 与 TTL 电平校准表示同一个信号时的对比见下图:
在这里插入图片描述

3.“USB/TTL转232”模块的工作原理(CH340芯片模块为例)

USB转串口即实现计算机USB接口到物理串口之间的转换。可以为没有串口的计算机或其他USB主机增加串口,使用USB转串口设备等于将传统的串口设备变成了即插即用的USB设备。

CH340介绍:

CH340是一个USB总线的转接芯片,实现USB转串口或者USB转打印口。 在串口方式下,CH340提供常用的MODEM联络信号,用于为计算机扩展异步串口,或者将普通的串口设备直接升级到USB总线。 因为我们现在的电脑上,已经不存在串口,所以我们一般使用USB转串口芯片,目的只有一个,把电脑的USB口映射为串口用。 ### 1)TTL与232串口互传 单片机串口(TTL电平)想和电脑串口(232电平)通信,就需要使得他两的电平逻辑一样才可以通信。这时候,就需要用到转换TTL--232电平的芯片,常用的有MAX232、MAX3232、SP232、SP3232等。MAX232芯片是TTL电平与RS232电平的专用双向转换芯片,不同引脚实现TTL转RS-232或RS-232转TTL的功能。连接方式为:单片机串口—232芯片–串口。 ### 2)USB转TTL/RS-232 - USB转TTL

USB转TTL芯片有很多,例如:CH340、PL2303、CP2102、FT232等。开发板上,板载USB转TTL芯片:CH340,所以你只需要用USB连接线把电脑和开发板连起来,就可以下载程序和进行串口通信了。连接方式:单片机TTL串口—USB转TTL芯片–USB口

CH340实图:
在这里插入图片描述
连线示意图如下:
在这里插入图片描述

  • USB转232

USB经过CH340转成了TTL串口,TTL再经由MAX232转换为RS-232电平,9针串口引出。

二、STM32的USART串口通信(HAL库)

USART

USART-通用同步异步收发器是一个串行通信设备,可以灵活地与外部设备进行全双工数据交换。有别于 USART 还有一个UART。它是在 USART 基础上裁剪掉了同步通信功能,只有异步通信。简单区分同步和异步就是看通信时需不需要对外提供时钟输出,我们平时用的串口通信基本都是 UART。

题目要求

设置USART1波特率为115200,1位停止位,无校验位,完成下列任务:

  1. STM32系统给上位机(win10)连续发送“hello windows!”。win11采用“串口助手”工具接收。
  2. 在完成以上任务基础,继续扩展功能:当上位机给STM32发送一个字符‘#’后,STM32暂停发送“hello windows!”;发送一个字符‘*’后STM32继续发送。

1 发送“Hello Windows”

1)CubeMX配置

新建工程可查看基于HAL库的LED流水灯
RCC设置
在这里插入图片描述
USART1设置
在这里插入图片描述
mood模式

	Asynchronous:		异步通信
	Synchronous:		同步通信
	Single Wire (Half-Duplex):	单线/半双工
	Multiprocessor Communication:	多处理器
	支持局域互连网络LIN
	智能卡(SmartCard)协议
	lrDA(红外线数据协会) SIR ENDEC规范。

晶振配置(72M)
在这里插入图片描述
工程管理并生成文档
在这里插入图片描述

2)打开生成的keil文件

在main.c文件的主函数while循环中添加以下代码:

char data[]="hello windows!\n";
		HAL_UART_Transmit(&huart1, (uint8_t *)data, 15, 0xffff);
		HAL_Delay(1000);

串口助手:
在这里插入图片描述

2 通过串口助手控制数据收发

使能串口中断
在这里插入图片描述
代码部分
写在main函数之前

extern UART_HandleTypeDef huart1;//声明串口的结构体变量
uint8_t aRxBuffer;//接受缓存
uint8_t flag=1;//标志符号 

写在mani函数中,在提前打开接受中断,否则接受不到

HAL_UART_Receive_IT(&huart1,&aRxBuffer,1);

while循环中写

	  if(flag==1)
	  {
		HAL_UART_Transmit(&huart1, (uint8_t *)data, 15, 0xffff);
		HAL_Delay(1000);
	  }

串口接收中断回调函数

void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
  /* Prevent unused argument(s) compilation warning */
if(huart == &huart1)	// 判断是几号串口
	{
		
		if(aRxBuffer == '#')//接收到#则将flag置0,主函数就不会在输出字符
		{
			flag=0;
		HAL_UART_Receive_IT(&huart1,&aRxBuffer,1);   
		}
		
		if(aRxBuffer == '*')//同理接受到*,将flag置1,主函数即可再次发送
		{
			flag=1;
		HAL_UART_Receive_IT(&huart1,&aRxBuffer,1);  
		}
			
	}
}

仿真波形

在这里插入图片描述
可以看到低电平持续时间约为9.641975us,高电平持续时间为87.96296ns

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是使用STM32HAL库进行串口通信的示例代码: ```c // 引用头文件 #include "stm32f4xx_hal.h" // 定义串口句柄 UART_HandleTypeDef huart1; // 串口接收缓冲区 uint8_t rxBuffer = "yupeng"; // 串口接收完成中断回调函数 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if (huart == &huart1) { // 对接收到的数据进行处理 HAL_UART_Receive_IT(&huart1, rxBuffer, 5); // 再次开启一次中断 } } int main(void) { // 初始化HAL库 HAL_Init(); // 初始化串口 __HAL_RCC_USART1_CLK_ENABLE(); huart1.Instance = USART1; huart1.Init.BaudRate = 9600; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; HAL_UART_Init(&huart1); // 开启串口接收中断 HAL_UART_Receive_IT(&huart1, rxBuffer, 5); while (1) { // 发送数据 HAL_UART_Transmit_IT(&huart1, txBuffer, 5); // 延时等待发送完成 HAL_Delay(1000); } } ``` 这段代码中,我们首先引用了STM32HAL库的头文件,并定义了一个串口句柄`huart1`,以及接收和发送的缓冲区。在`main`函数中,我们首先初始化HAL库串口,并开启串口接收中断。然后,在主循环中,我们使用`HAL_UART_Transmit_IT`函数将数据发送出去,并使用`HAL_Delay`函数进行延时,等待发送完成。同时,当串口接收到数据时,会触发中断回调函数`HAL_UART_RxCpltCallback`,我们在这个函数中对接收到的数据进行处理,并再次开启一次中断。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dylan_hs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值