通讯协议学习之路:RS232协议理论

通讯协议之路主要分为两部分,第一部分从理论上面讲解各类协议的通讯原理以及通讯格式,第二部分从具体运用上讲解各类通讯协议的具体应用方法。

后续文章会同时发表在个人博客(jason1016.club)、CSDN;视频会发布在bilibili(UID:399951374)

序:个人理解

1、232协议概念:串口通信时串行通信里面的异步方式 UART是串口通信里面的一种协议,通俗的讲:

2、串口(基本上) = RS232 = UART = USART = U(S/A)RT

3、对于223协议就是通过将串口通信的RX、TX、GND接入到MAX232进行处理转化为232电平

    • 对于串口的高电平逻辑(5V)转换为-12V的高电平逻辑
    • 对于串口的低电平逻辑(0V)转换为12V的低电平逻辑

4、通过放大电平高低逻辑差异来增强通讯的抗干扰能力

5、RS232是负逻辑,比如说232芯片收到的电压是5V,它输出-12V!收到0V,它输出+12

    • 3~15V属于低电平
    • -3~15V属于高电平

一、简述

RS232(Recommended Standard 232)是一种串行通信的物理层标准,最初由美国电子工业协会(EIA)制定。它定义了串行通信中的电气特性、连接器和信号级别等。

RS232标准规定了串行通信中的以下内容:

  1. 电气特性:RS232规定了通信线路的电气特性,包括信号电平、电流、阻抗等。它使用正负电平来表示逻辑1和逻辑0,通常使用负电平表示逻辑1,正电平表示逻辑0。
  2. 连接器:RS232通常使用DB9或DB25连接器,其中DB9连接器有9个引脚,DB25连接器有25个引脚。这些连接器用于将串行通信设备(如计算机、终端、调制解调器等)与外部设备(如打印机、传感器、仪器等)连接起来。
  3. 信号级别:RS232规定了不同信号的电平范围。例如,逻辑1的负电平通常在-3V至-15V之间,逻辑0的正电平通常在+3V至+15V之间。这种较大的电平范围使得RS232可以在较长距离上进行可靠的数据传输。
  4. 数据位、停止位和校验位:RS232规定了数据传输中的数据位数、停止位数和校验位的设置。通常,数据位可以是5位、6位、7位或8位,停止位可以是1位或2位,校验位可以是无校验、奇校验或偶校验。

RS232通常用于连接计算机与外部设备之间的串行通信,如连接打印机、调制解调器、传感器等。然而,随着技术的发展,RS232逐渐被更先进的串行通信标准(如USB、Ethernet等)所取代。尽管如此,RS232仍然在某些特定的应用领域中得到广泛应用,特别是在工业控制、通信设备和仪器仪表等领域。

二、RS232与uart的关系

三、为什么选择RS232

RS232基本概念:

串口通信时串行通信里面的异步方式 UART是串口通信里面的一种协议,通俗的讲:

串口(基本上) = RS232 = UART = USART = U(S/A)RT

注:

①RS232是协议名称,而串口还应该包括了其它协议,如:RS485、RS422等;

②U是通用,A是异步,S是同步,所以,UART跟USRT区别在于有无同步时钟,所以有的串口会有三根线(地线除外),多了一根时钟线;

距离稍微远一点,同步通信就不太合适了,通着通着就乱了;

③RS232发送是靠TXD和GND之间的电压来传数据(接收跟发送雷同),是共模电压,抗干扰能力差,导致传输距离非常有限;

④被广泛使用的原因:因为RS232的简单、低成本,所以不管是单片机、ARM、DSP都配了这种接口;

⑤真正设备间通信肯定是RS232电平的串口数据,抗干扰能力强,TTL电平是电路板上使用的电平,所以真正传输时,肯定会进行RS232和TTL之间的转换。

RS232的协议

因为是异步的通信,那么如何保证数据发送的可靠呢,那么就需要几个扛大旗的人,如起始位,停止位;

典型的其中一种消息协议主要分以下几个部分:起始位、数据位、校验位、停止位,注意:这里用的是位(bit)。

单纯地按照协议规定的去做,会出现一些问题。

1、奇偶校验的校验能力太差。

2、传错一个数据,没法重传。

3、在总线上挂了几个从机,主机如何区分是哪台从机发出的数据(有的设备不能把校验位当地址位用)。

4、如果没有成功发送停止位,那么接收端会不会一直等待。

5、总线上传错了一组数据,没法定位是哪个地方(哪个位)出问题。

鉴于以上诸多问题,我们想到了一种解决办法,就是封装成帧。一帧数据包含多个byte,而一个byte的数据包含多个bit(起始位、数据位等)。

自定义协议

根据实际需求自定义协议。下面举个例子(非通用协议/准则),并以"域"来表示协议里面各个功能模块。

1、帧起始。

帧起始,一般以0x55或者0xaa作为起始的标志,为什么要用这种数字?

十六进制的5,转为二进制是0101;十六进制的A,转为二进制是1010。这样,0x55,就是01010101了。

0和1交替出现,一来方便接收方实现自适应波特率,二来避免干扰。

a、通过检测0和1之间的时间间隔,即可知道该帧数据的波特率。

b、如果设为0xff,那么,在总线上出现一个干扰,接收端很有可能误以为要接收数据。

2、命令域。

命令域,可以随意一点,如:设上行为0x1d,下行为0x3a,重传为0xb7,应答为0x89。

3、地址域(可选)。

地址域,也可以随意一点,如果所有设备的地址均不相同,那就只具备点对点的功能。

当然,你也可以视实际情况,把某几台设备的地址设为一样,这样就有点对多点的功能。

4、长度域(可选)。

如果是发送固定长度的帧,是可以不使用长度域;如果是不固定长度的帧,则可以加上。

4、数据域。

数据域,一般由数据个数和数据组成。

比如,你要传3个数,分别是0x00到0x02。那么数据域就是0x03 0x00 0x01 0x02。

5、校验域。

校验域,可以使用校验和或者CRC校验。如,使用CRC16算法话,校验域为2个byte。

一般除了帧起始和帧结束以外,都送进CRC校验。

好了,这样的话,我要发一个上行的数据,到地址为0x0a的设备,一共3个数据(固定长度),分别是0xa0,0xb0,0xc0。

那么一帧数据就是:0x55 0x1d 0x0a 0x03 0xa0 0xb0 0xc0 0x53 0xfb

只要把上面这一帧数据,一个byte一个byte地发送出去,即可。

使用CRC-16对该帧(除去帧起始)进行计算,可以得到0x53FB。如下图所示。

6、应答和重传。

如果接收端,收到一帧数据,经过CRC校验,数据正确,这时得传一帧简易的应答帧,以告诉主机,这个帧接收成功。

应答帧, 如:0x55 0x89 0xa6 0xc1。

如果接收端,收到一帧数据,经过CRC校验,发现数据有错,这时得传一帧简易的重传帧,以请求重传。

重传帧,如:0x55 0xb7 0x76 0x40。

这样,串口的功能就强大了很多

总结:

不管是RS232、或者其他协议,一般是都以byte为单位,传输数据的。如果你想把12位的ADC数据,通过串口发到PC机,那么,你得分成两个byte,高位补零。

从RS232到USB、以太网,不难看出,物理层/物理接口变化不大,而协议/数据链路层却越来越复杂。

这也说明了,传输数据的可靠性,不能过于依赖物理层,而应该依赖协议上的一些机制(校验、重传等)。

参考文章:详解RS232/UART/协议/串口通信_rs232 uart-CSDN博客

四、问题解答

1、RS232为什么设计成负逻辑呢?

因为闭合开关视为有动作的"1",电信号则是由于闭合操作接地了,所谓是"0V"。

所以才有了所谓的负逻辑。

相关推荐
不太可爱的叶某人1 小时前
【学习笔记】MySQL技术内幕InnoDB存储引擎——第5章 索引与算法
笔记·学习·mysql
岁岁岁平安1 小时前
Redis基础学习(五大值数据类型的常用操作命令)
数据库·redis·学习·redis list·redis hash·redis set·redis string
HIZYUAN1 小时前
AG32嵌入式系统如何实现加密与固件升级(一)
stm32·单片机·嵌入式硬件·mcu·fpga开发·创业创新
知识分享小能手3 小时前
Vue3 学习教程,从入门到精通,使用 VSCode 开发 Vue3 的详细指南(3)
前端·javascript·vue.js·学习·前端框架·vue·vue3
pay4fun3 小时前
2048-控制台版本
c++·学习
Two_brushes.3 小时前
【linux 网络】网络基础
linux·网络
知识分享小能手5 小时前
Bootstrap 5学习教程,从入门到精通,Bootstrap 5 表单验证语法知识点及案例代码(34)
前端·javascript·学习·typescript·bootstrap·html·css3
YTao_G5 小时前
STM32模块:022 PWR电源控制
stm32·单片机·嵌入式硬件
Two_brushes.5 小时前
【linux网络】网络编程全流程详解:从套接字基础到 UDP/TCP 通信实战
linux·开发语言·网络·tcp/udp
weixin_418813876 小时前
Python-可视化学习笔记
笔记·python·学习