stm32F103C8T6串口通信发送Hello Windows

2023-05-16

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

文章目录

  • 一、通信方式
    • 1.串行通信
    • 2.并行通信
    • 3.同步通信和异步通信
  • 二、、串口通信协议
    • 1.串口通信协议简介
    • 2.物理层
      • ①电平标准
      • ②RS-232 信号线
    • 3.协议层
      • ①波特率
      • ②数据位
      • ③起始位和停止位
      • ④奇偶校验位
  • 三、RS232通信协议
    • 1.概念
    • 2.电气特性
    • 3.接口
    • 4.特性
  • 四、STM32的USART串口通信(查询方式)
    • 1.题目要求
    • 2.代码编写
    • 3.编译及烧录
    • 4.串口助手的使用

一、通信方式

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,证明实验成功。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

stm32F103C8T6串口通信发送Hello Windows 的相关文章

随机推荐

  • css沿曲线进行动画,css3动画曲线运动

    Title box width 50px height 120px margin top 500px margin left 500px box2 width 50px height 120px background black box a
  • ios获取区域服务器信息,ios获取服务器数据

    ios获取服务器数据 内容精选 换一换 有以下几种方式 xff1a 应用服务器调用查询设备历史数据接口 xff0c 主动从物联网平台获取设备上报的数据 应用服务器调用订阅平台业务数据接口 xff0c 使物联网平台在设备上报数据时 xff0c
  • C++头文件的包含顺序研究

    作者 xff1a 朱金灿 来源 xff1a http blog csdn net clever101 一 xff0e Google C 43 43 编程风格指南 里的观点 公司在推行编码规范 xff0c 领导提议基本上使用 Google C
  • java捕获子线程异常_Java中主线程如何捕获子线程抛出的异常

    首先明确线程代码的边界 其实很简单 xff0c Runnable接口的run方法所界定的边界就可以看作是线程代码的边界 Runnable接口中run方法原型如下 xff1a br public void run br 而所有的具体线程都实现
  • 大疆4rtk_解密大疆精灵4rtk-后差分定位技术(PPK)

    RTK技术大家已经非常了解 xff0c 优势自不必说 xff0c 虽然作业距离远但总是有接收不到差分信号的时候 xff0c 或者有的时候在山区测量移动站作业距离近 xff0c 远了就没办法接收到差分信号 xff0c 这就是RTK的弊端 xf
  • vue跨域使用websocket_vue使用SockJS实现webSocket通信

    以前使用websocket都是使用 window webSocket 61 new WebSocket 39 ws 39 43 config webSocketUrl 43 39 webData websocket token 61 39
  • html进度条动画效果,CSS3创建时尚且具有动画效果的进度条

    我们看到各种各样的进度条 xff0c 这些进度条显示了流程的当前完成状态 xff0c 例如下载或文件传输 无论是在构建桌面应用程序还是在构建Web应用程序 xff0c 都可能需要使用此UI元素 在本文中 xff0c 将介绍如何使用CSS3创
  • 树莓派python gpio 模仿iic_GPIO实现I2C协议模拟(1)

    最近需要用GPIO模拟I2C协议 xff0c 如果是在Linux下面比较简单 xff0c 但在Windows下面 xff0c 是否有没Linux那么简单了 索性自己对I2C协议还有一些了解 xff0c 翻了SPEC并结合示波器量出的实际信号
  • Ubuntu/linux c开发(1) GB2312/UTF8相互转换

    由于工作原因最近开始搞linux开发 xff0c 写几个服务程序 编码格式的转换算是基础之一 网上也有现成的代码 xff0c 只是有一些小问题需要注意 xff0c 这里自己保存一下 xff1a 1 判断字符是否是utf8字符 判断字符串是否
  • stm32CubeMX的安装和点亮流水灯

    文章目录 一 JDK的下载 安装和配置1 JDK的下载2 JDK的安装3 JDK的配置4 测试 二 CubeMX的下载和安装1 CubeMX的下载2 CubeMX的安装 三 利用CubeMX新建工程点亮LED灯1 题目介绍2 CubeMX介
  • Ubuntu/linux c开发(5) UDP通讯

    在项目中遇到个硬件厂家 xff0c 用的UDP协议 由于 xff0c 现场需求是要检测设备的状态 xff0c 而UDP是一个不可靠的协议 只能通过接收他收到指令的返回值来判断当前状态 xff0c 这就需要我们在发送指令后监听接收 而且 xf
  • Ubuntu/linux c开发(7)进程名称获取进程PID、CPU内存占用

    1 获取进程pid 项目要求获取多个进程的内存CPU资源利用情况 xff0c 获取内存CPU资源利用的代码网上很多 xff0c 但是要获取指定进程的PID却是没有找到 他们正常例子都是获取当前进程的PID xff1a span class
  • windows c++ (1) 基于libcurl的SFTP获取linux目录、下载、上传

    1 目标 近期项目做文件传输都是基于sftp xff0c 这里我选择了libcurl 不过要注意的是libcurl默认下并不支持SFTP xff0c 需要在编译的时候添加libssh2依赖项 xff0c 而libssh2又依赖于openss
  • windows c++ (3) windows获取进程PID、进程路径、进程启停及文件相关操作

    1 windows下获取PID windows下获取PID比较简单 xff0c 可以直接通过TlHelp32 h内的Process32First 43 Process32Next来遍历进程获取PROCESSENTRY32 xff08 存放快
  • 详解C/C++中volatile关键字

    原文 link 一 volatile介绍 volatile提醒编译器它后面所定义的变量随时都有可能改变 xff0c 因此编译后的程序每次需要存储或读取这个变量的时候 xff0c 都会直接从变量地址中读取数据 如果没有volatile关键字
  • Ubuntu/linux c开发(9)docker部署+容器制作

    1 docker部署 1 1 查询当前系统是否有docker span class token operator gt span whereis docker docker span class token operator span sp
  • vs 出现chkstk.asm问题的解决方式

    程序编译成功无报错 xff0c 执行debug时 xff0c 突然系统跳chkstk asm 报了堆栈错误 定位问题 我们到堆栈最后执行的地方 xff0c 发现是一个线程创建 这里肯定没有问题 xff0c 那么问题肯定出现在线程的初始化里
  • 30岁人生进度条_20-30岁怎么规划自己的人生呢?

    我是一名职业规划师 xff0c 毕业至今已经工作15年 43 了 xff0c 拥有500强人力资源经理以及民营企业人力总监等履历背景 xff0c 至今已经做过1000 43 个职业规划咨询个案 关于 20岁到30岁 xff0c 应该做些什么
  • java 摘要认证实现_摘要认证

    摘要认证 digest authentication 摘要认证 Digest authentication 用来提供比基础认证更高级别的安全 在RFC2617中有关于它的描述 xff0c 摘要认证是一种基于挑战 应答模式的认证模型 摘要认证
  • stm32F103C8T6串口通信发送Hello Windows

    本文是基于STMF103C8T6 芯片及开发板 xff0c 在深入理解串口通信的原理后完成实操 xff0c 发送Hello Windows 文章目录 一 通信方式1 串行通信2 并行通信3 同步通信和异步通信 二 串口通信协议1 串口通信协