RT-Thread / rt-thread

RT-Thread is an open source IoT Real-Time Operating System (RTOS).
https://www.rt-thread.io
Apache License 2.0
10.37k stars 4.99k forks source link

[serial_v2] support half duplex. #9480

Open sulfurandcu opened 5 days ago

sulfurandcu commented 5 days ago

拉取/合并请求描述:(PR description)

[

为什么提交这份PR (why to submit this PR)

使串口驱动(serial_v2)支持半双工通信。

对比用软件包的形式实现半双工通信(i.e. rt-thread-rs485),在 serial 中支持半双工通信的优势是可以更方便地在半双工口(比如rs485)上适配 console 和 ymodem 等组件。

你的解决方案是什么 (what is your solution)

请提供验证的bsp和config (provide the config and bsp)

]

当前拉取/合并请求的状态 Intent for your PR

必须选择一项 Choose one (Mandatory):

代码质量 Code Quality:

我在这个拉取/合并请求中已经考虑了 As part of this pull request, I've considered the following:

wdfk-prog commented 3 days ago

或许可以搞个宏配置选项,是否要开启半双工?

sulfurandcu commented 3 days ago

目前是检查是否配置了收发切换引脚,如果没配置的话默认还是全双工通信。不过加上宏配置的话代码应该会更清晰些。

wdfk-prog commented 3 days ago

目前是检查是否配置了收发切换引脚,如果没配置的话默认还是全双工通信。不过加上宏配置的话代码应该会更清晰些。

我是考虑到固件大小的优化;你这样等于默认平白无故多了些大小

sulfurandcu commented 3 days ago

添加了 RT_SERIAL_USING_HALF_DUPLEX 宏配置

头文件中因为有RT_SERIAL_CONFIG_DEFAULT的存在,所以serial_configure结构体里面新增的dulpex相关字段没有用这个宏包起来(暂时没想到好的方法😅)

sulfurandcu commented 3 days ago

串口半双工通信,程序通过改变引脚电平切换到tx模式后,有可能会需要延时一段时间,来等待硬件真正地切换到发送模式,这个延时操作的实现方案,我想了以下几种,各位大佬给评估一下哪种更合适,或者有木有更好的实现方式。

图片

Ryan-CW-Code commented 2 days ago

个人建议还是把半双工的控制交给用户。 如果一定要集成到驱动内部,个人感觉方案4会更好,更通用些。但是用户要知道回调函数里面能干什么,不能干什么。

milo-9 commented 2 days ago

我建议不要在驱动里做这个事情,很多MCU的uart外设本身就有半双工功能,只需要在config里加入是否使能半双工的选项就行,如果外设不支持,那么由BSP决定是否使用软件去模拟。 我大致看了一下你这个,应该是为了应对使用485收发器这类场景吧,这种情况下,这是属于上层的事情了,驱动框架层一般是不建议用户直接使用的,在实际应用当中,往往会在驱动框架层上再包装一层,这一层就用来解决485这类场景了

wdfk-prog commented 1 day ago

我觉得可以加,有些用户压根就没有编写的能力;提供一个大致的实现流程给配置挺好.

milo-9 commented 1 day ago

我觉得可以加,有些用户压根就没有编写的能力;提供一个大致的实现流程给配置挺好.

问题是,他这个不是驱动的半双工,是应用的半双工,驱动的半双工是外设完成的,他这个是控制外围器件,放到驱动里是不应该的