|
第一:硬件层协议2 i- v6 y& a" X. K8 ^
2 O T8 i# W$ V4 Y x
% W! i# z9 g: w) e: V- N
8 w1 y, H- b, m+ B9 q. n通讯协议主要是实现两个设备之间的数据交换功能,通讯协议分硬件层协议和软件层协议。硬件层协议决定数据如何传输问题,比如要在设备1向设备2发送0x63,0x63的二进制数为0110 0011,这8个二进制数从设备1传输到设备2,涉及到1怎么传,0怎么传的问题,这就是硬件层要解决的问题。9 f, Y e: r) |
硬件层协议目前比较多见的有RS-232、RS-485、SPI、IIC等。RS-232规定,线上的电压为x伏都表示传输的是0,y伏传输的则是1。再者,比如要选择多少条线传输数据,选择什么材质的线传输输入,这些也属于硬件层协议约束的。
& T- K* W4 b a5 u @/ a$ Y# k9 K8 S: X6 Y J3 n1 a
0 k, }+ R! O$ g/ m- f
/ m2 I4 M3 |/ S' ?. s7 w
1 H8 y' n3 l5 ^' T3 w: g' C4 u- Y' {
第二:RS-485通讯协议
+ |: s3 n, [! G. n( Q9 F& u T
6 {# h1 h# l( K9 g3 N
7 k6 T$ M& H. c9 \& e# t0 n9 j$ I6 ?) }2 x. A
MCU管脚输出TTL电平,TTL电平的意思是,当MCU管脚输出0电平时,一般情况下电压是0V,当MCU管脚输出1电平时,电压是5V。因TTL电平的是由一条信号线,一条地线产生,信号线上的干扰信号会跟随有效信号传送到接收端,使得有效信号受到干扰,485通讯实际上是把MCU出来的TTL电平通过硬件层的一个转换器芯片进行转换:
- n) q& C; ^: S& k
+ Q: C/ W2 z( v
' v7 S6 Y0 N' W$ B/ W1 N
) x6 ?# h* d* a U) q9 i6 `9 I3 t! ]: J
2 p. o; j' Q) T% k) }# S& A, J. A+ S) n+ s( e6 |
% I. H( _. R o9 l% M
! u Q9 s G, R7 V) J; ]
把MCU出来的一条的TTL信号经过芯片转换为两根线(线A、线B)上的信号。当MCU给转换器输入低TTL电平时,转换器会使得B的电压比A的电压高,反之,A的电压比B的电压高。
5 E) Z6 a6 N8 t9 U! T/ r: `485协议规约两条电平线上差值为多少表示0或者1,电压是通过仪表可以测量得到的,所以说RS-485是硬件层协议。 r% T5 J1 e6 G: H
485协议的接收端可能是另一个MCU,MCU管脚也只接受TTL电平,转换芯片过来的是两条线的电压,所以需要对此两条线差分电压转换为TTL电平。3 L/ {3 l- i) Y1 ]
6 A+ x% O h* D- J4 D( ^1 J
, z( O! _# }; | y) \) `3 y- F
: p% g3 T5 J" q: b+ B6 s把TTL转为485,实质是一个集成芯片,其间无任何程序代码,纯粹硬件逻辑。同理,将485电平转为TTL也是如此。现在很多芯片把接收和转换都集成到一块IC,注意,转换器和接收器依旧是没有同时工作的,常见的转换芯片是MAX485。 : ^5 E. W; y; x$ B+ r- p5 r0 E& J* ?
可以这样理解,硬件层协议是公路,路的目的是为了让车辆能够过去。( x$ \6 _5 g& U2 [ R2 u
0 q# w7 T' Z7 D% j3 Q
m9 _7 J+ C2 C) S3 A# r
第三:RS485半双工通讯
& Z, s6 W* t8 ^) \2 J3 H. M [' d4 p8 R- O3 _ c( U, u
. V2 v% I- M/ ?0 Y& B
6 T" T: g; [ t& o3 ~% }$ d6 N& a5 ]+ e4 C- h! }+ C8 F
( ~ p, M: L. P# S% _9 F% [
1 \8 ? x8 D: z: D5 z! Y) Y首先了解什么是单工通讯,单工通讯是指数据只能朝着一个方向传输的通讯方式。而半双工通讯则是指对于通讯两端,不能同时相对方法发送数据,必须错开时间段发送。
* R. g' G: Z6 N; D6 g1 ?# o# lRS-485的通讯线只有2条,且这两条通讯线在一次传输中都需要用到,因此485只可实现半双工通讯。485实现半双工通讯,会遇到一个问题,MCU1向MCU2发数据时,并不知道线上是否正传来MCU2数据,因为没有其他线可用来判断对方的收发状态,那么可能也会导致数据冲突。因此,RS-485要实现半双工通讯,就需要上层的软件协议加以规约,也就是做到”不能你想发数据就发数据”。可以理解,软件层协议就好像交通规则,它能让数据有序传输。
- o+ u. A) n# k6 D* D5 [8 L' \# L6 _5 q
' T u1 t. q# [- G3 ? P" }4 d" [3 p" D; P; M; I" h4 J
第四:RS232通讯# g' t# \; ]$ G- Q/ T' e
" L' B) p# c& W2 o& h7 }, R) c) s
RS-232是美国电子工业联盟制定的串行数据通信接口。现在RS232接口常用于仪器仪表设备,PLC以及嵌入式领域当作调试口来使用。
* V9 h# N7 Q+ X
2 @& t- }/ P+ c5 ?+ X1 z( r
' r2 V S. K" b/ j3 @( S第五:RS232接口形态
' q4 h5 x5 M' V7 L b0 k1 b
) C+ z/ d' R6 Y3 W8 B, J
, L3 h) f$ [. s; l6 Q5 {+ Y按照引脚数量分类有两种:
8 d! R$ j a- n/ z5 Y; ^1 X25pin–DB25 协议标准推荐的接口类型: N" x1 y0 H- a: A: d
由于接口物理尺寸较大,很少使用,此处不做具体介绍。
& Z; u4 |! F0 G+ w( F9pin—DE9(通常误叫做DB9) 自IBM PC/AT开始改用9针连接器起,目前是主流接口形态。9针RS232接口按照接口类型,又可以分为:
4 L9 H0 C4 x# R- A" U公头(Male):带针脚
6 }4 a7 D4 l3 c% L9 s- z
@8 `' Z3 C7 j- B+ z0 B+ z
' {8 ? I$ c$ E- ?9 g M( V2 N
$ t& n3 d# Z) F) M母座(Female):带孔座
" @9 Z9 V, K$ I6 P- ] m* s7 d4 t5 B5 Y
: D1 h$ k9 N9 G
) e6 p& l' m! O! s% J3 U5 C8 N0 \+ [' `, T a
7 m0 i# N; m- q1 c
$ s' @- I$ i4 T; \7 Y- ?1 o
' x; A* N/ }, l2 H
: x9 P0 G1 A# |0 x- _% z2 x7 r
6 U! `# U- y( U6 \# g) I3 U: z4 ? v- [0 j# @- p
其中DTR/DSR和RTS/CTS用于硬件流控。
9 U }) ]$ p- v: X ~ DTR/DSR状态表明DTE和DCE处于可用状态,有时候设备上电这两个信号即有效,表示设备本身可用使用,但要开始进行数据传输通讯,则需要RTS/CTS流控信号。: H2 G8 K- H9 B' H
RTS即DTE发送数据时,该信号有效(ON),向DCE请求发送数据;CTS是对请求发送RTS信号的响应,当DCE已经准备好接收数据时,该信号有效(ON),通知DTE可用使用TXD发送数据了。2 R* W2 ?; j3 ?4 U
比如A向B发送数据简单如下逻辑:
) \+ K' z+ }# J% [1 DA先设置RTS为1,表示要发数据给B
3 y) x7 p' }6 C& n8 D1 LB检测到RTS为1,先看看自己是否准备好:
/ }& \! G9 e' t# J如果准备好,就设置CTS为1表示A可用发数据给B了
( Z: }! o4 ~& Q; z, f如果没有准备好,继续处理自己的数据。弄完了,再将CTS设置为1,让A发数据' S8 @- @) \6 |. F) G7 k- I
A发现CTS置1了,将数据通过TXD信号线发送出去; V: O" l2 o6 ]2 f" r
A每发送一次数据给B之前,都会继续上面的逻辑
: V' e7 v1 W$ [8 a0 {A发送完数据后,就将RTS置0,表示数据发送完毕/ O- Y |0 J2 h, A0 k
; d# Z* O; F- K; v
0 g- [* U, A5 H第六:RS232硬件连接方式
4 ^1 W t" u7 u. K: ^, t/ {
# D2 V! H% a4 A8 B& s+ `) { i
3 q' [2 `4 t! l4 o9 C
- s4 a; z5 b) ]7 `连接分为3种
. u( b; V( r6 ]& f4 d" I% i+ Y( b* L, V/ a
0 ?# \( W6 \3 y6 t; i9 \, R; ]
第一种:9线方式连接示意图
6 c& `/ ~- L5 }, Q1 R' n% @4 m& W1 U6 J. f0 q5 x
" }- \$ [* w+ ~/ f9 i/ ?/ }
! O- E6 ?& Z/ Z4 l" t' A3 f1 P3 o
0 [8 @/ o- i4 p5 |2 Z
" f3 ]) ?" L: m* ~% K3 H3 \7 y5 f5 ?- `
第二种:5线方式连接示意图
! L" u/ I8 n; I3 r' @4 D4 X0 `. D- r" u$ a, i1 G
& g. j8 M# {+ s# r/ i- Z
- w/ S4 T% k5 K5 q0 W* p2 O2 [$ G
3 a" Y+ ]1 |9 o, Z' B& V
1 w: E& E/ F: d& P) F3 a
* |- H% c% J$ X* O3 ]
* K9 Y, L# ]& M1 Z' B6 ?
9 h1 X0 f' ~- g& q1 Z$ l3 }9 V第三种:3线式连接示意图
9 K. _* } U( f7 j" v: L4 v; Q$ k! L6 s
, _7 ~- a, p' s- V; j4 P0 C2 H
) p P1 J P! W, b注:3线连接中,DTE使用TXD和RXD两条数据线,无法实现硬件流控功能,在做大量数据传输应用时,建议使用5线或9线连接方式。
& c8 `7 |$ g9 k2 s d7 |
. Z. L, s3 Y* ]$ T2 ?* L
' W+ q0 l0 |3 s1 z* [8 k4 b+ i第七:电平及时序; d& s, t: }. y% {5 S* z
: H* B, s9 H, k* b
0 y; K! z5 j) s" x% ?' b4 g9 |0 ~# D4 W! M+ x
) @+ \8 b# m( m0 `- A+ U
; L6 ?; L/ G n) x/ Z+ k
3 H; x7 U9 z- E: J$ C, o# K0 w
0 Q$ r1 i4 D8 I9 I! U. ?. q下图是使用RS232接口按照UART串口协议进行传输,UART协议具体请参考 UART详解。图中传输的数据为0100 1011b 即0x4B,按照1bit开始位,8bit数据位,1bit停止位格式传输。
0 `. q' k8 W0 N3 M* g; q3 Z3 C! P9 L2 O I7 h" m" n
- }* ?% g O$ R" G0 b# ~! }
9 N; U" z8 v1 ^) b9 j c" _2 V' z" O: R$ a
1 }: z u; L; D/ A" b% l/ |第八:最大通讯距离及速率) b3 C% o h+ V( o
, R8 N/ j6 j2 H8 ~8 @* @; S, _协议最初规定设备最大速率为20kbps。
& L# y" J$ C2 `( W; e0 H% C# X+ q4 g( Y: }9 e6 G
) s, b( \; T' j% P% b3 ~ m4 y8 F" L9 i& H( ~) p
: Y7 M; i# [' ?2 f+ ?: _0 M1 ~1 S! G4 v \% C; W
注:协议规定最大速率为20kbps,现在看来这个速率已经很低了。一些芯片制造商已经做出了高速率的芯片驱动,具体速率上限请查看器件手册。 |
|