|
第一:硬件层协议
. D( w) c/ `* E8 O2 @$ q( S, M6 W6 W! ^* ^
& h4 g1 w V# I; G: K3 H, U' K% l0 u
通讯协议主要是实现两个设备之间的数据交换功能,通讯协议分硬件层协议和软件层协议。硬件层协议决定数据如何传输问题,比如要在设备1向设备2发送0x63,0x63的二进制数为0110 0011,这8个二进制数从设备1传输到设备2,涉及到1怎么传,0怎么传的问题,这就是硬件层要解决的问题。/ m' S' ?# |$ O7 U" f5 \/ S5 \7 ~
硬件层协议目前比较多见的有RS-232、RS-485、SPI、IIC等。RS-232规定,线上的电压为x伏都表示传输的是0,y伏传输的则是1。再者,比如要选择多少条线传输数据,选择什么材质的线传输输入,这些也属于硬件层协议约束的。
7 A# T% q# S% x# [- L; O
% f+ E( y* Q0 B5 S3 d
$ a& U- ]% [6 F$ ^9 _' {8 Q8 j `; Z2 B3 V; A. ^( w3 n* V% q
! N! U: ` l3 r' M3 u% n' b
# R- l- k, X, u# R2 O
第二:RS-485通讯协议" ?0 y& L1 ?3 ^/ `
1 D# D/ N2 j4 G% I1 ~7 j+ V+ ~* I/ |8 i& }+ l% j
/ B! q* s+ z3 F8 T5 J/ s6 s. I" D
MCU管脚输出TTL电平,TTL电平的意思是,当MCU管脚输出0电平时,一般情况下电压是0V,当MCU管脚输出1电平时,电压是5V。因TTL电平的是由一条信号线,一条地线产生,信号线上的干扰信号会跟随有效信号传送到接收端,使得有效信号受到干扰,485通讯实际上是把MCU出来的TTL电平通过硬件层的一个转换器芯片进行转换:
% E& A* k' X0 d* C& N( ^5 B+ I: h3 c7 V4 ]( l
3 @/ L7 o) R2 F
, I$ Y, k: {* H. R, C: {* C* D0 t3 L) B0 z' `3 n
3 u r( W$ F- \/ H. U5 ~1 Y( J. v; x& M2 x
( t% {$ W* N' a/ v2 D
$ W' M/ w1 f6 }3 s8 O- ?7 `把MCU出来的一条的TTL信号经过芯片转换为两根线(线A、线B)上的信号。当MCU给转换器输入低TTL电平时,转换器会使得B的电压比A的电压高,反之,A的电压比B的电压高。
7 V& W0 l. o5 ?, k. V2 _4 h485协议规约两条电平线上差值为多少表示0或者1,电压是通过仪表可以测量得到的,所以说RS-485是硬件层协议。
9 V% ^% ~; j* s* w& G# I z485协议的接收端可能是另一个MCU,MCU管脚也只接受TTL电平,转换芯片过来的是两条线的电压,所以需要对此两条线差分电压转换为TTL电平。
; F6 V, ]9 I# T$ m8 f7 ^% W4 n& b+ h8 `# E7 u+ W0 O
, q; M; ]6 a0 P3 @, S
1 m. v# j `3 D" A4 ]
把TTL转为485,实质是一个集成芯片,其间无任何程序代码,纯粹硬件逻辑。同理,将485电平转为TTL也是如此。现在很多芯片把接收和转换都集成到一块IC,注意,转换器和接收器依旧是没有同时工作的,常见的转换芯片是MAX485。 0 F# I- b/ r8 {) S: g: L
可以这样理解,硬件层协议是公路,路的目的是为了让车辆能够过去。, u- ]7 ?" C1 \, ~6 y1 A
2 E" [$ j$ J/ i: q" q
6 g& } H9 K' s第三:RS485半双工通讯1 y8 d) \* Q; p, u6 K. C
1 @% {, L! H) _ B
3 T. Q' G! `3 b/ Q; F4 v+ }
1 W; V' _ L( _6 m* }
2 l; B0 F) d9 U& m1 u
' \+ A% q/ g. J0 y6 f1 ~
7 o3 H `( t3 w& D* K" c5 D
首先了解什么是单工通讯,单工通讯是指数据只能朝着一个方向传输的通讯方式。而半双工通讯则是指对于通讯两端,不能同时相对方法发送数据,必须错开时间段发送。 0 V6 K6 B, J; \& N1 |: e
RS-485的通讯线只有2条,且这两条通讯线在一次传输中都需要用到,因此485只可实现半双工通讯。485实现半双工通讯,会遇到一个问题,MCU1向MCU2发数据时,并不知道线上是否正传来MCU2数据,因为没有其他线可用来判断对方的收发状态,那么可能也会导致数据冲突。因此,RS-485要实现半双工通讯,就需要上层的软件协议加以规约,也就是做到”不能你想发数据就发数据”。可以理解,软件层协议就好像交通规则,它能让数据有序传输。4 i8 G& {7 G; _0 t5 r
6 ?: L; ^& F+ Y' q% ]1 h! z
, E* \+ S( Q; C- O+ M$ ^2 ~$ r+ m {
9 N( ]5 A2 o% f# V' Y( F第四:RS232通讯
; R- ]& ~) I/ G5 ~
2 m/ i+ S# @1 a; x; g
/ h2 z+ Q! @" N! I `2 T3 ^: V9 i RS-232是美国电子工业联盟制定的串行数据通信接口。现在RS232接口常用于仪器仪表设备,PLC以及嵌入式领域当作调试口来使用。; r7 o5 _+ O4 T6 Z; v6 B! l9 A
( {; c# Q1 c7 F: A
3 t1 S' h* p" c/ ^1 k/ S0 P
第五:RS232接口形态
" @! x# m' x8 Y- u9 |2 X3 q% R! m
, ?- E/ n1 Q6 C, P2 b( S6 ^) B, W按照引脚数量分类有两种:$ D7 B) \7 t B3 }/ C
25pin–DB25 协议标准推荐的接口类型+ C3 p s7 ~, b" c6 `2 E
由于接口物理尺寸较大,很少使用,此处不做具体介绍。
9 C; s6 |* i6 X6 f2 i7 K2 r1 U9pin—DE9(通常误叫做DB9) 自IBM PC/AT开始改用9针连接器起,目前是主流接口形态。9针RS232接口按照接口类型,又可以分为:) f7 I) f' N! j# r6 X3 O* j& v
公头(Male):带针脚
5 p% V. i G% D' g4 Y; @" i0 W4 R% Y( Q9 [$ @0 y: z( s% ?- ]& `
& J% d8 ]* \3 s- T* {: P8 q; B( z! e2 ]
: d2 `# K: l, ]9 b2 E$ D0 J$ s/ T6 ]
母座(Female):带孔座
0 h0 x' I# }" V) w H) C
+ c7 E7 q) Z) K/ j1 o# }( T5 ~2 h- i
: G0 {2 m+ b- D: F6 [
# X# r5 c( Q7 {5 N; l* ^. h# x
) F, A6 K4 G# y9 _+ `) v; X! h
+ |( F* S3 s+ z, V# a: l; m& ?" E. q8 _1 W9 J0 A
. Q$ E4 z6 H5 p+ H
! z+ a$ n& Q# ?$ c/ Q: O9 Q% R! H) D' p+ B2 r% {0 J. O) i
! x! B/ L6 l/ z& Y% {8 Y其中DTR/DSR和RTS/CTS用于硬件流控。
; P4 v" P8 E1 f" b1 i0 f$ d( @/ h% P9 f DTR/DSR状态表明DTE和DCE处于可用状态,有时候设备上电这两个信号即有效,表示设备本身可用使用,但要开始进行数据传输通讯,则需要RTS/CTS流控信号。
3 ?& m* C, W% x( H4 H$ C( _7 S RTS即DTE发送数据时,该信号有效(ON),向DCE请求发送数据;CTS是对请求发送RTS信号的响应,当DCE已经准备好接收数据时,该信号有效(ON),通知DTE可用使用TXD发送数据了。
0 R& L1 E6 F; |$ `. i2 t! A" t9 X9 B' b比如A向B发送数据简单如下逻辑:" w# O5 ~- g+ W' b, j6 ?2 o+ N+ \
A先设置RTS为1,表示要发数据给B. N5 {: s9 X3 q3 `5 ]
B检测到RTS为1,先看看自己是否准备好:
2 b1 V; O% I1 m' [, K% h+ K如果准备好,就设置CTS为1表示A可用发数据给B了$ E1 k2 k" U, h& I
如果没有准备好,继续处理自己的数据。弄完了,再将CTS设置为1,让A发数据# h( M$ F: k0 x% ]8 ] U& U, s2 T
A发现CTS置1了,将数据通过TXD信号线发送出去0 y3 Z) z3 @3 z" u
A每发送一次数据给B之前,都会继续上面的逻辑; N; {( Y) R( C8 x: h' J& X6 I* z, ]
A发送完数据后,就将RTS置0,表示数据发送完毕) f8 w2 a% u0 W# k
0 J d& v: H! B5 T# A' \
$ L8 u% F/ [+ c! O7 D% z第六:RS232硬件连接方式
, z& X) k; T- Y1 z+ N2 l* v1 _6 L8 N0 d$ h
' L' N! P" [* [( G' O6 q4 C6 t- }
# r. S. c( Q" k, C9 K
连接分为3种
9 w" g! n' v3 p# S9 u. R! H" |6 K% e' Y4 ?" E# a; t
2 X) b8 v& Q" b- E F/ K3 h/ {9 Q i第一种:9线方式连接示意图
2 J2 M9 f+ v$ ~7 s1 q9 A7 z' X. j) D0 y' g+ k! B" s& D3 u
: R O* }( V& j1 I4 Y; a) u( q6 Z4 M' t8 l- m
/ O8 h5 B: `/ R6 @
; Q5 I* w. I- F* G$ L9 ~; e6 C1 l( m/ S% M8 l, V2 ~( p
2 q& A/ ]2 e0 K8 _$ @6 T M
第二种:5线方式连接示意图, l8 f+ \& \7 f) a
; |+ ]( s" H. `! B8 U- x6 e8 S# l' l3 \" q% ^
! B) G2 v2 j0 v% S3 V
}) `) s3 g: b+ C0 J0 E( }
+ L3 M" | T" E5 r* I7 l/ O
% t& d# [( x9 f3 z" Z3 W+ c' Z5 v- g9 z6 N* l6 Q
, R/ E, g. R0 f" m第三种:3线式连接示意图+ E1 K3 N, {3 r/ [! R0 b" C
) Y+ x( i6 K# Y$ U% a. S& E
7 a! ? s) y) F! g2 b& h+ C5 r1 P
6 i1 z8 f' i: j* s M
注:3线连接中,DTE使用TXD和RXD两条数据线,无法实现硬件流控功能,在做大量数据传输应用时,建议使用5线或9线连接方式。
+ p. y/ C6 O; t2 j" @ P
% Q3 ~8 @ c, w! ^; b% `6 V0 K+ `' ?, M8 F. H3 Z1 s
第七:电平及时序
! L, g4 Q$ |; [( i) _3 f
3 L# W& @2 ] W; G% W4 A1 V" y% J/ Q/ f( o
3 l `+ ]5 ~9 u
6 f' }. f3 `2 M; @2 j# V
' [; F4 Y! Y: ^1 }
& |) A0 J$ ?" q' M$ b% G0 N& ^7 g# {1 U: P6 l
下图是使用RS232接口按照UART串口协议进行传输,UART协议具体请参考 UART详解。图中传输的数据为0100 1011b 即0x4B,按照1bit开始位,8bit数据位,1bit停止位格式传输。
, \ H0 O C- Q. R9 a" h( u6 R7 I% S9 |
, Z+ d5 w% g0 P. E' G
1 j+ \; g/ Y1 i3 [, p5 a' \0 g) w6 y; s. A
# b. H% @$ u9 ~! I& J
第八:最大通讯距离及速率9 I+ Z# m% l3 n" j( S
3 @, v5 p/ y- p1 |! }4 n/ A协议最初规定设备最大速率为20kbps。9 N% G' o+ Q1 S$ P0 h
B s* X8 i1 c
3 ?$ S! Z7 }/ S) Y
# P( G# P+ H9 l7 M6 ^+ }
( C+ r# x5 @* z4 [6 R" j: i$ p# B
* u* i& }& z% s+ R9 v
注:协议规定最大速率为20kbps,现在看来这个速率已经很低了。一些芯片制造商已经做出了高速率的芯片驱动,具体速率上限请查看器件手册。 |
|