stm32F103C8T6串口通信发送Hello Windows

本文是基于STMF103C8T6 芯片及开发板,在深入理解串口通信的原理后完成实操,发送Hello Windows。

一、通信方式

1.串行通信

一条信息的各位数据被逐位按顺序传送的通讯方式称为串行通讯。

串行通讯的特点是:数据位传送,传按位顺序进行,最少只需一根传输线即可完成,成本低但送速度慢。

串行通讯的距离可以从几米到几千米。 根据信息的传送方向,串行通讯可以进一步分为单工半双工全双工三种。

信息只能单向传送为单工;信息能双向传送但不能同时双向传送称为半双工;信息能够同时双向传送则称为全双工。 串行通讯又分为异步通讯和同步通讯两种方式。在单片机中,主要使用异步通讯方式

串行通讯中,两个设备之间通过一对信号线进行通讯,其中一根为信号线,另外一根为信号地线,信号电流通过信号线到达目标设备,再经过信号地线返回,构成一个信号回路。

2.并行通信

并行通讯通常可以一次传送8bit、16bit、32bit甚至更高的位数,相应地就需要8根、16根、32根信号线,同时需要加入更多的信号地线。比如传统的PATA线路有40根线,其中有16根信号线和7根信号地线,其他为各种控制线,一次可以传送2Byte的数据。并行通讯中,数据信号中无法携带时钟信息,为了保证各对信号线上的信号时序一致,并行设备需要严格同步时钟信号,或者采用额外的时钟信号线。

通过串行通讯与并行通讯的对比,可以看出:串行通讯很简单,但是相对速度低并行通讯比较复杂,但是相对速度高

更重要的是,串行线路仅使用一对信号线,线路成本低并且抗干扰能力强,因此可以用在长距离通讯上;而并行线路使用多对信号线(还不包括额外的控制线路),线路成本高并且抗干扰能力差,因此对通讯距离有非常严格的限制。
请添加图片描述

3.同步通信和异步通信

  • 同步通信要求接收端时钟频率和发送端时钟频率一致,发送端发送连续的比特流;

  • 异步通信时不要求接收端时钟和发送端时钟同步,发送端发送完一个字节后,可经过任意长的时间间隔再发送下一个字节。

  • 同步通信效率高,异步通信效率较低。

  • 同步通信较复杂,双方时钟的允许误差较小;异步通信简单,双方时钟可允许一定误差。

  • 同步通信可用于点对多点,异步通信只适用于点对点。

请添加图片描述

二、、串口通信协议

1.串口通信协议简介

串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式,因为它简单便捷,因此大部分电子设备都支持该通讯方式,电子工程师在调试设备时也经常使用该通讯方式输出调试信息。

在计算机科学里,大部分复杂的问题都可以通过分层来简化。如芯片被分为内核层和片上外设;STM32 标准库则是在寄存器与用户代码之间的软件层。对于通讯协议,我们也以分层的方式来理解,最基本的是把它分为物理层协议层

  • 物理层规定通讯系统中具有机械、电子功能部分的特性,确保原始数据在物理媒体的传输。
  • 协议层主要规定通讯逻辑,统一收发双方的数据打包、解包标准。

简单来说物理层规定我们用嘴巴还是用肢体来交流,协议层则规定我们用中文还是英文来交流。

下面我们分别对串口通讯协议的物理层及协议层进行讲解。

2.物理层

串口通讯的物理层有很多标准及变种,本文中主要介绍RS-232 标准 ,RS-232 标准主要规定了信号的用途通讯接口以及信号的电平标准

如图为使用 RS-232 标准的串口设备间常见的通讯结构
在这里插入图片描述
“DB9 接口”之间通过串口信号线建立起连接,串口信号线中使用“RS-232标准”传输数据信号。

由于 RS-232电平标准的信号不能直接被控制器直接识别,所以这些信号会经过一个“电平转换芯片”转换成控制器能识别的“TTL 标准”的电平信号,才能实现通讯。

①电平标准

根据通讯使用的电平标准不同,串口通讯可分为 TTL标准及 RS-232标准。
请添加图片描述

②RS-232 信号线

RS-232 串口标准常用于计算机、路由与调制调解器(MODEN,俗称“猫”)之间的通讯 ,在这种通讯系统中,设备被分为数据终端设备 DTE(计算机、路由)和数据通讯设备 DCE(调制调解器)。

RS-232 标准的 COM 口:
请添加图片描述
计算机与调制解调器之间连接时,只要使用“直通型”的串口线连接起来即可:
在这里插入图片描述

3.协议层

串口通信原理
串口通信的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。它很简单并且能够实现远距离通信。
比如IEEE488定义并行通行状态时,规定设备线总长不得超过20米,并且任意两个设备间的长度不得超过2米;而对于串口而言,长度可达1200米。典型地,串口用于ASCII码字符的传输。通信使用3根线完成:(1)地线,(2)发送,(3)接收。
由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。其他线用于握手,但是不是必须的。
串口通信最重要的参数是波特率数据位停止位奇偶校验。对于两个进行通信的端口,这些参数必须匹配。

根据串口通信的原理接下来我们从这几个参数入手给大家详细介绍。

①波特率

本次实验内容是串口异步通讯,异步通讯中由于没有时钟信号,所以两个通讯设备之间需要约定好波特率,即每个码元的长度,以便对信号进行解码。常见的波特率为4800、9600、115200 等。

②数据位

这是衡量通信中实际数据位的参数。当计算机发送一个信息包,实际的数据不会是8位的,标准的值是5、7和8位

比如,标准的ASCII码是0~127(7位)。扩展的ASCII码是0~255(8位)。如果数据使用简单的文本(标准 ASCII码),那么每个数据包使用7位数据。

注:每个包是指一个字节,包括开始/停止位,数据位和奇偶校验位。由于实际数据位取决于通信协议的选取,术语“包”指任何通信的情况。

③起始位和停止位

用于表示单个包的最后一位。典型的值为1,1.5和2位。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。

④奇偶校验位

在串口通信中一种简单的检错方式。有四种检错方式:偶、奇、高和低。当然没有校验位也是可以的。对于偶和奇校验的情况,串口会设置校验位(数据位后面的一位),用一个值确保传输的数据有偶个或者奇个逻辑高位。

例如,如果数据是011,那么对于偶校验,校验位为0,保证逻辑高的位数是偶数个。如果是奇校验,校验位为1,这样就有3个逻辑高位。

高位和低位不真正的检查数据,简单置位逻辑高或者逻辑低校验。这样使得接收设备能够知道一个位的状态,有机会判断是否有噪声干扰了通信或者是否传输和接收数据是否不同步。

三、RS232通信协议

1.概念

个人计算机上的通讯接口之一,由电子工业协会(Electronic Industries Association,EIA) 所制定的异步传输标准接口。全称为(Universal Synchronous Asynchronous Receiver and Transmitter通用同步异步收发器),是UART的进阶版,可以实现同步通信。

2.电气特性

根据上面串口通信的协议的电平标准介绍,这里的电气特性为:

逻辑1(MARK):  -3V~-15V
逻辑0(SPACE):  +3~+15V

3.接口

TX:发送数据输出引脚。

RX:接收数据输入引脚。

SW_RX:数据接收引脚,只用于单线和智能卡模式,属于内部引脚,没有具体外部引脚。

nRTS:请求以发送(Request To Send),n 表示低电平有效。如果使能 RTS 流控制,当USART 接收器准备好接收新数据时就会将 nRTS 变成低电平;当接收寄存器已满时,nRTS将被设置为高电平。该引脚只适用于硬件流控制。

nCTS:清除以发送(Clear To Send),n表示低电平有效。如果使能 CTS 流控制,发送器在发送下一帧数据之前会检测 nCTS 引脚,如果为低电平,表示可以发送数据,如果为高电平则在发送完当前数据帧之后停止发送。该引脚只适用于硬件流控制。

SCLK:发送器时钟输出引脚。这个引脚仅适用于同步模式。

请添加图片描述
本次实验实现全双工异步通信只需要三根线:RX、TX和GND

4.特性

1.逻辑输入与逻辑输出特性
在这里插入图片描述
2.RS232接口端输入特性
在这里插入图片描述
3.RS232接口端输出特性
在这里插入图片描述

四、STM32的USART串口通信(查询方式)

1.题目要求

完成一个STM32的USART串口通讯程序(查询方式即可,暂不要求采用中断方式),要求:
1)设置波特率为115200,1位停止位,无校验位;
2)STM32系统给上位机(win10)连续发送“hello windows!”。win10采用“串口助手”工具接收。

2.代码编写

在代码编写前首先要建立工程,通过我们之前的学习可知,工程的建立有以下几种方法:
①使用CubeMX生成基本工程,详情可看我之前的文章 STM32CubeMX的安装和使用
②自己在MDK中建立工程,详情步骤:STM32建立工程点亮流水灯
③使用网上找的工程模板,例如洋桃电子,可在百度自行搜索。

  • usart.c文件:
void uart_init(u32 pclk2,u32 bound)
{  	 
	float temp;
	u16 mantissa;
	u16 fraction;	   
	temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV
	mantissa=temp;				 //得到整数部分
	fraction=(temp-mantissa)*16; //得到小数部分	 
    mantissa<<=4;
	mantissa+=fraction; 
	RCC->APB2ENR|=1<<2;   //使能PORTA口时钟  
	RCC->APB2ENR|=1<<14;  //使能串口时钟 
	GPIOA->CRH&=0XFFFFF00F;//IO状态设置
	GPIOA->CRH|=0X000008B0;//IO状态设置 
	RCC->APB2RSTR|=1<<14;   //复位串口1
	RCC->APB2RSTR&=~(1<<14);//停止复位	   	   
	//波特率设置
 	USART1->BRR=mantissa; // 波特率设置	 
	USART1->CR1|=0X200C;  //1位停止,无校验位.
#if EN_USART1_RX		  //如果使能了接收
	//使能接收中断 
	USART1->CR1|=1<<5;    //接收缓冲区非空中断使能	    	
	MY_NVIC_Init(3,3,USART1_IRQn,2);//组2,最低优先级 
#endif
}

将其中的uart_init代码替换成上述代码即可,根据代码可以看出我们的过程如同上述分析得到,我们要先初始化引脚,然后设置波特率和奇偶校验。

接下来我们需要创建一个usart.h文件来声明定义的函数,方便在main.c文件中调用。

  • usart.h:
#define __USART_H
#include "sys.h"
#include "stdio.h"	 

 
#define USART_REC_LEN  			200  	//定义最大接收字节数 200
#define EN_USART1_RX 			1		//使能(1)/禁止(0)串口1接收
	  	
extern u8  USART_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.末字节为换行符 
extern u16 USART_RX_STA;         		//接收状态标记	
//如果想串口中断接收,请不要注释以下宏定义
void uart_init(u32 pclk2,u32 bound);

#endif	 

接下来是主程序的编写,在main程序中我们首先就是要调用我们的初始化函数,初始化函数的编写在usart.c中就已经完成。初始化后我们就需要在主循环while循环体内加入我们的串口输出代码。

  • main.c:
#include "sys.h"
#include "usart.h"		
#include "delay.h"	 
int main(void)
{				 
	u16 t; u16 len; u16 times=0;
	Stm32_Clock_Init(9);	//系统时钟设置
	delay_init(72);	  		//延时初始化
	uart_init(72,115200); 	//串口初始化为115200
  	while(1)
	{
		if(USART_RX_STA&0x8000)
		{ 
			len=USART_RX_STA&0x3FFF;//得到此次接收到的数据长度
			printf("\r\n Hello Windows! \r\n\r\n");
			for(t=0;t<len;t++)
			{
				USART1->DR=USART_RX_BUF[t];
				while((USART1->SR&0X40)==0);//等待发送结束
			}
			printf("\r\n\r\n");//插入换行
			USART_RX_STA=0;
		}else
		{
			times++;
			if(times%200==0)printf("Hello Windows!\r\n"); 
			delay_ms(10); 
		}
	}	 
} 

在代码中我们可以看到我们的波特率设置的是题目要求的115200,这里根据用户需求的不同可以进行更改。

3.编译及烧录

编译结果如图所示:
请添加图片描述
可以看到编译结果显示没有报错,证明我们的程序设计的没有问题。接下来只需进行烧录观察即可。

在这里插入图片描述

4.串口助手的使用

首先需要在电脑安装好CH340驱动,相关资料可在网上自行查找
安装界面如下:
在这里插入图片描述
然后我们还需要安装串口助手
串口助手打开界面如下:
请添加图片描述
将左下角端口号选为COM3,波特率设置为115200,点击左下角打开串口:
请添加图片描述
看到如图所示预览界面不断输出Hello Windows,证明实验成功。

  • 9
    点赞
  • 95
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
在标准库中配置STM32F103C8T6串口3发送数据的步骤如下: 1. 打开STM32CubeMX软件,创建一个新的工程。 2. 在"Pinout & Configuration"选项卡中,选择正确的芯片型号(STM32F103C8T6)。 3. 在"Configuration"选项卡中,找到"USART3"并启用它。 4. 在"Mode"下拉菜单中选择"Asynchronous"(异步模式)。 5. 在"Hardware Flow Control"下拉菜单中选择"None"(无硬件流控制)。 6. 在"Parameter Settings"中,配置波特率、数据位、停止位和奇偶校验位等参数,以满足你的需求。 7. 在"NVIC Settings"选项卡中,启用USART3的中断(如果需要)。 8. 点击"Project"菜单,选择"Generate Code"生成代码。 9. 在生成的代码中,找到USART3的初始化函数,并调用它来初始化串口。 10. 在发送数据之前,调用相应的发送函数,将要发送的数据传递给它。 请注意,以上步骤仅提供了配置串口发送数据的基本步骤。具体的代码实现可能会因为你的需求和使用的开发环境而有所不同。你可以参考\[1\]和\[4\]中的参考资料,以获取更详细的配置和代码示例。 #### 引用[.reference_title] - *1* *2* [【stm32CubeMX】STM32F103c8t6串口通信](https://blog.csdn.net/qq_52201641/article/details/127289094)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [stm32F103C8T6串口通信发送Hello Windows](https://blog.csdn.net/cleveryoga/article/details/121010316)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

cleveryoga

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

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

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

打赏作者

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

抵扣说明:

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

余额充值