目录:

  • 1. 前言
  • 2. 基本概念
    • 2.1 波特率
    • 2.2 起始位
    • 2.3 数据位
    • 2.4 校验位
    • 2.5 停止位
    • 2.6 空闲位
  • 3. 工作模式
    • 3.1 单工模式
    • 3.2 半双工模式
    • 3.3 全双工模式
  • 4. 同步通信和异步通信
    • 4.1 同步通信
    • 4.2 异步通信
  • 5. 流控
    • 5.1 RTS
    • 5.2 CTS
    • 5.3 硬件流控使用举例
    • 5.4 软件流控
  • 6. 写在最后

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. 写在最后

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

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

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

【嵌入式基础】串口通信相关推荐

  1. 嵌入式STM32入门之STM32基础串口通信

    STM32基础串口通信 一.前言 二.串口协议 (1)浅谈设备通信方式 (2)具体串口协议 (3)STM32的串口通信 (4)RS-232通信协议 (5)USB To TTL(CH340) 5.1 C ...

  2. 嵌入式学习——串口通信小试

    嵌入式学习--串口通信小试 目录 嵌入式学习--串口通信小试 1.了解串口协议和RS-232.485标准,以及RS-232.485电平与TTL电平的区别 1.1 什么是串口协议 1.2 RS-232标 ...

  3. Linux ROS与嵌入式的串口通信

    1.根据ros wiki的官方教程 学习即可,并且有许多例子可供学习 http://wiki.ros.org/rosserial_arduino/Tutorials 2.用ASIO读写设备串行口 AS ...

  4. 嵌入式开发—串口通信

    文章目录 1 概述 1.1 串口通信是什么 1.2 波特率 1.3 串口通信的用途 2 串口收发 2.1 波特率发生器 2.2 收发FIFO 2.3 DMA 3 串口收发程序设计 3.1 串口发送数据 ...

  5. 树莓派外设开发基础—串口通信

    文章目录 一.串口通信的一些概念 二.树莓派串口通信设置 三.树莓派串口通信API 四.树莓派与PC通信 1.接线 2.程序与测试 拓展 一.串口通信的一些概念 串口通信通常用在多机通信中. 串口通信 ...

  6. 51单片机基础——串口通信字符串控制流水灯

    #include <reg52.h> #include<intrins.h> //位移头文件_crol_ #define uchar unsigned char unsigne ...

  7. 51单片机基础——串口通信发送字符ab控制流水灯

    /* 当串口调试助手发送a时执行5ms流水灯功能, 当串口调试助手发送b时执行50ms流水灯功能 */#include <reg52.h> #include<intrins.h> ...

  8. 张高兴的 .NET Core IoT 入门指南:(五)串口通信入门

    在开始之前,首先要说明的是串口通信所用到的 SerialPort 类并不包含在 System.Device.Gpio NuGet 包中,而是在 System.IO.Ports NuGet 包中.之所以 ...

  9. js 串口通信mscomm接收undefined_串口通信帧的同步方法(识别一帧数据的起始结束)42...

    串口通信是单片机和DSP等嵌入式系统之间,以及嵌入式系统与PC机或无线模块之间的一种非常重要且普遍使用的通信方式.在嵌入式系统的硬件结构中,通常只有一个8位或16位的CPU,不仅要完成主流程的工作,同 ...

  10. 张高兴的 .NET Core IoT 入门指南:(六)串口通信入门

    在开始之前,首先要说明的是串口通信所用到的 SerialPort 类并不包含在 System.Device.Gpio NuGet 包中,而是在 System.IO.Ports NuGet 包中.之所以 ...

最新文章

  1. 使用神经网络做二分类,输出层需要几个神经元?应该选择哪一种激活函数?如果要处理minst数据、输出层需要几个神经元?使用那种激活函数?如果使用神经网络预测房价,输出层需要几个神经元、使用什么激活函数?
  2. 深度学习基础入门(一):基本概念和术语解读
  3. 【产品】场景化需求洞察
  4. 太原学计算机的职高,山西太原职高学校排名
  5. TDA-04D8变送器数据上报阿里云
  6. (0.2)linux下Mysql的安装配置与管理入门(目录篇)
  7. Bootstrap下拉菜单分隔线
  8. java 蓝桥杯算法训练 特殊的数字四十
  9. Javascript--cookie创建与查看
  10. JavaScript基础之Array对象和Boolean对象
  11. 少和这种人在一起,不管你是谁!
  12. python---用python实现冒泡排序
  13. ulipad双击打不开 解决
  14. 111完美邮箱品牌域名——数字域名111.com
  15. 杀不死的人狼——我读《人月神话》(五)
  16. iphonex 序列号_iPhoneX序列号在哪?苹果iPhoneX序列号怎么看?
  17. uni-app项目中引入Vant UI组件库(完美避坑!!!)纯净版
  18. SQLPrompt v7.2
  19. Linux下装无线网卡(Ubuntu)
  20. 37岁主管被裁,无奈降薪去小公司遭群嘲:许多人早就破产了,只是活在还没倒闭的公司里!...

热门文章

  1. 5万字用纯C语言从零开始实现人脸检测
  2. 解析SCUT FIR Pedestrian Dataset数据
  3. 11 个非常有用的 HTML One-Liners
  4. 菜鸟、顺丰、京东物流:无“智”难行?
  5. 字符串转码中文乱码问题的进一步理解 UTF-8 GBK转码
  6. 零基础YOLOv5的详细使用教程
  7. java自动化测试框架基础eclipse+maven配置
  8. 关于28岁字节跳动程序员退休,看这一篇就够了
  9. Soul API 网关源码学习《二》
  10. WPF 说话-语音合成