一文搞懂串口通信!

一、什么是串口

区别于并口,指的是用于逐位传输数据的通信接口的总称。

二、帧格式和波特率

1.帧格式

(1)空闲:高电平

(2)非空闲:有如下类型的帧:

  • 起始位 (Start Bit):
    起始位通常是一个逻辑低电平,用于指示一个新字符的开始。
  • 数据位 (Data Bits):
    数据位是实际要传输的信息位,可以是5到8位不等,最常见的配置是8位。
  • 奇偶校验位 (Parity Bit)(可选):
    这是一个用于错误检测的位,可以是无校验(None)、奇校验(Odd)、偶校验(Even)、标记校验(Mark)或空位校验(Space)。
  • 停止位 (Stop Bit):
    停止位是一个或多个逻辑高电平,用于指示一个字符的结束。停止位可以是0.5、1位、1.5位或2位。通常是1位。

他们的关系如下图:

在这里插入图片描述

  常用的帧格式为:1位起始位+8位数据位(一个字节)+无校验位+1位停止位 即一帧10个bit

2.波特率

官方说法:

  在串口通信中,波特率(Baud rate)是一个非常重要的参数,它表示数据传输的速率。具体来说,波特率定义了信号单位时间内载波调制状态改变的次数,通常用作衡量串行通信中数据传输速度的标准。
  在数字通信领域,一个“波特”(Baud)是指每秒的信号变化次数。对于大多数现代数字通信系统而言,一次信号变化通常对应一位(bit)的数据传输。因此,在很多情况下,波特率与比特率(bits per second, bps)是等同的,尤其是在每个信号变化只代表一位信息的情况下。

通常来讲:
  对于串口通信,波特率代表每秒传输的bit的数量。
  如常用的9600波特率代表了一秒钟可以传输9600个bit的信息。即信号宽度为0.104ms,如下图:
在这里插入图片描述

​​  其他常用的波特率如:19200、38400、115200等。
注意:9600波特率包含了起始位数据位校验位和终止位所有的信息,不仅仅是数据位。

2.硬件和接口标准

(1)硬件
  对于芯片(soc和mcu)来说,芯片内部集成了uart(异步通信)和usart(支持同步和异步通信)模块。其直接产生的为ttl电平。

(2)接口标准
  串口通信常用的电气标准有ttl、rs232和rs485、rs422等。
在这里插入图片描述

:RTS (Request to Send):请求发送 CTS (Clear to Send):清除发送

三.常见问题

(1)如何判断串口已经发送完成
  串口通信没有时序控制,如何判断串口数据已经发送完成了呢?

  • 通过中断:

1)空闲中断(IDL Interrupt)
  当USART检测到输入线上连续出现一定数量的空闲状态(通常为10个连续的空闲位)时,会触发此中断。
伪代码:

int main(void)
{
//初始化硬件。。。。。

    __HAL_UART_ENABLE_IDLELINEDETECTION(&huart2); //使能空闲线检测中断


    HAL_UART_EnableIT(&huart2, UART_IT_IDLE); //  使能USART中断
}

void USART2_IRQHandler(void)
{
    // 处理空闲线检测中断
    if (__HAL_UART_GET_FLAG(&huart2, UART_FLAG_IDLE))
    {
        __HAL_UART_CLEAR_FLAG(&huart2, UART_FLAG_IDLE); // 清除中断标志
        HAL_UART_IRQHandler(&huart2); // 调用中断处理函数
    }
}

void HAL_UART_IdleLineCpltCallback(UART_HandleTypeDef *huart)
{
    if (huart == &huart2)
    {
        // 空闲线检测完成
        // 这里可以添加处理逻辑
    }
}

2)非空中断 (RXNE Interrupt)
  当USART接收到新的数据并且接收数据寄存器非空(RXNE,Receive Data Register Not Empty)时,会触发此中断。
伪代码:

int main(void)
{
//初始化硬件。。。。。

    // 使能接收数据寄存器非空中断
    HAL_UART_EnableIT(&huart2, UART_IT_RXNE);
}
void USART2_IRQHandler(void)
{
    // 处理接收数据寄存器非空中断
    if (__HAL_UART_GET_FLAG(&huart2, UART_FLAG_RXNE))
    {
        uint8_t data = 0;

        // 读取接收的数据
        data = HAL_UART_Receive_IT(&huart2, (uint8_t *)&data, 1);

        // 检查接收缓冲区是否已满
        if (receivedLen < sizeof(receivedData))
        {
            receivedData[receivedLen++] = data;
        }

        // 清除中断标志
        __HAL_UART_CLEAR_RXNEFLAG(&huart2);
    }
}

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if (huart == &huart2)
    {
        // 接收完成
        // 可以在这里添加额外的操作,例如打印接收到的数据
        // 或者重置接收长度以准备下一次接收
        receivedLen = 0; // 重置接收长度
    }
}
  • 通过时间

  对于一些相关中断的单片机,可以通过时间来判断,即通过波特率计算每个信号的具体时间,如9600波特率信号的时间为0.104ms,则可以建立软件定时器,在3~5个信号时间内未收到新数据则视为接收完成

  • 通过特定字符或者长度

  即通过协议约定的特定尾帧进行判别,或进行长度判别,当检测到数据为结束尾帧或者数据长度超过阈值时,视为接收完成。

  • 19
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Linux内核是一种开源的操作系统内核,是Linux操作系统的核心组成部分。它提供了操作系统与硬件之间的抽象层,负责管理系统的资源、调度任务、提供驱动程序等功能。 Linux内核采用分层的架构,包括硬件抽象层、系统调用层、进程管理层、件系统层和网络层等。硬件抽象层负责将不同硬件设备的接口统一起来,使得上层的软件可以方便地与硬件进行通信。系统调用层提供了一组API供用户进程调用,如件操作、网络通信等。进程管理层负责进程的创建、销毁以及调度等任务。件系统层负责件的管理和存储。网络层负责网络协议的实现和网络通信。 Linux内核的工作原理可以简单概括为以下几个关键步骤。首先,当一台计算机启动时,BIOS会加载内核映像到内存中,并执行启动代码。然后,内核初始化各种数据结构、驱动程序和关键服务。接下来,内核创建一个初始的用户空间进程,称为init进程。init进程是所有其他进程的祖先进程。在此之后,内核根据调度算法来决定哪个进程可以使用CPU,并依次执行。同时,内核会提供一个中断机制,以便处理硬件事件的优先级。 内核还提供了许多系统调用供用户进程调用,以实现对各种功能的访问。当用户进程需要操作件、创建进程或进行网络通信时,会通过系统调用将请求传递给内核,由内核代表用户进程执行相应的操作。内核通过调度算法来分配CPU时间片,并通过虚拟内存管理来管理内存资源的分配和回收。 总而言之,Linux内核是一个高度可配置和模块化的操作系统内核,通过分层架构和系统调用机制实现了对硬件的抽象和对用户进程的管理。了解Linux内核的架构和工作原理,有助于深入理解Linux操作系统以及开发和调试相关应用程序。 ### 回答2: Linux是一种开源的操作系统内核,其设计目标是为了在不同的计算机硬件平台上提供高效的、稳定的和安全的操作系统服务。 Linux内核的架构可以分为三个主要部分:进程管理、内存管理和件系统管理。 在进程管理方面,Linux内核使用了多任务处理技术,可以同时运行多个进程。每个进程都有独立的地址空间和资源,通过调度算法可以合理分配CPU时间片,优化系统的响应速度和资源利用率。 在内存管理方面,Linux内核使用了虚拟内存技术,将物理内存和逻辑内存进行了映射,使得每个进程都有独立的地址空间。当物理内存不足时,Linux内核会通过页面置换算法将暂时不使用的页写入磁盘交换空间,以释放物理内存供其他进程使用。 在件系统管理方面,Linux内核支持多种件系统,包括传统的ext3和ext4件系统,以及现代的Btrfs和XFS件系统。它负责件的读写操作,以及件的权限控制和磁盘空间的管理。 Linux内核的工作原理可以简单概括为以下几个步骤:首先,启动引导程序将内核加载到内存中,并进行初始化。然后,内核分配一部分内存作为内核空间,用于存放内核代码和数据结构。接着,内核根据系统的硬件配置进行设备的初始化和驱动程序的加载。之后,内核根据系统的启动参数和配置件进行一系列的初始化工作,包括启动系统服务和加载用户程序。最后,内核进入主循环,不断地处理中断、调度进程、管理内存和件系统,以提供稳定的操作系统服务。 总之,Linux内核是一个复杂而高效的软件系统,它通过进程管理、内存管理和件系统管理等功能,实现了操作系统的基本功能。了解Linux内核的架构和工作原理,有助于我们更好地理解和使用这个优秀的开源操作系统。 ### 回答3: Linux内核是一个开放源代码的操作系统内核,由一个核心程序和一组通用的系统工具组成。它是Linux操作系统的核心,负责处理硬件设备、管理系统资源、实现进程管理、件系统和网络功能等。 Linux内核的架构可以分为两个层次:用户空间和内核空间。用户空间包括用户应用程序,如图形界面、终端程序等,它们通过系统调用接口与内核进行通信。内核空间包括内核核心的数据结构和程序,用于管理和控制硬件资源。 Linux内核的工作原理可以概括为以下几个方面: 1. 进程管理:内核负责创建、调度和终止进程。它使用进程描述符(task_struct)来跟踪进程的状态和资源使用情况,并根据调度算法分配CPU时间片给不同的进程。 2. 内存管理:内核负责管理系统的物理内存和虚拟内存。物理内存管理包括内存分配和释放,虚拟内存管理包括页面置换和页面回写等策略,以优化内存的使用效率。 3. 件系统:内核提供件系统接口,管理件和目录的创建、读写和删除等操作。它通过虚拟件系统层(VFS)将不同的件系统统一管理,如ext4、NTFS等。 4. 设备驱动:内核提供了访问硬件设备的接口,通过设备驱动程序与硬件交互。不同的硬件设备需要不同的驱动程序,如网卡、显卡、声卡等。 5. 网络功能:内核提供TCP/IP协议栈和网络设备驱动程序,用于实现网络通信功能。它提供网络连接的建立、数据传输和断开等功能,支持各种网络协议,如HTTP、FTP、SSH等。 总的来说,Linux内核是一个非常复杂且功能强大的软件,它负责管理计算机的各种资源和提供操作系统的各种功能。通过深入理解其架构和工作原理,我们可以更好地理解和使用Linux操作系统。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值