STM32串口通信入门

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

1.何为串口通信协议

串口通信指两个或两个以上的设备使用串口按位(bit)发送和接收字节。可以在使用一根线发送数据的同时用另一根线接收数据。 串口通信协议就是串口通讯时共同遵循的协议。 协议的内容是每一个bit 所代表的意义。

2.RS-232

RS-232(ANSI/EIA-232标准) 只支持点对点, 最大距离 50英尺。最大速度为128000bit/s,距离越远速度越慢。 支持全双工(发送同时也可接收)。
以下是RS-232的主要特点:
电气特性:RS-232采用不平衡的电气特性,使用正负电平来表示逻辑0和逻辑1。
线缆:常见的RS-232连接线缆使用DB-9或DB-25接头,其中包括数据线、控制线和地线等。
通信距离:通常的最大通信距离约为50英尺(15米),但使用特殊的信号放大器可以扩展到更远的距离。
数据速率:RS-232支持可调节的数据速率,通常范围是110 bps到115.2 kbps。
应用领域:由于其可靠性和广泛的应用历史,RS-232在计算机终端、调制解调器、串口打印机等设备中得到广泛应用。

3.RS232电平与TTL电平的区别

(一)电平标准
TTL电平
输出 L: \u003C0.8V ; H:>2.4V。\n\n输入 L: \u003C1.2V ; H:>2.0V\n\nTTL器件输出低电平要小于0.8V,高电平要大于2.4V。输入,低于1.2V就认为是0,高于2.0就认为是1。于是TTL电平的输入低电平的噪声容限就只有(0.8-0)/2=0.4V,高电平的噪声容限为(5-2.4)/2=1.3V。
RS232电平
在TXD和RXD数据线上:
(1)逻辑1为-3~-15V的电压
(2)逻辑0为3~15V的电压
在RTS、CTS、DSR、DTR和DCD等控制线上:
(1)信号有效(ON状态)为3~15V的电压
(2)信号无效(OFF状态)为-3~-15V的电压
(二)
1.电平的上限和下限定义不一样,CMOS具有更大的抗噪区域。 同是5伏供电的话,ttl一般是1.7V和3.5V的样子,CMOS一般是2.2V,2.9V的样子,不准确,仅供参考。
2.电流驱动能力不一样,ttl一般提供25毫安的驱动能力,而CMOS一般在10毫安左右。
3.需要的电流输入大小也不一样,一般ttl需要2.5毫安左右,CMOS几乎不需要电流输入。
4.很多器件都是兼容TTL和CMOS的,datasheet会有说明。如果不考虑速度和性能,一般器件可以互换。但是需要注意有时候负载效应可能引起电路工作不正常,因为有些ttl电路需要下一级的输入阻抗作为负载才能正常工作。

4."USB/TTL转232"模块(以CH340芯片模块为例)的工作原理。

1.基本工作原理

USB主机检测到USB转串口设备插入后,首先会对设备复位,然后开始USB枚举过程。USB枚举时过程会获取设备描述符、配置描述符、接口描述符等。描述符中会包含USB设备的厂商ID,设备ID和Class类别等信息。操作系统会根据该信息为设备匹配相应的USB设备驱动。
USB虚拟串口的实现在系统上依赖于USB转串口驱动,一般由厂家直接提供,也可以使用操作系统自带的CDC类串口驱动等。驱动主要分为2个功能,其一注册USB设备驱动,完成对USB设备的控制与数据通讯,其二注册串口驱动,为串口应用层提供相应的实现方法。

2.CH340模块介绍

实物图
在这里插入图片描述
内部结构图
在这里插入图片描述

安装 stm32CubeMX,配合Keil,使用HAL库(或标准库)方式,设置USART1 波特率为115200,1位停止位,无校验位,完成下列任务:
1)STM32系统给上位机(win10)连续发送“hello windows!”。win10采用“串口助手”工具接收。

一、通过CubeMX配置项目

1.设置RCC
在这里插入图片描述
2.设置SYS
在这里插入图片描述
3.设置USART
在这里插入图片描述
4.设置NVIC
在这里插入图片描述
5.Clock Configuration界面设置
在这里插入图片描述
6.Project Manager页面设置
在这里插入图片描述
7.点击右上角创建工程
在这里插入图片描述

二、main.c函数编写

1.在main函数前定义全局变量

char c;//指令 #:停止  *:开始
char message[]="hello Windows\n";//输出信息
int flag=0;//标志 #:停止发送 *.开始发送

2.在main函数中设置接收中断

 MX_GPIO_Init();
 MX_USART1_UART_Init();

3.main函数中的while循环里面添加传输代码

if(flag==1){
			//发送信息
			HAL_UART_Transmit(&huart1, (uint8_t *)"hello windows!\r\n", 16 , 0xffff);
      
			//延时
			HAL_Delay(1000);  

		}

4.在main函数下面重写中断处理函数

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	
	//当输入的指令为0时,发送提示并改变flag
	if(c=='#'){
		flag=0;
		
	}
	
	//当输入的指令为1时,发送提示并改变flag
	else if(c=='*'){
		flag=1;
	}

5.main.c函数运行成功截图:
在这里插入图片描述
2)在完成以上任务基础,继续扩展功能:当上位机给stm32发送一个字符“#”后,stm32暂停发送“hello windows!”;发送一个字符“*”后,stm32继续发送;

烧录

在这里插入图片描述

实验结果视频

当发送*号后不断输出“hello windows”,当输入#后端口停止输出

1698241439266

在没有示波器条件下,可以使用Keil的软件仿真逻辑分析仪功能观察串口输出波形,并分析时序状态正确与否,计算波特率实际为多少。
1.点击Debug->Start/Stop Debug Session
在这里插入图片描述
2.点击 Logic Analyzer
在这里插入图片描述
3.点击左上角的Setup进行如下设置
在这里插入图片描述

最终波形图

在这里插入图片描述

四、总结

串口通信是MCU最基本的通信方式,对于STM32来说也是如此,学号串口通信的知识是日后深入学习STM32的基础,本次实验让我掌握了串口通信的基本原理以及实际运用。实验中遇到困难在所难免,因为初学STM32串口通信还是不太熟练,只能跟着网上的步骤一步一步做,去理解它。比如我就遇到板子没连接正确,烧录不成功等问题,通过不停查询最终解决了问题,掌握一些技巧之后,逐渐熟练,希望在日后我也能将串口通信灵活地进行运用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值