UART直连间的通讯只能是一对一的,无法实现一对多通信。232也不能1对多。因为总线收发电平会冲突

402 篇文章 172 订阅

作者:玩转嵌入式
链接:https://www.zhihu.com/question/644689459/answer/3399780866
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
 

UART直连间的通讯只能是一对一的,无法实现一对多通信。

1.UART无法实现一对多通信

UART是最基本的通信方式,单片机上基本都有UART片上资源,具有两个引脚,TXD和RXD,在与通信设备连接时双方要交叉连接。

UART

UART是异步、全双工、串行通讯,也就是常说的串口通信UART空闲时的电平为高电平,要发送数据时,TXD管脚会拉低电平,这时对方可以接收到数据。

但是对方如果要发送数据的话,会把TXD拉低,此时主机和其他从设备的TXD会被拉低,一个设备要拉低电平,而另一个设备却要拉高电平。这样电平逻辑就出现问题了。

不能一对多

2.什么是一对多通信

所谓一对多通信,就是在一组网络中有多个设备可以实现数据的交换。而现在的拓扑结构中,要求一个主机和多个从机。主机控制总线,从机可以寻址。

比较常用的组网通信有RS485、CAN等。

RS485一对多通信

RS485在工控行业应用广泛,一个主机控制多个从机,实现数据采集和控制。而CAN总线在汽车上应用广泛,一台CAN主机控制多台CAN从机,实现组网。

3.UART如何实现一对多

UART直连无法实现一对多通信,可以通过加收发器扩展为多机通信。如上面提到的RS485接口。

RS485电路

单片机的UART口和RS485收发器,如SP3485,就可以实现RS485的一主多从机通信。每个从机都有一个唯一的地址,通讯报文中含有地址信息,通过从机地址实现主机对每个从机的数据查询和数据写入。

总之,UART设备直连无法实现一对多数据通信,但是可以通过加收发器扩展的方式实现多机通讯。

以上就是这个问题的回答,如有任何问题都可以留言讨论。

单片机Uart通信为什么不能多点通信? - 知乎

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用 ESP-IDF 实现 ESP32 RS485 一对多通信的示例代码: ```c #include <stdio.h> #include "driver/uart.h" #include "driver/gpio.h" #define UART_NUM UART_NUM_1 #define TXD_PIN (GPIO_NUM_4) #define RXD_PIN (GPIO_NUM_5) #define RS485_EN_PIN (GPIO_NUM_21) #define RS485_BAUD_RATE 9600 #define RS485_DATA_BITS UART_DATA_8_BITS #define RS485_PARITY UART_PARITY_DISABLE #define RS485_STOP_BITS UART_STOP_BITS_1 #define RS485_FLOW_CTRL UART_HW_FLOWCTRL_DISABLE #define RS485_FRAME_SIZE 8 #define RS485_DEVICE_COUNT 4 static void rs485_init() { uart_config_t uart_config = { .baud_rate = RS485_BAUD_RATE, .data_bits = RS485_DATA_BITS, .parity = RS485_PARITY, .stop_bits = RS485_STOP_BITS, .flow_ctrl = RS485_FLOW_CTRL, }; uart_param_config(UART_NUM, &uart_config); uart_set_pin(UART_NUM, TXD_PIN, RXD_PIN, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE); uart_driver_install(UART_NUM, RS485_FRAME_SIZE * RS485_DEVICE_COUNT, 0, 0, NULL, 0); gpio_set_direction(RS485_EN_PIN, GPIO_MODE_OUTPUT); } static void rs485_enable_tx() { gpio_set_level(RS485_EN_PIN, 1); } static void rs485_disable_tx() { gpio_set_level(RS485_EN_PIN, 0); } static void rs485_send_frame(uint8_t device_id, uint8_t *data) { rs485_enable_tx(); uart_write_bytes(UART_NUM, (const char *)&device_id, 1); uart_write_bytes(UART_NUM, (const char *)data, RS485_FRAME_SIZE - 1); rs485_disable_tx(); } void app_main() { rs485_init(); uint8_t data[RS485_FRAME_SIZE - 1] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 }; for (int i = 1; i <= RS485_DEVICE_COUNT; i++) { rs485_send_frame(i, data); } } ``` 在这个示例中,我们使用 `uart_driver_install()` 函数配置 UART 驱动程序,以便能够发送 RS485 帧。我们使用 GPIO 配置 RS485 发送使能引脚,并使用 `rs485_enable_tx()` 和 `rs485_disable_tx()` 函数控制该引脚的状态。`rs485_send_frame()` 函数用于发送带有设备 ID 的 RS485 帧。 在 `app_main()` 函数中,我们发送相同的数据帧到四个不同的设备。你可以根据需要修改此代码以适应你的特定应用程序。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值