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

实验二 串口通信实验

一、实验目的

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

嵌入式串口通信实验可以分为两个部分:硬件部分和软件部分。硬件部分是通过串口将数据发送和接收到嵌入式系统,而软件部分是通过编写程序实现数据的发送和接收。以下是一个简单的嵌入式串口通信实验流程: 硬件部分: 1. 确定使用的嵌入式开发板,根据开发板手册确定串口引脚。 2. 连接串口线,将开发板的串口引脚与PC的串口相连。 软件部分: 1. 初始化串口,设置波特率、数据位、奇偶校验位等参数。 2. 编写发送程序,将数据发送到串口。 3. 编写接收程序,从串口读取数据。 下面是一个简单的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <fcntl.h> #include <termios.h> #define SERIAL_PORT "/dev/ttyS0" int main(int argc, char *argv[]) { int fd; struct termios options; fd = open(SERIAL_PORT, O_RDWR | O_NOCTTY | O_NDELAY); if (fd == -1) { perror("open"); return -1; } tcgetattr(fd, &options); cfsetispeed(&options, B9600); cfsetospeed(&options, B9600); options.c_cflag |= (CLOCAL | CREAD); options.c_cflag &= ~CSIZE; options.c_cflag |= CS8; options.c_cflag &= ~PARENB; options.c_cflag &= ~CSTOPB; options.c_cflag &= ~CRTSCTS; tcsetattr(fd, TCSANOW, &options); char buf[] = "hello world"; write(fd, buf, strlen(buf)); char buf2[256]; memset(buf2, 0, sizeof(buf2)); read(fd, buf2, sizeof(buf2)); printf("Received: %s\n", buf2); close(fd); return 0; } ``` 这个程序打开串口设备"/dev/ttyS0",设置波特率为9600,发送"hello world"字符串,然后从串口读取数据并打印出来。注意,在使用串口时需要注意数据的格式和传输方式,以免出现通信错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值