-
2021-12-28 22:53:48
实验二 串口通信实验
一、实验目的
1.)了解 USART 的基本特性;
2.)掌握用库函数操作 USART 的方法;
3.)掌握如何使用 STM32 的串口发送和接收数据。二、实验环境
1.)硬件:1 个空气温湿度传感器模块、1 个 ST-Link 调试器、1 根 USB2.0 方口线、1
根 USB3.0 数据线、1 台 PC 机;
2.)软件:Windows 7/XP、MDK 集成开发环境。
3)、 在发送区输入“/物联网感知与控制技术—2.2 串口通信实验 DEMO/”,点
击按钮 ,通过串口以及 ST-Link 调试器,将数据发送到温湿度传感器模块。
4)、 由 3.3.4 知,温湿度传感器模块接收到数据后会返回相同的数据,这时,接收区会
接收到同样的数据,如下图所示。
四、实验步骤
1)、将 USB3.0 数据线的一端连接感知执行模块的 USB3.0 调试烧写口,另一端连接
ST-Link 调试器的“Debug”接口。
2)、 将第 1 根 USB2.0 方口线的一端连接 PC 机的 USB 口,另一端连接 ST-Link 调试器的“USB-Debug”接口。
3)、将第 2 根 USB2.0 方口线的一端连接 PC 机的 USB 口,另一端连接 ST-Link 调试器的“USB-232”接口。
4)、双击打开【配套光盘\03-常用工具\01-硬件开发包\09-串口调试工具】目录下的串口
调试器,选择正确的端口号(可参照 1.2.2 查看串口端号),波特率设为 115200,其他均保
持默认设置,点击按钮“打开串口”即可,效果见下图。
5)、双击打开工程文件“STM32-USART.uvproj”。
6)、在工具栏中点击按钮,编译工程,编译成功后,信息框会出现下图所示的信息。如
果编译失败,请参照 1.2.1.2 中的内容,确认相关选项是否配置正确。
7)、参照 1.2.1.3 中的内容,确认与硬件调试有关的选项已设置正确。
8)、 点击按钮“LAOD”,将程序下载到温湿度传感器模块中。下载成功后,信息框显示下图中所示的信息,表明程序下载成功并已自动运行。
9)、 程序运行起来后,User1 指示灯被点亮,观察串口调试器接收区接收到的数据。
10)、 按一下温湿度传感器模块的复位按钮,再观察串口调试器接收区接收到的数据。
11)、 在发送区输入一些数字、字母、字符、汉字等内容,点击按钮“发送”发送到串口,
观察串口调试器接收区接收到的数据。五、实验程序
#include "stm32f10x.h" #include <stdio.h> void gpio_init(void) // GPIO 的初始化配置 { GPIO_InitTypeDef GPIO_InitStructure; // 定义一个 GPIO 初始化类型结构体 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOA , ENABLE); // 开启 GPIOB 和 GPIOA 的外设时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; // 选择要控制的 GPIOB 引脚 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 设置引脚速率为 50MHz GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 设置引脚模式为通用推挽输出 GPIO_Init(GPIOB, &GPIO_InitStructure); // 调用库函数,初始化 GPIOB GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; // 选择要控制的 GPIOA 引脚 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 用作串口输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;// 用作串口输入 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); } void led_init(void) // 点亮 User1 指示灯 { GPIO_ResetBits(GPIOB,GPIO_Pin_7); } void USART1_Config(void) { USART_InitTypeDef USART_InitStructure; // 定义 USART 初始化类型结构体 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 , ENABLE); // 开启 USART1 时钟 USART_InitStructure.USART_BaudRate = 115200; // 波特率设为 115200 USART_InitStructure.USART_WordLength = USART_WordLength_8b; // 1 个起始位,8 个数据位 USART_InitStructure.USART_StopBits = USART_StopBits_1; // 1 个停止位 USART_InitStructure.USART_Parity = USART_Parity_No ; // 无奇偶校验 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; // 失能 CTS 无硬件控制流 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; // 使能发送和接收 USART_Init(USART1, &USART_InitStructure); // 调用库函数,初始化 USART1 USART_Cmd(USART1, ENABLE); // 使能 USART1 } int fputc(int ch, FILE *f) // { USART_SendData(USART1, (char) ch); // 将 printf()中的内容发往串口 while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) // 发送数据寄存器非空时,循环等待 { } return (int)ch; // 返回值 } int main(void) { char data='0'; // 保存接收到的数据 gpio_init(); // GPIO 初始化 led_init(); // LED 初始化 USART1_Config(); // 配置 USART1 printf(" Please input a char \r\n"); // 开机后提示输入字符串 while(1) { if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE) == SET) { data=USART_ReceiveData(USART1); // 读取 USART1 接收到的数据到 data 中 USART_SendData(USART1 ,data); // 向串口发送接收到的数据 } } }
六、实验结果
七、实验心得
因为和上次实验用的接口不一样,实验之前要仔细检查到底是COM几。在判断是否已经发送完成时,对比使用了USART_FLAG_TC和USART_FLAG_TXE两个函数。在引脚的选择方面查阅了关于复用的参数。
更多相关内容 -
串口通信实验_串口通信实验_
2021-09-30 10:20:16串口通信实验 -
STM32F4USART串口通信实验例程.rar-综合文档
2021-05-23 18:32:19STM32F4USART串口通信实验例程.rar -
MFC计算机网络串口通信实验
2019-01-18 10:40:28MFC实现文件的传输,server端和client端,传输的文件放在debug下,也可以用cmd实现 -
CC2540串口通信实验.ppt
2018-11-05 16:52:20掌握CC2540的UART串口寄存器设置,掌握UART串口中断函数程序的编程方法 -
串口通信实验.zip
2020-08-01 18:58:23本实验程序,主要用STM3开发板实现串口通信,并且带有附加功能(呼吸灯)。希望这个程序可以帮到大家。在接下来学习STM32的过程中,可以与大家一起学习探讨。谢谢大家的支持。 -
HAL基础实验源码12_5串口实验 stm32cubemx-F429IGT6串口6-7-8多串口通信实验.zip
2019-08-21 13:47:58stm32f429igt6串口实验例程,多串口,同时,独立工作,任意长度数据收发,HAL库 -
串口通信实验
2022-01-15 19:59:26串口通信实验通信的基本概念
51 单片机不仅可以实现串口通信,还可以通过 IO 口模拟实现多种其他通信,比如 SPI、IIC 等。
通信的方式可以分为不同类型,按数据传送方式可分为串行通信和并行通信。按通信的数据同步方式可分为异步通信和同步通信。按照数据的传输方向又可分为单工通信、半双工通信和全双工通信。简单介绍一下这几种通信方式。
串行通信与并行通信
串行通信
串行通信是指使用一条数据线,将数据一位一位地依次传输,每一位数据占据一个固定的时间长度,只需几条数据线便可实现在系统之间交换信息。如下图所示
特点:传输线少,长距离传送时成本低,且可以利用电话网等现成的设备,但数据的传送控制比并行通信复杂。
并行通信
并行通信通常是将 “数据字节的各位(一字节8位)” 用多条数据线同时进行传送,通常是 8 位、16 位、32 位等数据一起传输。如下图所示:
特点:控制简单、传输速度快;由于传输线较多,长距离传送时成本高 ,且同时接收各“位”存在困难,抗干扰能力差。
异步通信与同步通信
异步通信
异步通信是指 “通信的发送与接收设备” 使用各自的时钟控制数据的发送和接收过程。为使双方的收发协调,要求发送和接收设备的时钟尽可能一致。
异步通信是以字符(构成的帧)为单位进行传输,字符与字符之间的间隙(时间间隔)是任意的,但每个字符中的各个位是以 “固定的时间(位间隔)” 传送的。即,字符之间不一定有 “位间隔” 的整数倍的关系,但字符内的各个位之间的距离均为 “位间隔” 的整数倍。如下图所示:
异步通信的特点:不要求收发双方时钟的严格一致,实现容易,成本低,但每个字符要附加 2~3 位用于起止位,各帧之间还有空闲,因此传输效率不高。
同步通信
同步通信时,要建立 “发送方时钟” 对 “接收方时钟” 的直接控制,使双方达到完全同步。此时,传输数据的位之间的距离均为 “位间隔” 的整数倍,同时传送的字符间不留间隙,即保持位同步关系,也保持字符同步关系。发送方对接收方的同步可以通过两种方法实现。如下图所示:
单工、半双工与全双工通信
单工通信
单工是指数据传输仅能沿一个方向,不能实现反向传输。如下图所示:
半双工通信
半双工是指数据传输可以沿两个方向,但需要分时进行。如下图所示:
全双工通信
全双工是指数据可以同时进行双向传输。如下图所示:
通信速率
通信速率,通常以“比特率”(Bit Rate)来表示。比特率是每秒传输二进制代码的位数,单位是:位/秒( bps)。如每秒钟传送 100 个字符,每个字符格式包含 10 位(1 个起始位、1 个停止位、 8 个数据位),此时比特率为:
bps。
后面会遇到一个“波特率”的概念,表示每秒传输了多少个码元。码元是通信信号调制的概念,通信中常用 “时间间隔相同的符号” 来表示一个二进制数字,这样的时间间隔内的信号称为(二进制)码元。比如用 0V 表示数字 0,5V 表示数字 1,那么一个码元可以表示两种状态 0 和 1,所以一个码元等于一个二进制比特位(比特位即bit,是计算机最小的存储单位。以0或1来表示比特位的值。),此时波特率的大小与比特率一致(因为传输的都是二进制位);如果在通信传输中,有 0V、 2V、 4V 以及 6V 分别表示二进制数 00、 01、 10、 11,那么每个码元可以表示四种状态,即两个二进制比特位,所以码元数是二进制比特位数的一半,这个时候的波特率为比特率的一半。由于很多常见的通信中一个码元都是表示两种状态, 所以常常直接以波特率来表示比特率。
串口通信简介
串口通信(Serial Communication),是指外设和计算机间通过数据信号线、 地线等按位进行传输数据的一种通信方式,属于串行通信方式。串口是一种接口标准,规定了接口的电气标准,没有规定接口插件电缆以及使用的协议。
接口标准
串口通信常用的的接口标准是 RS-232 和 RS-485。RS-232 其是 RS-232C 的改进,原理一样。以 RS-232C 接口为例:
RS-232C 定义了数据终端设备(DTE:Data Terminal Equipment)与数据通信设备(DCE:Distributed Computing Environment)之间的物理接口标准,规定使用 25 针连接器,简称 DB25,连接器的尺寸及每个插针的排列位置都有明确的定义,如下图所示:
RS-232C 还有一种 9 针的非标准连接器接口,简称 DB9。大部分串口通信都是 DB9 接口。DB25 和 DB9 接头有公头和母头之分,其中带针状的接头是公头,而带孔状的接头是母头。9 针串口线的外观图如下图所示:
管脚的功能说明如下所示(注:插针序号()内为9针非标准连接器的引脚号):
RS-232C标准接口主要引脚定义 插针序号 名称 说明 信号方向 1 PGND 接地保护 2(3) TXD 传送数据(串行输出) DTE←DCE 3(2) RXD 接收数据(串行输入) DTE→DCE 4(7) RTS 请求发送 DTE→DCE 5(8) CTS 允许发送 DTE←DCE 6(6) DSR DCE就绪(数据建立就绪) DTE←DCE 7(5) SGND 信号接地 8(1) DCD 载波检测 DTE←DCE 20(4) DTR DTE就绪(数据终端准备就绪) DTE→DCE 22(9) RL 振铃提示 DTE←DCE
RS-232C 对逻辑电平也做了规定,如下:
在 TXD 和 RXD 数据线上:
- 逻辑 1 为-3~-15V 的电压
- 逻辑 0 为 3~15V 的电压
在 RTS、CTS、DSR、DTR 和 DCD 等控制线上:
- 信号有效( ON 状态) 为 3~15V 的电压
- 信号无效( OFF 状态) 为-3~-15V 的电压
由此可见,RS-232C 是用正负电压来表示逻辑状态,与晶体管-晶体管逻辑集成电路(TTL)以高低电平表示逻辑状态的规定正好相反。51 单片机使用的是 TTL 电平,所以要实现 51 单片机与计算机的串口通信,需要进行 TTL 与 RS-232C 电平转换。通常使用的电平转换芯片是 MAX232。
在串口通信中通常 PC 机的 DB9 为公头,单片机上使用的串口 DB9 为母头, 通过一根直通串口线进行相连。在 9 针串口线实物图即为直通型串口线,串口线 母头连接计算机 DB9 的公头,串口线公头连接单片机上使用的 DB9 母头,这样就是将 2、3、5 管脚直接相连。如果要实现两台计算机串口通信, 那么就需要一根交叉串口线,将 2 对 3、3 对 2、5 对 5 连接,交叉串口线一 般两头都是母头。
串口通信中还需要注意的是,串口数据收发线要交叉连接,计算机的 TXD 要对应单片机的 RXD,计算机的 RXD 要对应单片机的 TXD,并且共 GND,如下图:
通信协议
RS232 的通信协议比较简单,通常遵循 96-N-8-1 格式。
“96”表示的是通信波特率为 9600。串口通信中,通常使用的是异步串口通信,即没有时钟线,所以两个设备要通信,必须要保持一致的波特率。波特率常用值还有 4800、 115200 等。
“N”表示的是无校验位,由于串口通信相对更容易受到外部干扰导致传输数据出现偏差,可以在传输过程加上校验位来解决这个问题。校验方法有奇校验 (odd)、偶校验(even)、0 校验(space)、1 校验(mark)以及无校验(noparity)。
“8”表示的是数据位数为 8 位,其数据格式在前面介绍异步通信中已讲过。 数据位数还可以为 5、6、7 位长度。
“1”表示的是 1 位停止位,串口通讯的一个数据包从起始信号开始,直到停止信号结束。数据包的起始信号由一个逻辑 0 的数据位表示,而数据包的停止信号可由 0.5、1、1.5 或 2 个逻辑 1 的数据位表示,只要双方约定一致即可。
串口内部结构
图中的 TXD 和 RXD 为单片机 IO 口,TXD 对应 P3.1 管脚,RXD 对应P3.0 管脚。
串口相关寄存器
串口控制寄存器 SCON
位 7 6 5 4 3 2 1 0 字节地址:98H SM0 SM1 SM2 REN TB8 RB8 T1 RL SM0 和 SM1 为工作方式选择位:
串口行的工作方式 SM0 SM1 方式 说明 波特率 0 0 0 移位寄存器 Fosc/12 0 1 1 10位异步收发器(8位数据) 可变 1 0 2 11位异步收发器(9位数据) Fosc/12或Fosc/32 1 1 3 11位异步收发器(9位数据) 可变 SM2:多机通信控制位,主要用于方式 2 和方式 3。当 SM2=1 时可以利用收到的 RB8 来控制是否激活 RI(RB8=0 时,不激活 RI,收到的信息丢弃;RB8=1 时,收到的数据进入 SBUF,并激活 RI,进而在中断服务中将数据从 SBUF 读走)。当 SM2=0 时,不论收到的 RB8 为 0 和 1,均可以使收到的数据进入 SBUF,并激活 RI (即此时 RB8 不具有控制 RI 激活的功能)。通过控制 SM2,可以实现多机通信。
REN:允许串行接收位。由软件置 REN=1,则启动串行口接收数据;若软件置 REN=0,则禁止接收。
TB8:在方式 2 或方式 3 中,是发送数据的第 9 位,可以用软件规定其作用。 可以用作数据的奇偶校验位,或在多机通信中,作为地址帧/数据帧的标志位。 在方式 0 和方式 1 中,该位未用到。
RB8:在方式 2 或方式 3 中,是接收到数据的第 9 位,作为奇偶校验位或地址帧/数据帧的标志位。在方式 1 时,若 SM2=0,则 RB8 是接收到的停止位。
TI:发送中断标志位。在方式 0 时,当串行发送第 8 位数据结束时,或在其它方式,串行发送停止位的开始时,由内部硬件使 TI 置 1,向 CPU 发中断申请。 在中断服务程序中,必须用软件将其清 0,取消此中断申请。
RI:接收中断标志位。在方式 0 时,当串行接收第 8 位数据结束时,或在其它方式,串行接收停止位的中间时,由内部硬件使 RI 置 1,向 CPU 发中断申请。 也必须在中断服务程序中,用软件将其清 0,取消此中断申请。
电源控制寄存器 PCON
位 7 6 5 4 3 2 1 0 字节地址:97H SM0D SMOD:波特率倍增位。在串口方式 1、方式 2、方式 3 时,波特率与 SMOD 有关,当 SMOD=1 时,波特率提高一倍。复位时,SMOD=0。
串口工作方式
方式 0
方式 0 时,串行口为同步移位寄存器的输入输出方式。主要用于扩展并行输入或输出口。数据由 RXD(P3.0)引脚输入或输出,同步移位脉冲由 TXD(P3.1)引脚输出。发送和接收均为 8 位数据,低位在先,高位在后。波特率固定为 fosc/12。对应的输入输出时序图如下所示:
方式 0 输出:
方式 0 输入:
方式 1
方式 1 是 10 位数据的异步通信口。TXD 为数据发送引脚,RXD 为数据接收引脚,传送一帧数据的格式如下所示。
其中 1 位起始位,8 位数据位,1 位停止位。对应的输入输出时序图如下所示:
方式 1 输出:
方式 1 输入:
用软件置 REN 为 1 时,接收器以所选择波特率的 16 倍速率采样 RXD 引脚电平,检测到 RXD 引脚输入电平发生负跳变时,则说明起始位有效,将其移入输入移位寄存器,并开始接收这一帧信息的其余位。接收过程中,数据从输入移位寄存器右边移入,起始位移至输入移位寄存器最左边时,控制电路进行最后一次移位。当 RI=0,且 SM2=0(或接收到的停止位为 1)时,将接收到的 9 位数据的前 8 位数据装入接收 SBUF,第 9 位(停止位)进入 RB8,并置 RI=1,向 CPU 请求中断。
方式 2 和方式 3
方式 2 或方式 3 时,为 11 位数据的异步通信口。TXD 为数据发送引脚,RXD 为数据接收引脚。其数据格式如下所示:
对应的输入输出时序图如下所示:
方式 2、方式 3 输出:
发送开始时,先把起始位0输出到 TXD 引脚,然后发送移位寄存器的输出位 (D0)到 TXD 引脚。每一个移位脉冲都使输出移位寄存器的各位右移一位,并由 TXD 引脚输出。第一次移位时,停止位“1”移入输出移位寄存器的第 9 位上,以后每次移位,左边都移入 0。当停止位移至输出位时,左边其余位全为 0,检测电路检测到这一条件时,使控制电路进行最后一次移位,并置 TI=1,向 CPU 请求中断。
方式 2、方式 3 输入:
接收时,数据从右边移入输入移位寄存器,在起始位 0 移到最左边时,控制电路进行最后一次移位。当 RI=0,且 SM2=0(或接收到的第 9 位数据为 1)时, 接收到的数据装入接收缓冲器 SBUF 和 RB8(接收数据的第 9 位),置 RI=1,向 CPU 请求中断。如果条件不满足,则数据丢失,且不置位 RI,继续搜索 RXD 引脚 的负跳变。
串口的使用方法
计算波特率
几种方式下波特率的计算公式:
方式 0 的波特率 : fosc/12
方式 1 的波特率 :(
/32)·(T1 溢出率)
方式 2 的波特率 :(
/64)· fosc
方式 3 的波特率 :(
/32)·(T1 溢出率)
其中 T1 溢出率 = fosc /{12×[256 -(TH1)]}.
串口初始化步骤
使用串口,可以按照以下几个步骤配置。
- 确定 T1 的工作方式(TMOD 寄存器)
- 确定串口工作方式(SCON 寄存器)
- 计算 T1 的初值(设定波特率),装载 TH1、TL1
- 启动 T1(TCON 中的 TR1 位)
- 如果使用中断,需开启串口中断控制位(IE 寄存器)
例如:设置串口为工作方式 1、波特率为 9600、波特率加倍、使用中断。其配置程序如下:
void uart_init(u8 baud) { TMOD|=0X20; //设置计数器工作方式 2 SCON=0X50; //设置串口为工作方式 1 PCON=0X80; //波特率加倍 TH1=baud; //计数器初始值设置 TL1=baud; ES=1; //打开接收中断 EA=1; //打开总中断 TR1=1; //打开计数器 }
硬件部分
USB 转 TTL 模块:
由上图可以看出,通过 CH340 芯片把 51 单片机的串口与 PC 机的 USB 口 进行连接,不仅可以实现程序的烧入,还可实现串口通信功能。根据前面介绍, 串口通信需将数据收发管脚交叉连接,所以可以看到在 CH340 芯片的 2 和 3 脚 已做处理。电路中其他部分是自动下载电路部分,目的是控制单片机的电源,无需冷启动。使用 USB 转串口芯片,免去了一根串口线,使用普通 USB 数据线(支持安卓手机数据线)就可以进行串口通信。
从上图中可以看到 CH340 的 2、3 脚串口并非直接连接到单片机串口,而是连接在 J39 和 J44 端子上,这样就把 CH340 的串口与单片机串口独立出来。 使用黄色跳线帽将 J39 和 J44 端子的 2、3 短接,那么 CH340 串口与单 片机串口是连接一起的,此时即可实现程序的下载或串口通信。
使用黄色跳线帽将 J39 和 J44 端子的 3、4 短接,那么 RS232 模块串口与单片机串口是连接 一起的,此时可通过 RS232 模块下载程序或串口通信。
软件部分
实验代码比较简单,首先定义了串口通信中断配置函数 uart_init,该函数有一个入口参数 baud,该值可改变通信波特率。该函数的实现即是按照前面介绍的串口配置步骤。最后进入 while 循环,在循环体内不执行任何功能程序。如果发生接收中断,即会进入串口中断执行,执行完后回到主函数内继续运行,如此循环。
#include "reg52.h" typedef unsigned int u16;//对系统默认数据类型进行重定义 typedef unsigned char u8; void uart_init(u8 baud) { TMOD|=0X20; //设置计数器工作方式 2 SCON=0X50; //设置为工作方式 1 PCON=0X80; //波特率加倍 TH1=baud; //计数器初始值设置 TL1=baud; ES=1; //打开接收中断 EA=1; //打开总中断 TR1=1; //打开计数器 } void main() { uart_init(0XFA);//波特率为 9600 while(1) { } } void uart() interrupt 4 //串口通信中断函数 { u8 rec_data; RI = 0; //清除接收中断标志位 rec_data=SBUF; //存储接收到的数据 SBUF=rec_data; //将接收到的数据放入到发送寄存器 while(!TI); //等待发送数据完成 TI=0; //清除发送完成标志位 }
现象
使用 USB 线将开发板和电脑连接成功后(电脑能识别开发板上 CH340 串口), 把编译后产生的.hex 文件烧入到芯片内,实现现象如下:当串口助手发送数据 给单片机,单片机原封不动转发给串口助手显示。
-
stm32与cc2530串口通信实验
2017-12-06 21:22:51程序1:stm32程序串口2接收串口1发送 程序 改自 扩展实验11 ATK-HC05蓝牙串口模块实验 程序 程序2:zigbee串口通讯-发送字符串 连接方式: cc2530的P02连接stm32的PA2 cc2530的P03连接stm32的PA3 程序2串口一直... -
51单片机串口通信实验demo
2018-12-28 09:56:58适用于AT89c51/52单片机的串口通信例程,可根据实际需求更改发送的数据和发送波特率 -
14. USART串口通信实验_串口通信_
2021-10-01 18:54:48STM32串口通信功能的应用主要是串口数据的收发 -
STM32 串口通信实验
2018-12-10 14:30:30STM32开发板上的串口通信实验代码,移植时请注意修改相应的引脚 -
单片机串口通信实验
2018-05-17 09:36:49单片机串口通信实验程序,请大家素质取用不要乱用谢谢 -
实验4 串口通信实验_串口通信_STM32串口通信_
2021-10-01 17:00:28基于STM32的串口通信程序范例DSP串口通信程序 -
串口通信 计算机网络实验 MFC
2019-03-22 12:40:35串口通信 计算机网络实验 c++实验 MFC界面 VS2015工程文件 附带具体搭建项目的详细教程文档 利用串口线能实现两台计算机之间的串口通信 类似QQ聊天 利用串口模拟器,一台电脑开两个也可以相互通信 -
嵌入式STM32--实验四、串口通信实验
2021-04-04 11:10:301、 掌握STM32串口通信原理。 2、 学习编程实现STM32的UART通信。 自律 学习 坚强 ,拒绝迷茫。
作者:行走的皮卡丘
时间:2021/4/4
喜欢就去追,这个红灯等不到,说不定下一个红灯等到了,嘻嘻!!!!!!!
一、 实验目的
-
1、 掌握STM32串口通信原理。
-
2、 学习编程实现STM32的UART通信。
二、 实验设备
硬件:
PC机 一台
STM32开发板 一套
软件:
MDK V4.0 一套
Windows 7 一套
调试助手 一套
三、 实验原理
3.1、状态寄存器
USART_SR
及函数第5、6位
RXNE
和TC
-
RXNE
(读数据寄存器非空),当该位被置1的时候,就是提示已经有数据被接收到了,并且可以读出来了。 -
TC
(发送完成),当该位被置位的时候,表示USART_DR
内的数据已经被发送完成了。
在固件库函数里面,读取串口状态的函数是:
FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG );
这个函数的第二个入口参数非常关键,它是标示我们要查看串口的哪种状态,比如上面讲解的
RXNE
(读数据寄存器非空)以及TC
(发送完成)。例如:要判断读寄存器是否非空(
RXNE
),操作库函数的方法是:USART_GetFlagStatus(USART1,USART_FLAG_RXNE);
要判断发送是否完成(
TC
),操作库函数的方法是:USART_GetFlagStatus(USART1,USART_FLAG_TC);
3.2、USATR1 发送一个字节
/**************************************************************** USATR1 发送一个字节 功能:发送一个字节的数据 入口参数:发送到数据 出口参数:无 *****************************************************************/ void Send_OneByte(uint8_t onebyte) { while(RESET == USART_GetFlagStatus(USART1, USART_FLAG_TC));//等待发送完毕 USART_SendData(USART1, onebyte); }
3.3、接收一个字节的数据
/**************************************************************** 功能:接收一个字节的数据 入口参数:无 出口参数:返回收到的数据 *****************************************************************/ uint8 rxdata;//存储收到的数据 uint8 Receive_OneByte(void) { if(USART_GetITStatus(USART1, USART_IT_RXNE)!= RESET)//串口收到数据 { rxdata = USART_ReceiveData(USART1); } return rxdata; }
3.4、串口编程为如下步骤:
//1) 串口时钟使能, GPIO 时钟使能 //配置时钟,由于使用串口是在复用IO口,需要打开串口时钟和相应的IO口时钟。 //2) GPIO 端口模式设置 //串口相应的IO口需要配置,输出口配置成复用推挽输出,输出速度根据需要配置,输入口配置为悬空输入。 //3) 串口参数初始化,使能串口。(***\*串口调试助手 与之一致\**** ) USART_InitTypeDef USART_InitStructure; USART_InitStructure.USART_BaudRate = ***\*115200\****; //波特率 USART_InitStructure.USART_WordLength = USART_WordLength_8b;//8位 USART_InitStructure.USART_StopBits = USART_StopBits_1; //1位停止位 USART_InitStructure.USART_Parity = USART_Parity_No; //无奇偶校验位 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //无硬件数据流控制 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式 USART_Init(USART1, &USART_InitStructure ); //初始化串口1 //USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启接收中断。若无中断,该项不需要 USART_Cmd(USART1, ENABLE); //使能串口1 //4) 初始化 NVIC且开启中断(若开启中断才需要该步骤) NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0) NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0 ; //抢占优先级0,级别可自己设定 ,下面的子优先级可自定 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //子优先级2 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能 NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器 //5) 编写中断处理函数 (有中断才需要该步骤)
四、实验内容
1、用STM32设计一个与计算机进行串口通讯的实验。STM32向PC发送 123ABC ,用串口调试助手 显示出来,用查询方式完成。
2、用STM32设计一个与计算机进行串口通讯的实验。PC向STM32发送 456789 ,STM32接收后,将 每位数值+3 发送给PC,用 串口调试助手显示出来,用中断方式完成。
3、用STM32设计一个与计算机进行串口通讯的实验,利用PC控制LED的亮灭。
-
1)PC向STM32发送 A ,控制LED1,LED2,LED3同时亮灭,间隔时间0.5S,同时在 串口调试助手显示LED1,LED2,LED3同时亮灭”。
-
2)PC向STM32发送 B ,控制LED1,LED2,LED3正向流水亮灭,间隔时间1S,同时在串口调试助手显示LED1,LED2,LED3正向流水亮灭”。
-
3)PC向STM32发送 C ,控制LED1,LED2,LED3反向流水亮灭,间隔时间2S,同时在 串口调试助手显示LED1,LED2,LED3反向流水亮灭”。
4、利用定时器结合串口实现 电子时钟的功能。功能如下:
-
1)定时器完成 1S 的定时。
-
2)串口调试助手*上显示时间,格式参考如下 12:34:56 ,每秒递增。串口调试助手每2秒刷新一次。
③在LCD上显示时间,格式参考如下 12:34:56 ,每秒递增。例程可参考 FSMC-液晶显示-英文的配套例程。
4.1、用STM32设计一个与计算机进行串口通讯的实验。STM32向PC发送 123ABC,用串口调试助手显示出来,查询方式完成。(代码:实验4-1)
usart.c
函数#include "sys.h" #include "usart.h" #pragma import(__use_no_semihosting) //标准库需要的支持函数 struct __FILE { int handle; }; FILE __stdout; //定义_sys_exit()以避免使用半主机模式 void _sys_exit(int x) { x = x; } //重定义fputc函数 int fputc(int ch, FILE *f) { while((USART1->SR&0X40)==0);//循环发送,直到发送完毕 USART1->DR = (u8) ch; return ch; } //串口1中断服务程序 //注意,读取USARTx->SR能避免莫名其妙的错误 u8 USART_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节. //接收状态 //bit15, 接收完成标志 //bit14, 接收到0x0d //bit13~0, 接收到的有效字节数目 u16 USART_RX_STA=0; //接收状态标记 void uart_init(u32 bound){ //GPIO端口设置 GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //使能USART1,GPIOA时钟 //USART1_TX GPIOA.9 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出 GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9 //USART1_RX GPIOA.10初始化 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入 GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10 //Usart1 NVIC 配置 NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能 NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器 //USART 初始化设置 USART_InitStructure.USART_BaudRate = bound;//串口波特率 USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式 USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位 USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式 USART_Init(USART1, &USART_InitStructure); //初始化串口1 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断 USART_Cmd(USART1, ENABLE); //使能串口1 } void USART1_IRQHandler(void) //串口1中断服务程序 { u8 Res; if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾) { Res =USART_ReceiveData(USART1); //读取接收到的数据 if((USART_RX_STA&0x8000)==0)//接收未完成 { if(USART_RX_STA&0x4000)//接收到了0x0d { if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始 else USART_RX_STA|=0x8000; //接收完成了 } else //还没收到0X0D { if(Res==0x0d)USART_RX_STA|=0x4000; else { USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ; USART_RX_STA++; if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收 } } } } }
usart.h函数
#ifndef __USART_H #define __USART_H #include "stdio.h" #include "sys.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 bound); #endif
main函数
#include "delay.h" #include "sys.h" #include "usart.h" /************************************************** * Function main * @author 行走的皮卡丘 * @date 2021/4/4 * @brief * @param[in] * @param[out] void * @retval void * @par History 无 * TXD PA.9 * RXD PA.10 *************************************************/ int main(void) { u16 t; u8 data[10]="123ABC"; delay_init(); //延时函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 uart_init(115200); //串口初始化为115200 while(1) { printf("\r\nSTM32发送的消息为: "); for(t=0;t<sizeof(data);t++) { USART_SendData(USART1, data[t]);//向串口1发送数据 while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束 } printf("\r\n");//插入换行 delay_ms(1000); } }
4.2、用STM32设计一个与计算机进行串口通讯的实验。PC向STM32发送 456789 ,STM32接收后,将 每位数值+3 发送给PC,用 串口调试助手 显示出来,用中断方式完成。(代码:实验4-2)
main函数
#include "sys.h" #include "usart.h" /************************************************** * Function main * @author 行走的皮卡丘 * @date 2021/4/4 * @brief * @param[in] * @param[out] void * @retval void * @par History 无 * TXD PA.9 * RXD PA.10 *************************************************/ int main(void) { char String[]="0123456789ABCDEFG"; u8 i; u8 data; u16 len; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 uart_init(115200); //串口初始化为115200 while(1) { if(USART_RX_STA&0x8000) { len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度 USART_RX_BUF[len] = 0; printf("\r\n PC发送的消息为:%s\r\n",USART_RX_BUF); printf(" STM32发送的消息为:"); for(i = 0;i < len;i++) { data=String[ USART_RX_BUF[i] - 48 + 3 ]; printf("%c",data); } printf("\r\n");//插入换行 USART_RX_STA=0; } } }
4.2.3、用STM32设计一个与计算机进行串口通讯的实验,利用PC控制LED的亮灭。(代码:实验4-3)
1)PC向STM32发送 A ,控制LED1,LED2,LED3同时亮灭,间隔时间0.5S,同时在 串口调试助手显示LED1,LED2,LED3同时亮灭”。
2)PC向STM32发送 B ,控制LED1,LED2,LED3正向流水亮灭,间隔时间1S,同时在 串口调试助手显示LED1,LED2,LED3正向流水亮灭”。
3)PC向STM32发送 C ,控制LED1,LED2,LED3反向流水亮灭,间隔时间2S,同时在 串口调试助手显示LED1,LED2,LED3反向流水亮灭”。
#include "delay.h" #include "sys.h" #include "usart.h" /************************************************** * Function main * @author 行走的皮卡丘 * @date 2021/4/4 * @brief * @param[in] * @param[out] void * @retval void * @par History 无 * TXD PA.9 * RXD PA.10 *************************************************/ #define LED1 PBout(0) #define LED2 PCout(4) #define LED3 PCout(3) void LED_Init(void) { GPIO_InitTypeDef GPIO_InitStr; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE);// GPIO_InitStr.GPIO_Mode=GPIO_Mode_Out_PP;//推挽 GPIO_InitStr.GPIO_Pin=GPIO_Pin_0; GPIO_InitStr.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOB,&GPIO_InitStr); // PB0 LED1 GPIO_InitStr.GPIO_Pin=GPIO_Pin_4; GPIO_Init(GPIOC,&GPIO_InitStr); // PC4 LED2 GPIO_InitStr.GPIO_Pin=GPIO_Pin_3; GPIO_Init(GPIOC,&GPIO_InitStr); // PC3 LED3 GPIO_SetBits(GPIOB,GPIO_Pin_0); GPIO_SetBits(GPIOC,GPIO_Pin_4); GPIO_SetBits(GPIOC,GPIO_Pin_3); } int main(void) { u16 i=0; u16 len; u16 data; LED_Init(); //LED端口初始化 delay_init(); //延时函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 uart_init(115200); //串口初始化为115200 while(1) { if(USART_RX_STA&0x8000) //接收数据 { len = USART_RX_STA&0x3f; for(i = 0;i < len; i++) { data = USART_RX_BUF[i]; while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET); } USART_RX_STA = 0; if(data == 'A') { data = 0; printf("LED1,LED2,LED3同时亮灭\r\n"); LED1=1; LED2=1; LED3=1; while(USART_RX_STA==0) { LED1=~LED1; LED2=~LED2; LED3=~LED3; delay_100ms(5); } } if(data == 'B') { data = 0; printf("LED1,LED2,LED3正向流水亮灭\r\n"); while(USART_RX_STA==0) { LED1=1; LED2=1; LED3=0; delay_100ms(10); LED1=1; LED2=0; LED3=1; delay_100ms(10); LED1=0; LED2=1; LED3=1; delay_100ms(10); } } if(data == 'C') { data = 0; printf("LED1,LED2,LED3反向流水亮灭\r\n"); LED1=1; LED2=1; LED3=1; while(USART_RX_STA==0) { LED1=0; LED2=1; LED3=1; delay_100ms(20); LED1=1; LED2=0; LED3=1; delay_100ms(20); LED1=1; LED2=1; LED3=0; delay_100ms(20); } } } } }
4.4、利用定时器结合串口实现 电子时钟的功能。(代码:实验4-4)
-
定时器完成 1S 的定时。
-
形参设置为arr=9999,psc=7199即可
-
串口调试助手上显示时间,格式参考如下 12:34:56 ,每秒递增。串口调试助手每2秒刷新一次。
-
主函数中的死循环,其中flay在定时器2的中断中累加,即一秒以1累加。
- 在LCD上显示时间,格式参考如下 12:34:56,每秒递增。例程可参考FSMC-液晶显示-英文的配套例程。
main函数
#include "led.h" #include "delay.h" #include "sys.h" #include "usart.h" #include "timer.h" #include "lcd.h" /************************************************** * Function main * @author 行走的皮卡丘 * @date 2021/4/4 * @brief * @param[in] * @param[out] void * @retval void * @par History 无 * TXD PA.9 * RXD PA.10 *************************************************/ int main(void) { ILI9341_Init(); ILI9341_GramScan( 6 ); //设置默认扫描方向,其中 6 模式为大部分液晶例程的默认显示方向 LCD_SetColors(GBLUE,BLACK); //设置颜色 ILI9341_Clear(0,0,LCD_X_LENGTH,LCD_Y_LENGTH); LCD_SetFont(&Font16x24); LCD_SetTextColor(GREEN); //设置文本颜色 delay_init(); //延时函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 uart_init(115200); //串口初始化为115200 LED_Init(); //LED端口初始化 TIM2_Int_Init(9999,7199); //一秒一次中断 72 000 000 /7200=10000 10000/10000=1hz 1/1hz=1s while(1) { if( flay==2 ) { flay = 0; printf("%s\r\n",TimeStr); } } }
五、实验总结
加油!!!行走的皮卡丘!!!!
实验四代码下载链接
-
-
单片机串口通信实验报告总结
2021-05-25 08:04:48一 、实验名称串口通信实验二、实验目的及要求1.掌握波特率设置及串口结构。2. 掌握串口方式一编程。三、实验主要仪器设备PC机实验原理串口通讯对单片机而言意义重大,不但可以实现将单片机的数据传输到电脑端,...一 、实验名称
串口通信实验
二、实验目的及要求
1.掌握波特率设置及串口结构。
2. 掌握串口方式一编程。
三、实验主要仪器设备
PC机实验原理
串口通讯对单片机而言意义重大,不但可以实现将单片机的数据传输到电脑端,而且也能实现电脑对单片机的控制,比如你可以把写入单片机的数据码显示在电脑上,如可以使用一个按键,当按下它时使某一个字母如:AA,通过单片机的串口将它发送到电脑上显示,起到仿真器的某些功效,站长在开发数据采集设备时就是通过串口来检查数据正确与否的。
实验内容
1.方式 0 应用设计。
2.方式 1 应用设计。
3.方式 2 应用设计。
4.方式 3 应用设计。
六、实验步骤
1.方式 0 输出应用:编写程序控制 8 个发光二极管轮流点亮。通过 74LS164
的输出来控制 8 个外接 LED 发光二极管亮灭的接口电路。当串行口被设置在方式输出时,串行数据由 RXD 端送出,移位脉冲由 TXD 端送出,在移位脉冲作用下,
串行口发送缓冲器的数据逐位地从 RXD 端串行移入 74LS164 中。
1.画出硬件电路连接示意图。
用NotePad编写源程序并用Keil调试
3. 在Keil uVision3中编译链接生成点阵.hex文件
4 . 把点阵.hex文件导入仿真电路图中,结果如下:
方式 0 输入应用:为串行口接入一片八位并行输入,串行输出的同步移位寄存器 74LS165,扩展一个八位并行输入口的电路,可将接在 74LS165 的八个开关状态通过串口方式 0 读入到单片机内。74LS165 的 SH/LD*端为控制端。若SH/LD*=0,则 74LS165 可以并行输入数据,且串行输出关闭, SH/LD*=1,并行输入关闭,串行输出。
1. 画出硬件电路连接示意图。
用NotePad编写源程序并用Keil调试
3. 在Keil uVision3中编译链接生成点阵.hex文件
4 . 把点阵.hex文件导入仿真电路图中,结果如下
①串口通信方式 0 输入
1.画出硬件电路连接示意图。
2. 用 NotePad 编写源程序并用 Keil 调试
3. 在Keil uVision3中编译链接生成点阵.hex文件
4 . 把点阵.hex文件导入仿真电路图中,结果如下
②串口通信多机通信代码
1.画出硬件电路连接示意图。
用NotePad编写源程序并用Keil调试
3. 在Keil uVision3中编译链接生成点阵.hex文件
4 . 把点阵.hex文件导入仿真电路图中,结果如下
七、实验总结
通过本次串口实验,我对串口通信的知识了解的更透彻,这是在刚开始对串口通信知识不了解的情况下就编程而造成许多错误之后才得到的结果。当采用PC机与微处理器进行串口通信时,必须正确配置串口通信控件的属性值,才能保证数据传输的准确无误。
八、实验过程中遇到的问题及其解决的措施
1、遇到的问题:方式 0 输入应用中电阻值过大,LED没有亮。
解决措施:把它们一起选中换成较小的电阻。
2、遇到的问题:为端口编号时,编号有重复的,编号也不对应。
解决措施:重新编号。
完整的单片机实验报告51hei下载地址(含源码):
http://www.51hei.com/bbs/dpj-99543-1.html
-
基于STM32CubeMX串口通信实验
2020-04-20 14:52:26基于STM32CubeMX串口通信实验,实现返回所发送的数据,可作为开发参考例程或学习参考例程,单片机型号为STM32F407,串口为USART1,中英文兼容。 -
USART串口通信实验
2021-05-26 19:36:04文章目录串口简介串口通信基本原理常用串口相关寄存器串口操作相关函数硬件连接串口配置一般步骤例程参考升级版 串口简介 详情见STM32F4开发指南 串口通信基本原理 常用串口相关寄存器 1、USART_SR状态寄存器 2、... -
串口通信实验报告 含代码
2011-10-18 09:59:37串口通信实验报告 含代码 串口通信实验报告 含代码 串口通信实验报告 含代码 串口通信实验报告 含代码 串口通信实验报告 含代码 -
STM32——串口通信实验
2021-11-18 11:13:32STM32串口通信实验初始化结构体1、USART初始化结构体:2、同步时钟初始化结构体:函数1、串口初始化函数2、中断配置函数3、串口使能函数4、数据发送函数5、数据接收函数6、中断状态位获取函数 初始化结构体 1、USART... -
【经典】串口通信实验报告
2021-07-29 05:07:19《【经典】串口通信实验报告》由会员分享,可在线阅读,更多相关《【经典】串口通信实验报告(4页珍藏版)》请在人人文库网上搜索。1、VB串口通信实验1实验要求:设计一个串口通信程序,用于信息的接收和发送2实验目的... -
51单片机串口通信实验
2015-11-27 20:00:51最简洁的单片机串口通信程序,芯片STC15系列 一个同学写的,希望不算盗用版权 -
FPGA串口通信实验
2021-03-07 08:41:51串口通信是FPGA较为基础的一个实验,本人在初学FPGA后决定将其整理一下并进一步加强自身理解。 串口简介 串口也称串行通信接口或串行通讯接口,是采用串行通信方式的扩展接口。目前人们使用的所有计算机操作系统都... -
TKM32F499评估板串口通信实验
2021-01-06 04:29:01我们在上面这篇文章已经领会了TKM32F499的强大了,接下来进入主题,串口通信实验。 1、TKM32F499通用异步收发器(UART)数据结构及参数描述 在UART库的头文件里,UART由一个结构体进行维护: typedef struct { //波特...