嵌入式系统 实验二 串口通信实验

实验二 串口通信实验

一、实验目的

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两个函数。在引脚的选择方面查阅了关于复用的参数。
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值