【嵌入式基础】串口通信

2023-11-16

1. 前言

串口通信在实际嵌入式开发中非常常用,通常用于和传感器进行数据交互。

2. 基本概念

串口通信的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。

了解串口通讯原理,需要先了解一下基本概念:波特率、起始位、数据位、校验位、停止位、空闲位。

在这里插入图片描述

2.1 波特率

这是衡量通信速度的参数,表示每秒传送的bit个数。比如100表示每秒发送100bit。

2.2 起始位

起始位是持续一个比特时间的逻辑0电平,表示传输一个字符的开始。接收方可以用起始位使自己的接收时钟与发送方的数据同步。

2.3 数据位

数据位紧跟在起始位之后,是通信中的真正有效信息。

数据位的位数可以有通信双方共同约定,一般可以是5位、7位或8位。

传送字符时,先传低位,再传高位。标准的ASCII码是0~127;拓展的ASCII码是0 ~ 255(8位)。

2.4 校验位

奇偶校验位仅占一位,用于进行奇校验或偶校验,奇偶校验位不是必须的。

如果是奇校验,需要保证传输的数据总共奇数个高电平;如果是偶校验,需要保证传输的数据总共偶数个高电平。

假设传输的数据位为 01010101,如果是奇校验,则奇校验位为1(要确保共有奇数个1)。如果是偶校验,则偶校验位为0(要确保共有偶数个1)。

2.5 停止位

停止位一定是逻辑1电平,表示着一个字符的结束。停止位可以是1位、1.5位或2位,可以由软件设定。

2.6 空闲位

空闲位是指从一个字符的停止位结束到下一个字符的起始位开始,表示线路处于空闲状态,必须由高电平来填充。

3. 工作模式

串口通讯根据数据传输方向分为3种工作模式:单工模式、半双工模式和全双工模式。

3.1 单工模式

单工模式的数据传输是单向的。通信双方中,一方固定为发送端,一方则固定为接收端。数据只能使用一根线沿一个方向传输。

3.2 半双工模式

半双工模式既可以发送数据也可以接受数据,但不能同时进行发送和接受。数据传输允许数据在两个方向上传输,但是任何时刻只能由其中的一方发送数据,另一方接受数据。

半双工模式既可以使用一根数据线,也可以使用两根数据线。

3.3 全双工模式

全双工模式通讯允许数据同时在两个方向上传输,是两个单工通信方式的结合,要求发送设备和接受设备都要独立的接收和发送能力。

在全双工模式中,每端都有发送器和接收器,有两条传输线,信息传输高些。

4. 同步通信和异步通信

同步通信和异步通信最明显的区别是有无时钟信号。

4.1 同步通信

同步通信(SYNC:synchronous data communication)是指在约定的通信速率下,发送端和接收端的时钟信号频率和相位始终保持一致(同步),这样就保证了通信双方在发送和接收数据时具有完全一致的定时关系。

同步通信把许多字符组成一个信息组(信息帧),每帧的开始用同步字符来指示,一次通信只传送一帧信息。在传输数据的同时还需要传输时钟信号,以便接收方可以用时针信号来确定每个信息位。

同步通信的优点是传送信息的位数几乎不受限制,一次通信传输的数据有几十到几千个字节,通信效率较高。同步通信的缺点是要求在通信中始终保持精确的同步时钟,即发送时钟和接收时钟要严格的同步(常用的做法是两个设备使用同一个时钟源)。

4.2 异步通信

异步通信(ASYNC:asynchronous data communication),又称为起止式异步通信,是以字符为单位进行传输的,字符之间没有固定的时间间隔要求,而每个字符中的各位则以固定的时间传送。

在异步通信中,收发双方取得同步是通过在字符格式中设置起始位和停止位的方法来实现的。具体来说就是,在一个有效字符正式发送之前,发送器先发送一个起始位,然后发送有效字符位,在字符结束时再发送一个停止位,起始位至停止位构成一帧。停止位至下一个起始位之间是不定长的空闲位,并且规定起始位为低电平(逻辑值为0),停止位和空闲位都是高电平(逻辑值为1),这样就保证了起始位开始处一定会有一个下跳沿,由此就可以标志一个字符传输的起始。而根据起始位和停止位也就很容易的实现了字符的界定和同步。

显然,采用异步通信时,发送端和接收端可以由各自的时钟来控制数据的发送和接收,这两个时钟源彼此独立,可以互不同步。

5. 流控

在两个设备正常通信时,由于处理速度不同,就存在这样一个问题,有的快,有的慢,在某些情况下,就可能导致丢失数据的情况。
如台式机与单片机之间的通讯,接收端数据缓冲区已满,则此时继续发送来的数据就会丢失。

流控制能解决这个问题,当接收端数据处理不过来时,就发出“不再接收”的信号,发送端就停止发送,直到收到“可以继续发送”的信号再发送数据。因此流控制可以控制数据传输的进程,实现收发双方的速度匹配,防止数据的丢失。

PC机中常用的两种流控制是硬件流控制(包括RTS/CTS、DTR/CTS等)和软件流控制XON/XOFF(继续/停止)。

5.1 RTS

Require ToSend,发送请求,为输出信号,用于指示本设备准备好可以接收数据,低电平有效。

低电平说明本设备可以接收数据。

5.2 CTS

Clear ToSend,发送允许,为输入信号,用于判断是否可以向对方发送数据,低电平有效。

低电平说明本设备可以向对方发送数据。

5.3 硬件流控使用举例

RTS (Require ToSend,发送请求)为输出信号,用于指示本设备准备好可接收;CTS (Clear ToSend,发送清除)为输入信号,用于指示对端设备是否准备好接收数据。

比如A、B两个设备通信,两个设备的RTS、CTS交叉连接。对B设备发送(A设备接收)来说,如果A设备的接收缓冲区快满时,将自身的RTS拉高(通知B设备停止发送),一段时间后A设备接收缓冲区有了空间,将自身的RTS拉低(通知B设备可以开始发送)。

在这里插入图片描述

5.4 软件流控

软件流控和硬件流控方式一样,只是实现方式不同而已。在通信过程中,软件流控通过在数据流中插入Xoff(特殊字符)和Xon(另一个特殊字符)信号来实现。A设备一旦接收到B设备发送过来的Xoff,立刻停止发送;反之,如接收到B设备发送过来的Xon,则恢复发送数据给B设备。同理,B设备也类似,从而实现收发双方的速度匹配。

6. 写在最后

参加工作好多年,感觉串口通信还没搞透彻,惭愧。

即使再简单的东西,如果没有亲身实践或工作中没有实际使用到,可能也不能说自己懂了。

实际工作中,调试串口通信一般都是调用平台封装好的接口,即便如此,熟悉基本原理,在遇到异常的时候可以更快排查原因。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【嵌入式基础】串口通信 的相关文章

随机推荐

  • Spice-server源码简要分析

    下载地址 https www spice space org download releases spice server spice 0 14 1 tar bz2 也可以在gitlab下载 https gitlab com spice s
  • LocalDate,LocalDateTime,Date及时间戳的转换

    1 时间戳转LocalDateTime 时间戳如果是字符串则先转为long LocalDateTime localDateTime LocalDateTime ofEpochSecond System currentTimeMillis 1
  • Kendo UI开发教程(16): Kendo MVVM 数据绑定(五) Events

    本篇和Kendo UI开发教程 14 Kendo MVVM 数据绑定 三 Click类似 为事件绑定的一般形式 Events绑定支持将ViewModel的方法绑定到DOM元素的事件处理 如鼠标事件 例如 1
  • c++中管道代码_如何在管道中添加动态代码分析

    c 中管道代码 我们大多数人都对著名的马克 扎克伯格宣言 快速行动并打破事物 非常熟悉 在2014年 这是一个非常大胆的声明 正如扎克伯格很快意识到的那样 可能太过大胆了 后来他撤回了它 表明了他想要快速行动但保持稳定的新愿望 为了更好地解
  • layui复选框

    效果图 layui复选框 一个主的复选框控制多个从复选框 主复选框和从复选框的颜色不一样 layui复选框的样式 都是在选然后才会有的 所以直接通过css设置就实现不了了 只可以通过js动态设置 html代码使用了jfinal的模板 div
  • C++之string

    一些简单的关于string对象的知识 以后还会补充 1 2 3 4 5 6 7 8 9 10 11
  • 详解C结构体、C++结构体 和 C++类的区别

    先来说说C和C 中结构体的不同 a C语言中的结构体不能为空 否则会报错 1 gt d myproject visual studio 2013 projects myc main c 71 error C2016 C 要求一个结构或联合至
  • IP地址学习总结

    IP地址 IP地址是局域网中某台主机的唯一标识 一段二进制编码 由32位组成 但是通常使用点分十进制来表示 便于记忆 x x x x 子网掩码 在同一局域网中 所有的IP必须在同一网段才能相互通信 而子网掩码用来标识是属于哪一个网段 确定I
  • uniapp - 实现微信小程序电子签名板,横屏手写姓名签名专用写字画板(详细运行示例,一键复制开箱即用)

    效果图 实现了在uniapp项目中 微信小程序平台流畅的写字签名板 也可以绘图 功能源码 复制粘贴 改改样式几分钟即可搞定 支持自动横屏 持预览 真机运行测试非常流畅不卡顿 基础模板 如下代码所示
  • Harbor镜像仓库搭建

    1 安装docker comprose docker comprose是docker容器批量管理工具 curl L https get daocloud io docker compose releases download 1 25 0
  • Unity3d 物体速度、运动的控制——Input.GetAxis、transform.Translate、transform.Rotate、AddForce

    首先介绍Input GetAxis方法 官方文档给出的解释为 Returns the value of the virtual axis identified by axisName 返回根据参数名所指定的虚拟轴上的数值 public st
  • 深入浅出AXI协议(6)——传输属性

    一 前言 在之前的文章中 我们介绍的主要内容是AXI协议的数据读写结构和读写响应结构 主要讲述了当遇到各种特殊情况时 AXI如何完成数据的读写操作 最后介绍了读写响应的4种类型 在本文中 我们将介绍AXI协议的传输属性 二 传输类型与属性
  • 性能测试流程

    参考书籍 软件测试 黑马程序员编著 性能测试与普通的功能测试目标不同 因此其测试流程与普通的测试流程也不相同 虽然性能测试也遵循测试需求分析 测试计划制订 测试用例设计 测试执行 编写测试报告的基本过程 但在实现细节上 性能测试有单独一套流
  • GDAL源码剖析(一)

    转载自 http blog csdn net liminlu0314 article details 6933772 前言 一直在使用和研究GDAL的相关东西 发现网上对GDAL的内容倒是不少 但是很少有系统的介绍说明 以及内部的一些结构说
  • Centos7 交叉编译boost_1_70_0源码 AArch架构

    环境准备 centos7 镜像 下载地址 http mirrors aliyun com centos 7 9 2009 isos x86 64 aarch64交叉编译链 下载地址 https releases linaro org com
  • JS 使用hash算法计算字符串的哈希值

  • DFS遍历框架解决岛屿问题

    补充在开头 这篇题解 是我在做leetcode无意中看到的 原po将此类问题解释的非常清晰 故将其转载并添加上对应题目的解题代码 仅用做个人的学习笔记 不做任何商业用途 引言 我们所熟悉的 DFS 深度优先搜索 问题通常是在树或者图结构上进
  • [UE4笔记] 3DUI空间交互

    在Actor中使用widget的时候制作3DUI 如果直接选择World模式 鼠标和UI是无法产生交互的 只要勾选了红框里的选项 就可以正常交互了 老是忘记 所以写个笔记记录一下 效果 注意 如果你还是点击不到 输入控制台命令showfla
  • 第十题

    第十题 限制元素 修改限制 把3改了即可
  • 【嵌入式基础】串口通信

    目录 1 前言 2 基本概念 2 1 波特率 2 2 起始位 2 3 数据位 2 4 校验位 2 5 停止位 2 6 空闲位 3 工作模式 3 1 单工模式 3 2 半双工模式 3 3 全双工模式 4 同步通信和异步通信 4 1 同步通信