STM32普通串口一对多通信/USART无需添加485拓展

STM32串口一对多通信/USART一主多从无需添加485/232进行串口拓展

本人因为项目研究需要完成多板的通信需求,但是对于速度和同步要求不高,
为了简化设计方便,就想着使用串口完成一对多通信,
一来是硬件简单不需要外加,
二是USART的配置简单,门槛低...~~(其实就是我懒)~~ 

为了方便测试,先将两块STM32刷入1个已经编号的程序.
like this:
Id0_1号板
Id1_2号板
因为现在功能是检验一对多通信,所以功能比较简单,
就是如果收到识别号并识别成功就发送一句返回信号!
Id0 → get past 1!
Id1 → get past 2!
PS:两个板子的连接都是用的同一波特率9600
emmmmm 突然觉得要是每个板子不同波特率,是不是可以不用设置序列号了啊…等你去发现哦!
当然第一次很简单,天真的以为会通信上…
连线也是模仿IIC的方式.
错误示范!
¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥
/// /// 以上连线是错误示范
¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥
这样是无论如何都接受不到数据的…
尝试了许多次失败后总结出来的.

在重新翻阅了许多遍串口相关的书籍资料以后,(其实是看了485、232,modbus协议以后还是觉得再尝试尝试…)
正确图示
改用以上连线后,通过串口助手发送数据测试…
在这里插入图片描述
在这里插入图片描述
虽然电路很简单,查阅了许多资料都建议使用RS485/232或者是改用SPI,CAN的通信,但是还是发个博记录一下吧。
关于连接从机数目问题,可以在主机的RX线上拉电阻到VCC,提供输出能力,也是很好的办法,
可能这个还有更加简单的办法,我只是抛个砖,如果有别的更好的方法,欢迎来私,多多指教!! Thanks
实验平台:stm32f030f4p6
编辑器:Keil5
下载器:ST-link

  • 29
    点赞
  • 123
    收藏
    觉得还不错? 一键收藏
  • 16
    评论
以下是基于STM32F103的USART3的RS485通信代码,代码中包含了发送和接收数据的函数: ```c #include "stm32f10x.h" #include <stdio.h> void USART3_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); //USART3_TX PB10 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); //USART3_RX PB11 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOB, &GPIO_InitStructure); //USART3_RE PB12 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOB, &GPIO_InitStructure); USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART3, &USART_InitStructure); USART_Cmd(USART3, ENABLE); } void USART3_SendData(uint8_t *pucBuffer, uint16_t uiLength) { GPIO_SetBits(GPIOB, GPIO_Pin_12); while (uiLength--) { USART_SendData(USART3, *pucBuffer++); while (USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET) { } } while (USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET) { } GPIO_ResetBits(GPIOB, GPIO_Pin_12); } void USART3_ReceiveData(uint8_t *pucBuffer, uint16_t uiLength) { while (uiLength--) { while (USART_GetFlagStatus(USART3, USART_FLAG_RXNE) == RESET) { } *pucBuffer++ = USART_ReceiveData(USART3); } } ``` 在主函数中可以调用上述函数实现RS485通信: ```c int main(void) { uint8_t send_buffer[] = "Hello World!"; uint8_t receive_buffer[32]; USART3_Configuration(); while (1) { USART3_SendData(send_buffer, sizeof(send_buffer)); USART3_ReceiveData(receive_buffer, sizeof(receive_buffer)); } } ``` 在上述代码中,发送数据时需要先将RE置为高电平,然后通过USART3_SendData函数发送数据。接收数据时需要等待接收完成,然后通过USART3_ReceiveData函数将接收到的数据存储到缓冲区中。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值