串口框架V1和V2版本对比

本文对比了RT-Thread串口框架的V1和V2版本,V2版本取消了硬件工作模式判断,统一操作接口,解决了V1版本中发送模式不完善、 DMA发送可能导致丢包及模式影响应用层逻辑等问题。V2版本增加了发送缓冲区,每个串口有独立的接收和发送缓冲区宏定义,同时完善了工作模式,确保操作模式的一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文由RT-Thread官方论坛用户123原创发布:https://club.rt-thread.org/ask/article/2915.html

串口框架V1和V2版本对比

V1版本串口框架(以及驱动)总结

这部分的总结,其实也是在之前写的串口V1版本的文章中有所提及的,这里大致再总结一下,如果初次查看的话,可能会造成一些困扰,那么就去请先去查看之前的三篇文章:串口(一)串口(二)串口(三)相信看完之后会更加清晰一些。另外如果有任何描述不当或者分析不对的地方,尽情评论区发言或者直接私信我。

  • 发送模式不够完善:

    • 串口驱动中,发送中断模式未发挥出中断应有的特性,造成使用中断时,仍然需要浪费大量CPU时间,影响系统整体性能。
  • DMA发送使用不当容易丢包:

    • 当写数据为轮询或者中断时,调用rt_device_write正确返回后即代表数据发送完成。而使用DMA时,调用rt_device_write返回后仅仅代表数据准备完毕,并不能代表数据发送完成,如果用户在正确返回后再次调用rt_device_write,将有可能出现上次数据未发送完成,数据又被修改的发送数据错误的问题。
  • 不同模式时,影响应用层执行逻辑:

    • 结合第二点再引申下来这个问题:当使用中断和轮询时,发送模式为阻塞模式,使用DMA时,发送模式为非阻塞模式,且未对数据块进行保护。另外不仅仅是发送端的考虑,接收端也有可能会出现阻塞和非阻塞的模式选择问题。因此框架层应该更多关心阻塞非阻塞的操作模式,使得应用层执行流程能够统一。

V2版本的串口框架(以及驱动)主要改动点:

  • 取消了硬件工作模式的判断,硬件工作模式由驱动层支持,使得框架层与 硬件工作模式 无关;
  • 统一操作接口,应用层不再关心 硬件工作模式,
  • 统一使用 阻塞/非阻塞 操作模式,不会因为模式的变更导致应用层逻辑代码行为不一致。
  • 增加发送缓冲区功能,保证应用层数据的完整性,从而解决丢包率;
  • 每一路的串口都有独立的发送缓冲区和接收缓冲区的宏定义,取代之前的所有串口默认使用RT_SERIAL_RB_BUFSZ这一个宏定义。
  • 完善工作模式,分工明确,轮询、中断、DMA都能按照正确的工作模式执行。

ps: 这里我用了两个词汇用来区分模式:硬件工作模式和应用操作模式,这两个词汇可能不是官方用词,这里旨在用来区别描述上的混淆和困扰

硬件工作模式: 指串口的三种模式,代表的是使用轮询、中断、DMA进行操作串口时的工作模式。
应用操作模式: 指串口的实际操作模式,代表的是应用层使用串口时选择使用阻塞或非阻塞传输的操作模式。

V1和V2版本对比

V2版本的在使用上的改动点,上文已经描述过了,下面主要从代码层面以及用户使用上对比两个版本的差异。

结构体的成员变量的变更

serial_configure

修改V1版本的bufszrx_bufsz,指代的含义未变更,均指代接收缓冲区字节长度;增加发送缓冲区字节长度的成员变量tx_bufsz。具体如下代码段所示:

/* V1版本的成员变量 */
struct serial_configure
{
   
    rt_uint32_t baud_rate;

    rt_uint32_t data_bits               :4;
    rt_uint32_t stop_bits               :2;
    rt_uint32_t parity                  :2;
    rt_uint32_t bit_order               :1;
    rt_uint32_t invert                  :1;
    rt_uint32_t bufsz                   :16;
    rt_uint32_t reserved                :6;
};

/* V2版本的成员变量 */
struct serial_configure
{
   
    rt_uint32_t baud_rate;

    rt_uint32_t data_bits               :4;
    rt_uint32_t stop_bits               :2;
    rt_uint32_t parity                  :2;
    rt_uint32_t bit_order               :1;
    rt_uint32_t invert                  :1
<think>好的,用户现在问socket除了支持TCPUDP之外,还有其他协议吗?我需要先回忆一下socket支持的不同协议族类型。首先,常见的协议族有AF_INET(IPv4)、AF_INET6(IPv6)、还有Unix域套接字(AF_UNIX)等。不过用户可能更关注的是传输层协议,除了TCPUDP之外还有什么。 记得在socket的创建函数中,第三个参数protocol有时可以指定不同的协议,比如SOCK_RAW允许使用原始套接字,直接处理IP层或更底层的数据包,比如ICMP、IGMP这些。还有SCTP(流控制传输协议),这是一个结合了TCPUDP特点的协议,支持多宿性多流传输。另外,像DCCP(数据报拥塞控制协议),用于需要及时性但不一定可靠传输的场景,比如流媒体。 还有像IPX/SPX这样的协议,不过现在可能已经不太常用了。另外,蓝牙协议也可能通过socket接口来访问,比如AF_BLUETOOTH。还有CAN协议用于汽车网络,或者像AF_PACKET用于底层的数据链路层访问。 用户可能是在开发网络应用时遇到了需要其他协议的情况,或者想扩展知识面。需要分门别类地解释,比如按协议族、类型来区分,同时给出实际应用的例子,这样用户更容易理解。还要注意避免过于技术化的术语,用通俗的语言说明每个协议的特点应用场景。例如,原始套接字可以用于网络诊断工具,ICMP用于ping,SCTP在电信领域应用较多等。 需要检查是否有遗漏的协议,比如Unix域套接字虽然不属于TCP/UDP,但是属于同一API的不同协议族,是否需要提到?可能用户是想知道传输层的其他协议,但为了全面性,可以简要提及其他协议族的情况。此外,像WebSocket虽然是应用层协议,但底层还是基于TCP的,可能不需要在这里讨论。 总结回答结构:先总述socket支持多种协议,然后分协议族、类型,举出例子,每个例子说明用途特点,最后给出选择建议。这样用户能有一个清晰的框架,了解除了常见的TCP/UDP之外还有哪些选项,以及它们的应用场景。</think>以下是Socket支持的协议类型及其应用详解: --- ### **一、核心传输层协议** #### **1. 原始套接字 (SOCK_RAW)** - **协议编号**:`IPPROTO_RAW` (255) - **功能特性**: - 直接访问网络层协议头 - 可构造自定义协议数据包 - 需要管理员权限(root/Administrator) - **典型应用**: ```c // C语言示例 int sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); ``` - 网络诊断工具 (如ping使用ICMP) - 自定义协议开发 - 网络安全扫描工具 #### **2. SCTP协议 (流控制传输协议)** - **协议标识**:`IPPROTO_SCTP` (132) - **核心优势**: - 多宿性支持(多网卡冗余) - 多流传输(避免队头阻塞) - 消息边界保留 - **典型场景**: - 电信SS7信令传输 - 实时金融交易系统 - 高可靠性VoIP系统 #### **3. DCCP协议 (数据报拥塞控制协议)** - **协议标识**:`IPPROTO_DCCP` (33) - **设计特点**: - 类UDP的无连接特性 - 内置拥塞控制机制 - 支持半关闭连接 - **应用领域**: - 流媒体传输 (如WebRTC部分实现) - 在线游戏实时状态更新 - 物联网传感器网络 --- ### **二、特殊网络协议族** #### **1. Unix域套接字 (AF_UNIX)** - **地址格式**:文件系统路径 - **性能优势**: - 比TCP本地环回快3-5倍 - 无需网络协议栈开销 - 支持传递文件描述符 - **典型应用**: ```python # Python示例 import socket sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) sock.bind("/tmp/mysocket.sock") ``` - 进程间通信(IPC) - 容器间通信 - 数据库客户端/服务端本地通信 #### **2. 蓝牙协议族 (AF_BLUETOOTH)** - **协议分层**: - L2CAP (逻辑链路控制与适配协议) - RFCOMM (串口仿真) - HCI (主机控制接口) - **开发示例**: ```c // C语言蓝牙服务端 struct sockaddr_rc addr = {0}; addr.rc_family = AF_BLUETOOTH; bacpy(&addr.rc_bdaddr, BDADDR_ANY); addr.rc_channel = (uint8_t)1; bind(sock, (struct sockaddr *)&addr, sizeof(addr)); ``` #### **3. CAN总线协议 (AF_CAN)** - **数据结构**: ```c struct can_frame { canid_t can_id; // 32位ID + EFF/RTR/ERR标志 __u8 can_dlc; // 数据长度 (0-8) __u8 data[8]; // 有效数据 }; ``` - **典型应用**: - 汽车ECU通信 - 工业控制系统 - 机器人实时控制 --- ### **三、网络层协议扩展** #### **1. ICMP协议** - **报文类型**: | 类型值 | 含义 | |-------|-----------------| | 0 | Echo应答 | | 3 | 目的不可达 | | 8 | Echo请求 | | 11 | 超时 | - **高级用法**: ```python # Python原始ICMP实现 import socket import struct def checksum(data): sum = 0 for i in range(0, len(data), 2): sum += (data[i] << 8) + data[i+1] sum = (sum >> 16) + (sum & 0xffff) return ~sum & 0xffff icmp_type = 8 # Echo请求 icmp_code = 0 icmp_checksum = 0 icmp_id = 1234 icmp_seq = 1 payload = b'abcdefghijklmnop' header = struct.pack('!BBHHH', icmp_type, icmp_code, icmp_checksum, icmp_id, icmp_seq) icmp_checksum = checksum(header + payload) header = struct.pack('!BBHHH', icmp_type, icmp_code, socket.htons(icmp_checksum), icmp_id, icmp_seq) ``` #### **2. IPPROTO_IGMP (组管理协议)** - **版本对比**: | 版本 | 主要特性 | |------|-----------------------------| | v1 | 基本组成员管理 | | v2 | 快速离开机制 | | v3 | 源特定组播(SSM)支持 | - **网络配置**: ```bash # Linux启用组播路由 sysctl -w net.ipv4.ip_forward=1 sysctl -w net.ipv4.conf.all.mc_forwarding=1 ``` --- ### **四、协议选择矩阵** | 需求场景 | 推荐协议 | 性能指标 | |------------------------|---------------|--------------------| | 可靠文件传输 | TCP | 吞吐量 >100Mbps | | 实时视频会议 | UDP + RTP | 延迟 <200ms | | 大规模设备发现 | UDP组播 | 并发连接数 >10k | | 高可用集群通信 | SCTP | 故障切换 <500ms | | 车载网络通信 | CAN | 速率 1Mbps | | 本地进程间通信 | AF_UNIX | 延迟 <10μs | --- ### **五、协议开发建议** 1. **性能优先场景**: - 本地通信首选Unix域套接字 - 广域网视频传输考虑DCCP - 高频交易系统使用RDMA over Sockets 2. **可靠性要求**: - 金融系统:TCP + TLS - 物联网:MQTT over TCP - 电信系统:SCTP + Diameter协议 3. **特殊网络环境**: ```mermaid graph LR A[网络特性] --> B{丢包率} B -->|>5%| C[使用QUIC协议] B -->|<2%| D[使用TCP优化] A --> E{延迟要求} E -->|>100ms| F[考虑前向纠错] E -->|<50ms| G[优化协议头开销] ``` 通过合理选择协议类型,可使网络应用性能提升3-10倍。实际开发中建议使用`getsockopt()``setsockopt()`进行协议参数调优。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值