STM32f103入门(12)USART串口信息发送+接收

介绍

在这里插入图片描述
在这里插入图片描述在这里插入图片描述
电平标准是数据1和数据0的表达方式,是传输线缆中人为规定的电压与数据的对应关系,串口常用的电平标准有如下三种:

TTL电平:+3.3V或+5V表示1,0V表示0
RS232电平:-3-15V表示1,+3+15V表示0
RS485电平:两线压差+2+6V表示1,-2-6V表示0(差分信号)

串口参数
波特率:串口通信的速率
起始位:标志一个数据帧的开始,固定为低电平
数据位:数据帧的有效载荷,1为高电平,0为低电平,低位先行
校验位:用于数据验证,根据数据位计算得来
停止位:用于数据帧间隔,固定为高电平

在这里插入图片描述
在这里插入图片描述

USART(Universal Synchronous/Asynchronous Receiver/Transmitter)通用同步/异步收发器
USART是STM32内部集成的硬件外设,可根据数据寄存器的一个字节数据自动生成数据帧时序,从TX引脚发送出去,也可自动接收RX引脚的数据帧时序,拼接为一个字节数据,存放在数据寄存器里
自带波特率发生器,最高达4.5Mbits/s
可配置数据位长度(8/9)、停止位长度(0.5/1/1.5/2)
可选校验位(无校验/奇校验/偶校验)
支持同步模式、硬件流控制、DMA、智能卡、IrDA、LIN
STM32F103C8T6 USART资源: USART1、 USART2、 USART3
在这里插入图片描述

串口发送

使用工具

USB TO TTL

初始化

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //初始化USART外设
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //由于USART外设在GPIOA 所以初始化GPIO
	GPIO_InitTypeDef GPIO_InitStructure;		
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  // TX 输出设置为复用推挽输出  这里只用到了发送 
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);

///usart初始化
	USART_InitTypeDef USART_InitStructure;
	USART_InitStructure.USART_BaudRate = 9600;  // 波特率
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	USART_InitStructure.USART_Mode = USART_Mode_Tx; //需要发送还是接收  都可以选择
	USART_InitStructure.USART_Parity = USART_Parity_No;  //校验位  不选择
	USART_InitStructure.USART_StopBits = USART_StopBits_1;  //停止位 1
	USART_InitStructure.USART_WordLength = USART_WordLength_8b; //不需要校验 所以字长选择8
	USART_Init(USART1, &USART_InitStructure);
	
//开启usart
	USART_Cmd(USART1, ENABLE);

发送数据

void Serial_SendByte(uint8_t Byte)
{
	USART_SendData(USART1, Byte);  //发送数据byte 到 USARTDR   然后再发送给移位寄存器 最后一位一位的移出TX引脚
	while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);  //等待传送到移位寄存器   
	//不需要清零  在send data时自清零
}

重定向printf 使得printf输出到串口

int fputc(int ch, FILE *f)  //由于 fputc是printf的底层 所以修改foutc函数
{
	Serial_SendByte(ch);
	return ch;
}

发送数组跟字符串

void Serial_SendArray(uint8_t *Array, uint16_t Length)  //
{
	uint16_t i;
	for (i = 0; i < Length; i ++)  
	{
		Serial_SendByte(Array[i]);
	}
}

void Serial_SendString(char *String)
{
	uint8_t i;
	for (i = 0; String[i] != '\0'; i ++)
	{
		Serial_SendByte(String[i]);
	}
}

接收数据

初始化输入RX

	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	

接收

	while (1)
	{
		if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
	{
			RxData = USART_ReceiveData(USART1); 
			OLED_ShowHexNum(2, 1, RxData,2);
	}
}
  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
对于STM32F103系列的微控制器,串口收发数据包的实现步骤如下: 1. 配置串口参数:首先,你需要配置串口的波特率、数据位、停止位和校验位等参数。这可以通过修改USART_CR1和USART_CR2寄存器来实现。具体的配置取决于你的需求,可以参考STM32F103参考手册中的串口章节。 2. 初始化串口:在配置完成后,你需要初始化串口。这可以通过设置USART_CR1寄存器的UE位来使能串口。 3. 发送数据:要发送数据包,你可以将要发送的数据写入USART_DR寄存器。数据可以是单个字节或者是一系列字节的数组。你可以使用循环来发送多个字节的数据。 4. 接收数据:要接收数据包,你可以通过读取USART_DR寄存器来获取接收到的数据。你可以使用轮询方式或者中断方式来接收数据。 以下是一个简单的示例代码,演示了如何在STM32F103上进行串口收发数据包: ```c #include "stm32f10x.h" void USART2_Init(void) { // 配置GPIO引脚 GPIO_InitTypeDef GPIO_InitStruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2; // USART2_TX GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStruct); GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3; // USART2_RX GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStruct); // 配置USART2 USART_InitTypeDef USART_InitStruct; RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); USART_InitStruct.USART_BaudRate = 115200; USART_InitStruct.USART_WordLength = USART_WordLength_8b; USART_InitStruct.USART_StopBits = USART_StopBits_1; USART_InitStruct.USART_Parity = USART_Parity_No; USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART2, &USART_InitStruct); USART_Cmd(USART2, ENABLE); } void USART2_SendData(uint8_t data) { while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET); USART_SendData(USART2, data); } uint8_t USART2_ReceiveData(void) { while (USART_GetFlagStatus(USART2, USART_FLAG_RXNE) == RESET); return USART_ReceiveData(USART2); } int main(void) { USART2_Init(); // 发送数据包 uint8_t txData[] = {0x01, 0x02, 0x03}; for (int i = 0; i < sizeof(txData); i++) { USART2_SendData(txData[i]); } // 接收数据包 uint8_t rxData[sizeof(txData)]; for (int i = 0; i < sizeof(rxData); i++) { rxData[i] = USART2_ReceiveData(); } while (1) { // 主循环 } } ``` 这只是一个简单的例子,你可以根据自己的需求进行修改和扩展。希望对你有所帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

牛郎恋刘娘,刘娘念牛郎

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值