串口通信指串口按位(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英尺。
握手:
DCD(pin 1):数据载波检测(Data Carrier Detect)
DTR(pin 4):数据终端就绪(Data Terminal Ready)
GND(pin 5):地线
注意:一般我们需要的就是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值。
示例代码实现:
- U16 crc16_check(U8 *data_ptr, U8 data_length)
- {
- /*polynomial*/
- U16 crc_gen = 0xa001;
- U16 crc;
- U8 i, j;
- /*init value of crc*/
- crc = 0xffff;
- if (data_length != 0)
- {
- for (i = 0; i < data_length; i++)
- {
- crc ^= (U16)(data_ptr[i]);
- for (j = 0; j < 8; j++)
- {
- if ((crc & 0x01) == 0x01)
- {
- crc >>= 1;
- crc ^= crc_gen;
- }
- else
- {
- crc >>= 1;
- }
- }/*end for*/
- }/*end for*/
- }/*end if*/
- 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