同步串口和异步串口的区别及使用情况

本文详细介绍了计算机系统中串行通信的两种主要形式:异步串行通信与同步串行通信。对比了这两种通信方式的特点、数据格式及应用场景,并分析了它们在实际应用中的优劣。
部署运行你感兴趣的模型镜像

在计算机系统中,CPU和外部通信有两种通信方式:并行通信和串行通信。而按照串行数据的时钟控制方式,串行通信又可分为同步通信和异步通信两种方式。

  1、异步串行方式的特点

  所谓异步通信,是指数据传送以字符为单位,字符与字符间的传送是完全异步的,位与位之间的传送基本上是同步的。异步串行通信的特点可以概括为:

  ①以字符为单位传送信息。

  ②相邻两字符间的间隔是任意长。

  ③因为一个字符中的比特位长度有限,所以需要的接收时钟和发送时钟只要相近就可以。

  ④异步方式特点简单的说就是:字符间异步,字符内部各位同步。

异步位系统是面向字符来传输信息的,也就是我们一般情况下的一个字符,8位,1bit,当然了传输的时候还要加上起始位和结束位,没有这两位接收方就不知道什么时候开始接收数据什么时候结束了。如此一来字符与字符之间就不是连着的,打个比喻,就像秋天的叶子一样,一片一片往下落。发送方和接收方不要求同步,就是说你想什么时候落就什么时候落,我都接着,用不着先通知我

  2、异步串行方式的数据格式

  异步串行通信的数据格式如图8-1所示,每个字符(每帧信息)由4个部分组成:

  ①1位起始位,规定为低电0;

  ②5~8位数据位,即要传送的有效信息;

  ③1位奇偶校验位;

  ④1~2位停止位,规定为高电平1。

 

                                                                       图1 异步串行数据格式

  3、同步串行方式的特点

  所谓同步通信,是指数据传送是以数据块(一组字符)为单位,字符与字符之间、字符内部的位与位之间都同步。同步串行通信的特点可以概括为:

  ①以数据块为单位传送信息。

  ②在一个数据块(信息帧)内,字符与字符间无间隔。

  ③因为一次传输的数据块中包含的数据较多,所以接收时钟与发送进钟严格同步,通常要有同步时钟。

步位系统就不同了,他要求发送方与接收方严格的同步,二者波特率要相同。

同步位系统传输的什么呢,不是字符,是字符组合,也就是帧,我们在OSI数据链路层可以学习到。帧的长度没有规定,传输的时候视情况而定吧。这个帧里面包含了同步信息,来通知接收方调整以同步。这里再打个比喻,前面我们说异步位系统传输的数据像树叶,那么同步位系统传输的就像是把这些树叶串成一串,是连续的。


  4、同步串行方式的数据格式

  同步串行通信的数据格式如图8-2所示,每个数据块(信息帧)由3个部分组成:

  ①2个同步字符作为一个数据块(信息帧)的起始标志;

  ②n个连续传送的数据

  ③2个字节循环冗余校验码(CRC)

 

                                                                        图2 同步串行数据格式

5.用途:

同步串行:通信网中,有大批量数据需要传输

异步串行:应用于在工业、实际应用中。适用于短距离、速率不高的情况下。

步位系统比异步位系统要实用高效。这个比较好理解,计算机对帧的处理比对字符要少的多,在传送相同大小的数据量的时候,计算机要对大量的字符进行开始与结束操作,帧则要少的多。同时同步位系统的下的网络效率也更高,因为每个字符都至少包含两位的开始结束信息,这个在数据量大的时候开销是很客观的。




您可能感兴趣的与本文相关的镜像

Langchain-Chatchat

Langchain-Chatchat

AI应用
Langchain

Langchain-Chatchat 是一个基于 ChatGLM 等大语言模型和 Langchain 应用框架实现的开源项目,旨在构建一个可以离线部署的本地知识库问答系统。它通过检索增强生成 (RAG) 的方法,让用户能够以自然语言与本地文件、数据库或搜索引擎进行交互,并支持多种大模型和向量数据库的集成,以及提供 WebUI 和 API 服务

<think>我们正在讨论同步异步串口打印的区别。注意,这里的“打印”指的是通过串口发送数据,通常用于调试或输出信息。 同步串口打印:在发送每个字符时,程序会等待该字符完全发送完成(即传输完成)后再继续执行下一个字符的发送。通常通过轮询标志位或使用阻塞函数实现。 异步串口打印:程序启动字符发送后,无需等待发送完成即可继续执行后续代码。通常通过中断或DMA(直接内存访问)实现,发送操作在后台进行。 下面详细说明两者的区别: 1. 执行方式: - 同步:阻塞式发送,每次调用发送函数都会等待发送完成。 - 异步:非阻塞式发送,发送函数启动发送后立即返回,发送过程由硬件在后台完成。 2. 资源占用: - 同步:占用CPU时间等待,效率较低,但实现简单。 - 异步:不占用CPU等待时间,效率高,但需要中断或DMA支持,实现较复杂。 3. 实时性: - 同步:由于需要等待,可能影响程序的实时性,尤其在高速传输或数据量大时。 - 异步:不会阻塞主程序,实时性较好。 4. 数据缓冲: - 同步:通常不需要缓冲区,因为每次发送都是阻塞的。 - 异步:需要缓冲区(如环形缓冲区)来存储待发送的数据,因为发送是异步进行的。 5. 使用场景: - 同步:适用于简单的应用,或者对实时性要求不高的场合。 - 异步:适用于需要高效率、高实时性的系统,特别是当需要连续发送大量数据时。 示例代码(伪代码)说明: 同步串口发送函数(假设有轮询标志位的函数): ```c void put_char_sync(uint8_t c) { while (!uart_tx_ready()); // 等待发送缓冲区为空 uart_send(c); // 发送字符 while (!uart_tx_complete()); // 等待发送完成(可选,有些硬件发送缓冲区为空即可) } ``` 异步串口发送函数(使用中断): ```c // 定义环形缓冲区 #define BUFFER_SIZE 128 static uint8_t tx_buffer[BUFFER_SIZE]; static volatile uint16_t tx_head = 0; static volatile uint16_t tx_tail = 0; // 启动发送(如果发送中断未使能,则启动) void put_char_async(uint8_t c) { // 将字符放入缓冲区 uint16_t next_head = (tx_head + 1) % BUFFER_SIZE; while (next_head == tx_tail) { } // 缓冲区满,等待(或者可以返回错误) tx_buffer[tx_head] = c; tx_head = next_head; // 如果发送中断未激活,则激活中断(第一次放入数据时启动发送) if (!uart_tx_interrupt_enabled()) { uart_enable_tx_interrupt(); } } // 中断服务程序 void UART_ISR(void) { if (uart_tx_interrupt_flag()) { if (tx_tail != tx_head) { uart_send(tx_buffer[tx_tail]); // 发送一个字符 tx_tail = (tx_tail + 1) % BUFFER_SIZE; } else { // 缓冲区空,关闭发送中断 uart_disable_tx_interrupt(); } } } ``` 总结: 同步方式简单直接,但效率低;异步方式高效,但需要额外的缓冲区管理机制(如中断服务程序)。 §§相关问题§§ 1. 在异步串口打印中,如何避免环形缓冲区溢出? 2. 同步串口打印在实时操作系统中可能导致什么问题? 3. 使用DMA进行异步串口发送相比中断方式有哪些优势? 4. 如何设计一个异步串口打印库以支持多线程安全访问? 5. 在低功耗MCU应用中,异步串口打印如何帮助降低功耗?</think>### 同步异步串口打印的区别 在嵌入式系统中,串口打印分为**同步****异步**两种模式,主要区别体现在数据传输机制CPU资源占用上: #### 1. **同步串口打印** ```c // 同步发送函数示例 void put_char_sync(uint8_t c) { while(!UART_TX_READY); // 阻塞等待发送缓冲区空 UART_DATA_REG = c; // 写入数据寄存器 } ``` - **工作机制**: - 阻塞式传输:发送每个字符时CPU必须等待发送完成 - 通过轮询状态寄存器检查发送完成标志 - **特点**: - 实现简单,无需额外硬件支持 - 占用大量CPU时间(例如9600bps发送1字节约占用1ms) - 实时性差,会阻塞主程序执行 - 资源消耗:低内存需求,高CPU占用 #### 2. **异步串口打印** ```c // 异步发送函数示例(使用环形缓冲区) #define BUF_SIZE 128 volatile uint8_t tx_buf[BUF_SIZE]; volatile uint16_t tx_head = 0, tx_tail = 0; void put_char_async(uint8_t c) { uint16_t next = (tx_head + 1) % BUF_SIZE; while(next == tx_tail); // 等待缓冲区空间 tx_buf[tx_head] = c; tx_head = next; UART_ENABLE_TX_INT(); // 触发发送中断 } // 中断服务程序 void UART_ISR() { if(UART_TX_INT_FLAG) { if(tx_tail != tx_head) { UART_DATA_REG = tx_buf[tx_tail]; tx_tail = (tx_tail + 1) % BUF_SIZE; } else { UART_DISABLE_TX_INT(); // 缓冲区空,关闭中断 } } } ``` - **工作机制**: - 非阻塞传输:数据存入缓冲区后立即返回 - 通过中断或DMA在后台完成实际发送 - **特点**: - 实现复杂,需缓冲区管理中断控制 - CPU占用率低(仅处理中断) - 支持高速连续传输(最高可达串口波特率极限) - 资源消耗:需要额外缓冲区内存,但CPU利用率高 #### 关键对比: | **特性** | **同步模式** | **异步模式** | |------------------|----------------------------------|----------------------------------| | 数据传输机制 | 阻塞式轮询 | 非阻塞中断/DMA | | CPU占用 | 高(发送期间完全占用) | 低(仅中断处理) | | 实时性 | 差(阻塞主程序) | 好(不阻塞主程序) | | 内存消耗 | 低(无缓冲区) | 中高(需要缓冲区) | | 最大传输速率 | 受限于CPU轮询速度 | 可达串口物理极限 | | 适用场景 | 低速调试、资源极度受限的MCU | 高速数据传输、实时系统 | #### 典型应用场景: - **同步模式**: - 8位MCU(如51单片机) - 仅需偶尔打印调试信息的场景 - 内存资源极度受限的系统(<1KB RAM) - **异步模式**: - 32位MCU(如STM32) - 高速日志记录(>115200bps) - 实时操作系统(RTOS)环境 - DMA配合实现零CPU占用的传输
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值