关于stm32串口通信:多从机发送,单主机使用同一个串口接收,无需RS485/232

最近,老师要求使用stm32做一个项目,本人串口通信方面的调试。直接上干货:

最开始老师要求像下图这样连接,一开始我是抱着怀疑的想法的,没想到最后真的调通了。

实测验证,当多个从机发送,一个主机接收时,如上图,需要将从机的TX引脚设置为GPIO_Mode_AF_OD (复用开漏输出),否则会出现无法正常收发数据的现象。

 节点1/2为从机,3为主机,3通过串口1接收到节点1/2发送的数据,再通过NFR24L01无线模块,发送至4, 最终利用4显示1/2所发送的数据。结果表明,能正常收发数据,数据准确无误,但是有2-3秒的延时。怀疑是由无线模块导致的时延,但未对其进行验证。

 

  • 4
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,下面是一个基本的RS485通信程序,使用STM32F103的USART3,可以发送和接收信息: ```c #include "stm32f10x.h" #define RS485_DE_Pin GPIO_Pin_15 #define RS485_DE_Port GPIOA void USART3_Init(void); void RS485_SendData(uint8_t *data, uint16_t len); void RS485_ReceiveData(uint8_t *data, uint16_t len); int main(void) { uint8_t txData[] = "Hello, world!"; uint8_t rxData[50]; USART3_Init(); while (1) { // 发送数据 RS485_SendData(txData, sizeof(txData)); // 接收数据 RS485_ReceiveData(rxData, sizeof(rxData)); } } void USART3_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; USART_InitTypeDef USART_InitStruct; // 使能USART3、GPIOA时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 配置USART3的Tx、Rx引脚 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOB, &GPIO_InitStruct); GPIO_InitStruct.GPIO_Pin = GPIO_Pin_11; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOB, &GPIO_InitStruct); // 配置DE引脚,用于控制RS485芯片的发送和接收模式 GPIO_InitStruct.GPIO_Pin = RS485_DE_Pin; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(RS485_DE_Port, &GPIO_InitStruct); // 配置USART3 USART_InitStruct.USART_BaudRate = 9600; 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(USART3, &USART_InitStruct); // 使能USART3接收中断 USART_ITConfig(USART3, USART_IT_RXNE, ENABLE); // 使能USART3 USART_Cmd(USART3, ENABLE); } void RS485_SendData(uint8_t *data, uint16_t len) { // 切换到发送模式 GPIO_SetBits(RS485_DE_Port, RS485_DE_Pin); for (uint16_t i = 0; i < len; i++) { // 发送数据 USART_SendData(USART3, data[i]); // 等待发送完成 while (USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET); } // 等待发送完成 while (USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET); // 切换到接收模式 GPIO_ResetBits(RS485_DE_Port, RS485_DE_Pin); } void RS485_ReceiveData(uint8_t *data, uint16_t len) { for (uint16_t i = 0; i < len; i++) { // 等待接收数据 while (USART_GetFlagStatus(USART3, USART_FLAG_RXNE) == RESET); // 读取数据 data[i] = USART_ReceiveData(USART3); } } ``` 在发送数据前,需要将DE引脚置高,表示进入发送模式;发送完成后,需要等待发送完成,并将DE引脚置低,表示进入接收模式。接收数据时,只需要等待数据接收完成,并读取数据即可。 需要注意的是,这里的程序只是一个基本的示例,实际应用中还需要根据自己的需求进行修改和优化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值