串口通信协议

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

        串口通信协议(Serial communication protocol),用于获取远程采集设备的数据,发送和接收字节。

        在串口通信中,常用的协议包括RS-232、RS-422和RS-485。


RS-232协议

       RS-232(ANSI/EIA-232标准)是IBM-PC及其兼容机上的串行连接标准。可用于许多用途,比如连接鼠标、打印机或者Modem,同时也可以接工业仪器仪表。用于驱动和连线的改进,实际应用中RS-232的传输长度或者速度常常超过标准的值。RS-232只限于PC串口和设备间点对点的通信。RS-232串口通信最远距离是50英尺。

 


  

数据:
TXD(pin 3):串口数据输出(Transmit Data)
RXD(pin 2):串口数据输入(Receive Data)
握手:
RTS(pin 7):发送数据请求(Request to Send)
CTS(pin 8):清除发送(Clear to Send)
DSR(pin 6):数据发送就绪(Data Send Ready)
DCD(pin 1):数据载波检测(Data Carrier Detect)
DTR(pin 4):数据终端就绪(Data Terminal Ready)
地线:
GND(pin 5):地线
其它
RI(pin 9):铃声指示

注意:一般我们需要的就是2,3,5接口,连接时是TXD接RXD,RXD接TXD,GND接GND(同地线,统一低电平标准)。可以自己的TXD口接RXD口,自发自收,测试串口是否正常。

串口通信接口的基本任务:



CRC校验算法

    关于错误校验常用三种就是奇偶校验、累加和校验和CRC校验;前两种校验方法相信大家有有所了解,所以这里重点介绍一下CRC算法;

    CRC(循环冗余校验码):CRC 算法的基本思想是将传输的数据当做一个位数很长的数。将这个数除以另一个数。得到的余数作为校验数据附加到原数据后面。传输的时候将传输的数据和校验数据一块发送这个,在接收端我们利用接收到的数据利用“模二除法”除以利用的多项式,如果余数为0说明传输过程中没有差错,如果不为0表明传输过程中有错误。

step1:确认使用的多项式,通常我们会采用固定的多项式,常见的几种生成多项式如:

CRC8=X8+X5+X4+X0

CRC-CCITT=X16+X12+X5+X0

CRC16=X16+X15+X2+X0

CRC12=X12+X11+X3+X2+X0

CRC32=X32+X26+X23+X22+X16+X12+X11+X10+X8+X7+X5+X4+X2+X1+X0

生成多项式确定之后我们就可以进行算法编程: 从前面的介绍我们知道CRC校验核心就是实现无借位的除法运算(即模二除法)。下面还是通过一个例子来说明如何实现CRC校验。

假设我们的生成多项式为:100110001(简记为0x31),也就是CRC-8

则计算步骤如下:

(1)      将CRC寄存器(8-bits,比生成多项式少1bit)赋初值0

(2)      在待传输信息流后面加入8个0

(3)      While (数据未处理完)

(4)      Begin

(5)          If (CRC寄存器首位是1)

(6)              reg = reg XOR 0x31

(7)          CRC寄存器左移一位,读入一个新的数据于CRC寄存器的0 bit的位置。

(8)      End

(9)      CRC寄存器就是我们所要求的余数。

实际上,真正的CRC 计算通常与上面描述的还有些出入。这是因为这种最基本的CRC除法有个很明显的缺陷,就是数据流的开头添加一些0并不影响最后校验字的结果。这个问题很让人恼火啊,因此真正应用的CRC 算法基本都在原始的CRC算法的基础上做了些小的改动。

所谓的改动,也就是增加了两个概念,第一个是“余数初始值”,第二个是“结果异或值”。

所谓的“余数初始值”就是在计算CRC值的开始,给CRC寄存器一个初始值。“结果异或值”是在其余计算完成后将CRC寄存器的值在与这个值进行一下异或操作作为最后的校验值。

常见的三种CRC 标准用到个各个参数如下表。

 

CCITT

CRC16

CRC32

校验和位宽W

16

16

32

生成多项式

x16+x12+x5+1

x16+x15+x2+1

x32+x26+x23+x22+x16+

x12+x11+x10+x8+x7+x5+

x4+x2+x1+1

除数(多项式)

0x1021

0x8005

0x04C11DB7

余数初始值

0xFFFF

0x0000

0xFFFFFFFF

结果异或值

0x0000

0x0000

0xFFFFFFFF

 

加入这些变形后,常见的算法描述形式就成了这个样子了:

(1)      设置CRC寄存器,并给其赋值为“余数初始值”。

(2)      将数据的第一个8-bit字符与CRC寄存器进行异或,并把结果存入CRC寄存器。

(3)      CRC寄存器向右移一位,MSB补零,移出并检查LSB。

(4)      如果LSB为0,重复第三步;若LSB为1,CRC寄存器与0x31相异或。

(5)      重复第3与第4步直到8次移位全部完成。此时一个8-bit数据处理完毕。

(6)      重复第2至第5步直到所有数据全部处理完成。

(7)      最终CRC寄存器的内容与“结果异或值”进行或非操作后即为CRC值。

     示例代码实现:

  1. U16 crc16_check(U8 *data_ptr, U8 data_length)  
  2. {  
  3.     /*polynomial*/  
  4.     U16 crc_gen = 0xa001;  
  5.     U16 crc;  
  6.     U8 i, j;  
  7.   
  8.   
  9.     /*init value of crc*/  
  10.     crc = 0xffff;  
  11.     if (data_length != 0)  
  12.     {  
  13.         for (i = 0; i < data_length; i++)  
  14.         {  
  15.             crc ^= (U16)(data_ptr[i]);  
  16.             for (j = 0; j < 8; j++)  
  17.             {  
  18.                 if ((crc & 0x01)  == 0x01)     
  19.                 {  
  20.                     crc >>= 1;      
  21.                     crc ^= crc_gen;  
  22.                 }  
  23.                 else  
  24.                 {  
  25.                     crc >>= 1;  
  26.                 }  
  27.             }/*end for*/  
  28.         }/*end for*/  
  29.     }/*end if*/  
  30.     return crc;  




特点与格式: 起止式异步协议的特点是一个字符一个字符传输,并且传送一个字符总是以起始位开始,以停止位结束,字符之间没有固定的时间间隔要求。其格式如图所示。每一个字符的前面都有一位起始位(低电平,逻辑值 0),字符本身有 5~7 位数据位组成,接着字符后面是一位校验位(也可以没有校验位),最后是一位,或一位半,或二位停止位,停止位后面是不定长度的空闲位。停止位和空闲位都规定为高电平(逻辑值),这样就保证起始位开始处一定有一个下跳沿。从图中可以看出,这种格式是靠起始位和停止位来实现字符的界定或同步的,故称为起始式协议。传送时,数据的低位在前,高位在后,下图表示了传送一个字符 E 的 ASCAII 码的波形 1010001。当把它的最低有效位写到右边时,就是 E的 ASCII 码 1000101=45H。


起/止位的作用: 起始位实际上是作为联络信号附加进来的,当它变为低电平时,告诉收方传送开始。它的到来,表示下面接着是数据位来了,要准备接收。而停止位标志一个字符的结束,它的出现,表示一个字符传送完毕。这样就为通信双方提供了何时开始收发,何时结束的标志。传送开始前,发收双方把所采用的起止式格式(包括字符的数据位长度,停止位位数,有无校验位以及是奇校验还是偶校验等)和数据传输速率作统一规定。传送开始后,接收设备不断地检测传输线,看是否有起始位到来。当收到一系列的“1”(停止位或空闲位)之后,检测到一个下跳沿,说明起始位出现,起始位经确认后,就开始接收所规定的数据位和奇偶校验位以及停止位。经过处理将停止位去掉,把数据位拼装成一个并行字节,并且经校验后,无奇偶错才算正确的接收一个字符。一个字符接收完毕,接收设备又继续测试传输线,监视“0”电平的到来和下一个字符的开始,直到全部数据传送完毕。

  由上述工作过程可看到,异步通信是按字符传输的,每传输一个字符,就用起始位来通知收方,以此来重新核对收发双方同步。若接收设备和发送设备两者的时钟频率略有偏差,这也不会因偏差的累积而导致错位,加之字符之间的空闲位也为这种偏差提供一种缓冲,所以异步串行通信的可靠性高。但由于要在每个字符的前后加上起始位和停止位这样一些附加位,使得传输效率变低了,只有约80%。因此,起止协议一般用在数据速率较慢的场合(小于 19.2kbit/s)。在高速传送时,一般要采用同步协议。


  所谓传输率就是指每秒传输多少位,传输率也常叫波特率。国际上规定了一个标准波特率系列,标准波特率也是最常用的波特率.符号bps(bite pre second)


课外知识:

电气和电子工程师协会( IEEE,全称是Institute of Electrical and Electronics Engineers)

国际标准化组织(International Organization for Standardization,ISO)简称ISO




  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值