Stm32f103实现一个串口接收,另一个串口发送消息(USART通信)

本文介绍了如何使用STM32F103微控制器实现串口通信,当通过USART1接收到特定命令(如1 )时,通过USART3向另一设备发送响应消息。主要涉及串口1和串口3的配置与使能,以及串口数据的接收与发送流程。
摘要由CSDN通过智能技术生成

做这个是因为我首先是语音模块进行串口通信,当我说开灯的时候,语音模块的串口会通过USART1即(PA9与PA10)

 

会发送1\r\n即开灯的命令,随后STM32F会接收到1的字符串,当接受到1的字符串时,他就发送消息到串口3

效果演示:

 首先使能串口1与串口3

#include "sys.h"
#include "usart.h"	  

//
//加入以下代码,支持printf函数,而不需要选择use MicroLIB	  
#if 1
#pragma import(__use_no_semihosting)             
//标准库需要的支持函数                 
struct __FILE 
{ 
	int handle; 

}; 

FILE __stdout;       
//定义_sys_exit()以避免使用半主机模式    
_sys_exit(int x) 
{ 
	x = x; 
} 
//重定义fputc函数 
int fputc(int ch, FILE *f)
{      
	while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   
    USART1->DR = (u8) ch;      
	return ch;
}
#endif
 
#if EN_USART3_RX   //如果使能了接收
//串口2中断服务程序
//注意,读取USARTx->SR能避免莫名其妙的错误   	
u8 USART_RX_BUF[USART_REC_LEN];     //接收缓冲,最大USART_REC_LEN个字节.
//接收状态
//bit15,	接收完成标志
//bit14,	接收到0x0d
//bit13~0,	接收到的有效字节数目
u16 USART_RX_STA=0;       //接收状态标记	  
  
void uart1_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,G
是的,STM32F103USART串口可以同时进行数据发送接收。下面是一个示例代码: ```c #include "stm32f10x.h" void USART1_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; USART_InitTypeDef USART_InitStruct; // 使能 USART1 和 GPIOA 时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE); // 配置 USART1 引脚 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; // USART1_TX 和 USART1_RX GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出 GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; // IO口速度为50MHz GPIO_Init(GPIOA, &GPIO_InitStruct); // 配置 USART1 参数 USART_InitStruct.USART_BaudRate = 115200; // 波特率为115200 USART_InitStruct.USART_WordLength = USART_WordLength_8b; // 字长为8位数据格式 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; // 发送接收模式 // 初始化 USART1 USART_Init(USART1, &USART_InitStruct); // 使能 USART1 接收中断 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); // 使能 USART1 USART_Cmd(USART1, ENABLE); // 配置 NVIC 中断优先级 NVIC_InitTypeDef NVIC_InitStruct; NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn; // USART1 中断通道 NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0; // 抢占优先级为0 NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0; // 子优先级为0 NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; // 使能中断通道 NVIC_Init(&NVIC_InitStruct); } void USART1_SendData(uint16_t data1, uint16_t data2) { while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET) {} // 等待发送缓冲区为空 USART_SendData(USART1, data1); while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET) {} // 等待发送缓冲区为空 USART_SendData(USART1, data2); } void USART1_IRQHandler(void) { if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) // 接收数据寄存器非空中断 { uint16_t receivedData = USART_ReceiveData(USART1); // 读取接收到的数据 // 处理接收到的数据 USART_ClearITPendingBit(USART1, USART_IT_RXNE); // 清除中断标志位 } } ``` 以上代码示例中,`USART1_Init` 函数用于初始化 USART1 的配置,将其配置为发送接收模式,并使能接收中断。`USART1_SendData` 函数用于发送两个数据,通过判断发送缓冲区是否为空来确保数据发送完成。`USART1_IRQHandler` 函数是 USART1 的中断处理函数,在接收数据时会触发中断,并进行相应的数据处理。 你可以根据自己的实际需求修改波特率、引脚等配置,并在 `USART1_IRQHandler` 函数中添加你需要的数据处理逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

苏师

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

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

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

打赏作者

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

抵扣说明:

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

余额充值