实验二 串口通信实验
一、实验目的
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两个函数。在引脚的选择方面查阅了关于复用的参数。