串口通信协议RS232

  • Post author:
  • Post category:其他


1、串口通信协议简介

​串口通信(Serial Communications)的概念非常简单,串口按位(bit)发送和接收字节的通信方式。尽管串行通讯的比按字节传输的并行通信慢,但是串口可以在仅仅使用两根线的情况下就能实现数据的传输。​

由于串口通信是异步的,所以端口能够在一根线上发送数据同时在另一根线上接收数据。简单的解释就是:两个人说话,一个人说,一个人听。

串口通信最重要的参数是端口(com)、波特率、数据位、停止位和奇偶的校验。对于两个需要进行串口通信的端口,这些参数必须匹配,共同遵守,这也是能够实现串口通讯的前提。


1. 波特率

波特率是指数据信号对载波的调制速率,它用单位时间内载波调制状态改变的次数来表示。

比如波特率为9600bps;代表的就是每秒中传输9600bit,也就是相当于每一秒中划分成了9600等份。

因此,那么每1bit的时间就是1/9600秒=104.1666…us。约0.1ms。既然是9600等份,即每1bit紧接着下一个比特,不存在额外的间隔。两台设备要想实现串口通讯,这收发端设置的波特率必须相同,否则是没办法实现通讯的。

收发波特率一致可以实现通讯:

收发波特率不一致,导致RX端不能正常接收:


2. 串口通讯的数据结构

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

数据位:数据位紧跟在起始位之后,是通信中的真正有效信息。数据位的位数可以由通信双方共同约定。传输数据时先传送字符的低位,后传送字符的高位。

奇偶校验位:奇偶校验位仅占一位,用于进行奇校验或偶校验,奇偶检验位不是必须有的。如果是奇校验,需要保证传输的数据总共有奇数个逻辑高位;如果是偶校验,需要保证传输的数据总共有偶数个逻辑高位。

停止位:停止位可以是是1位、1.5位或2位,可以由软件设定。它一定是逻辑1电平,标志着传输一个字符的结束。

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

2、RS232串口通信协议

最初数据是模拟信号输出简单过程量,后来仪表接口出现了RS232接口,这种接口可以实现点对点的通信方式,但这种方式不能实现联网功能,这就促生了RS485。

我们知道串口通信的数据传输都是0和1,在单总线、I2C、UART中都是通过一根线的高低电平来判断逻辑1或者逻辑0,但这种信号线的GND再与其他设备形成共地模式的通信,这种共地模式传输容易产生干扰,并且抗干扰性能也比较弱。所以差分通信、支持多机通信、抗干扰强的RS485就被广泛的使用了。

RS485通信最大特点就是传输速度可以达到10Mb/s以上,传输距离可以达到3000米左右。大家需要注意的是虽然485最大速度和最大传输距离都很大,但是传输的速度是会随距离的增加而变慢的,所以两者是不可以兼得的。

RS232,RS485通信协议实际是一种标准,我们可以直接使用这种标准进行通信,完全没有任何问题。我们还可以自定义通信协议,自定义通信协议是基于需求编写的,符合RS232等标准的协议就可以通信了。

串口通讯的物理层有很多标准,例如上面提到的。这里我们主要接收RS232标准,RS232标准主要规定了信号的用途、通讯接口以及信号的电平标准。

在上面的通讯方式中,两个通讯设备的”DB9接口”之间通过串口信号线建立起连接,串口信号线中使用”RS232标准”传输数据信号。由于RS232电平标准的信号不能直接被控制器直接识别,所以这些信号会经过一个”电平转换芯片”转换成控制器能识别的”TTL校准”的电平信号,才能实现通讯。

芯片和PC机相连,通常PC机使用的是RS232接口(9针)。如果要使芯片与PC机的RS232接口直接通信,需要将芯片的输入输出端口也电平转换为RS232类型,再交叉连接,二者的电平标准不同:

  • 单片机的点评标准(TTL电平):+5V表示1,0V表示0;
  • RS232电平标准:+15/+13V表示0,-15/-13表示1;

因此单片机与PC机进行串口通信应该遵循:在单片机串口与上位机给出的RS232口之间,通过电平转换电路实现TTL电平与RS232电平间的转换。

下图为DB9标准串口通讯接口:

DB9引脚说明:

上表中的是计算机端的DB9公头标准接法,由于两个通讯设备之间的收发信号(RXD与TXD)应交叉相连,所以调制调解器端的DB9母头的收发信号接法一般与公头的相反,两个设备之间连接时,只要使用”直通型”的串口线连接起来即可。

串口线中的RTS、CTS、DSR、DTR及DCD信号,使用逻辑 1表示信号有效,逻辑0表示信号无效。例如,当计算机端控制DTR信号线表示为逻辑1时,它是为了告知远端的调制调解器,本机已准备好接收数据,0则表示还没准备就绪。

如果使用USB转串口也可以实现串口通讯,USB转串口电路图如下所示:

3、远程串口使用

要想在办公室的电脑上连接生产线上的串口设备,如智能模块、仪表、PLC等,直接拉一条长距离串口线肯定是不行的,因为中间的距离实在太长了,对于这段不可跨越的距离,我们可以借助以太网来实现,即工厂的局域网,解决方案如下图示(以PLC连接为例说明)。

实现方法:

  • 在PLC端增加一个串口服务器,实现串口转网口功能。串口服务器有一个网口和一个串口。
  • 远程电脑主机和串口服务器分别通过网线接入局域网,获得IP地址,建立网络连接。
  • 在电脑端运行虚拟串口软件,目的是将远程串口服务器上的串口虚拟成本机串口,效果是可以把远端的串口当作本地串口来使用。方法是先通过网络搜索串口服务器,找到后再分配一个空闲的串口号当作本机串口,如下图:

  • 此时电脑端的PLC编程软件就可以使用刚才指定的串口号来连接远程的PLC,效果就像本地连接一样方便。连接其它串口设备也同样的道理。

注意:

  • 串口服务器的IP地址最好设置为固定IP,这样可减少因动态IP变动导致的通讯故障。
  • 串口服务器在跨网段应用时,一定要设置好网关地址。

4、C#开发上位机串口通讯

对于上位机来说,我们只需要得到第三方提供的自定义通信协议,根据其中的内容进行编程即可,具体的功能实现是由硬件工程师实现。

串口通讯大都有相应的库函数,大家在使用和配置串口的时候直接进行调用库函数和配置就行了,如下面的案例。

首先我们实现一个界面,如下:

配置串口参数-打开串口:

发送数据:

接收数据:

使用异步接收数据。

如果需要写完之后直接读。

参考以下方法:

效果图:

基于自定义协议的通信(发送和接收都使用16进制进行),首先自定义一个通信协议。

使用RS232进行通信,设定如下:

  • 波特率:9600;
  • 数据位:8;
  • 停止位:1;
  • 奇偶校验:无;

通信协议内容:

  • 寄存器1 置1 执行 功能1 地址 0b;
  • 寄存器2 置1 执行 功能2 地址 1b;
  • crc校验: 将数据+地址等通过与或等操作生成的一个值(一般自定义的都会进行校验);
  • 开始位:01;
  • 结束位: 05;
  • 地址位:0a(根据不同寄存器决定);
  • 结果位:0e ( 成功0e,失败00);

发送例子:执行功能1。

01 0b 01 00 00 00 00 00 00 00 06 0e 05

解析:

01是开始位,0b是对应寄存器1的地址,数据长度是8,没有数据的置00,06是crc校验生成值,0e是结果位,05 是结束位。

返回成功:

01 0b 01 00 00 00 00 00 00 00 06 0e 05

返回失败:

01 0b 01 00 00 00 00 00 00 00 07 00 05

自定义的一个最简单的一个自定义协议,通信流程如下:

  1. 上位机发送数据
  2. 下位机接收到数据
  3. 下位机做crc校验,如果失败,那么不做反应。
  4. 下位机crc校验成功,执行功能。并反馈结果。
  5. 上位机接收到数据,做crc校验,如果成功,认为数据正确。否则认为数据错误,执行失败。
  6. 完成通信

模拟寄存器处理上位机发送的指令:

指令正确返回(与协议中对应):

指令错误返回(与协议中对应):

代码下载:

studydome: 1221211232023032032030320



版权声明:本文为qq_35029061原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。