|

第一:硬件层协议& t& f$ b& S- N
4 v) s1 I* G& E, ?* e- [9 S+ S7 V0 B5 `
5 l/ i! t1 K$ Y9 b* e' o# C& T通讯协议主要是实现两个设备之间的数据交换功能,通讯协议分硬件层协议和软件层协议。硬件层协议决定数据如何传输问题,比如要在设备1向设备2发送0x63,0x63的二进制数为0110 0011,这8个二进制数从设备1传输到设备2,涉及到1怎么传,0怎么传的问题,这就是硬件层要解决的问题。
1 i& d5 M F& ?硬件层协议目前比较多见的有RS-232、RS-485、SPI、IIC等。RS-232规定,线上的电压为x伏都表示传输的是0,y伏传输的则是1。再者,比如要选择多少条线传输数据,选择什么材质的线传输输入,这些也属于硬件层协议约束的。1 l& H- d8 w$ A0 Z) a
- C1 ^3 A! L4 _8 S f6 W
" X0 b7 b3 P* q& n: M
8 W2 I6 ]1 N! V0 i, |. K" [: _; R$ G6 q8 n) b2 L
) _3 R& ?5 [- C+ }
第二:RS-485通讯协议
; w" H* C6 A h% t+ Z' s; C+ k7 f# w$ ?' E% G
. m' R# `5 d( ]6 E- n# `4 x6 c% j" h9 n0 L& B( }
MCU管脚输出TTL电平,TTL电平的意思是,当MCU管脚输出0电平时,一般情况下电压是0V,当MCU管脚输出1电平时,电压是5V。因TTL电平的是由一条信号线,一条地线产生,信号线上的干扰信号会跟随有效信号传送到接收端,使得有效信号受到干扰,485通讯实际上是把MCU出来的TTL电平通过硬件层的一个转换器芯片进行转换:
% A) U- ]& F. k& R9 C! G+ ]2 f; y3 V/ ?( P6 [
) b0 ]- p6 w6 Z) ?% N9 u* k8 P1 Y9 C- W( q, A
# u1 J: a, q0 e& ]9 m6 s1 K
, i7 A) y2 V: ~/ \9 E/ C
# ]+ Y7 h$ R0 ~/ s2 C& A
' H- j* D6 N$ M7 I8 c) ?
1 O; A) _; s5 i6 x, P把MCU出来的一条的TTL信号经过芯片转换为两根线(线A、线B)上的信号。当MCU给转换器输入低TTL电平时,转换器会使得B的电压比A的电压高,反之,A的电压比B的电压高。
; L5 `, J8 Y$ |3 E0 F485协议规约两条电平线上差值为多少表示0或者1,电压是通过仪表可以测量得到的,所以说RS-485是硬件层协议。 ' | Y! P& I- f% K
485协议的接收端可能是另一个MCU,MCU管脚也只接受TTL电平,转换芯片过来的是两条线的电压,所以需要对此两条线差分电压转换为TTL电平。
, v. ]( q4 b/ }4 }+ Q7 T0 E
# p6 @: u8 V U- j, c% k
: W" u% J3 v# C: D J
2 F0 C! Z" X. ~
把TTL转为485,实质是一个集成芯片,其间无任何程序代码,纯粹硬件逻辑。同理,将485电平转为TTL也是如此。现在很多芯片把接收和转换都集成到一块IC,注意,转换器和接收器依旧是没有同时工作的,常见的转换芯片是MAX485。
" [) D/ }$ r) _; K* @可以这样理解,硬件层协议是公路,路的目的是为了让车辆能够过去。$ n2 L: x: o0 J/ _+ _4 z: Y4 O
! X% X2 V% I1 M, t6 {0 e6 j
8 l2 Z# ^& p/ x" |* R7 Y第三:RS485半双工通讯' A5 e* S" Q# @- T `7 o$ c! d' N
/ ^. {' n/ W! g2 J! J, G% Z
+ j! r- z& }: s/ _" y' N5 I# d! ^
0 }1 J7 x+ I/ p
0 y+ G( F$ f, M3 @: _. V/ [% E& j
7 v A9 ~1 h5 v$ E5 ?$ o
, s: Q$ D8 i$ T首先了解什么是单工通讯,单工通讯是指数据只能朝着一个方向传输的通讯方式。而半双工通讯则是指对于通讯两端,不能同时相对方法发送数据,必须错开时间段发送。 8 l) M4 H" ~' }. j
RS-485的通讯线只有2条,且这两条通讯线在一次传输中都需要用到,因此485只可实现半双工通讯。485实现半双工通讯,会遇到一个问题,MCU1向MCU2发数据时,并不知道线上是否正传来MCU2数据,因为没有其他线可用来判断对方的收发状态,那么可能也会导致数据冲突。因此,RS-485要实现半双工通讯,就需要上层的软件协议加以规约,也就是做到”不能你想发数据就发数据”。可以理解,软件层协议就好像交通规则,它能让数据有序传输。
& m# F7 K8 s) A- }. O, X: k
# r4 e8 |* h/ f* h0 Y F
' {% a0 {) v, Q7 d
$ t! ?4 X6 U8 N/ e, j/ b2 P2 b' [1 w- C第四:RS232通讯
9 t% f2 L' y/ Z0 C0 v0 w" w: l8 U2 W1 p; `: k: E- J1 a1 `( T
3 ]9 x9 D _% f$ O# u
RS-232是美国电子工业联盟制定的串行数据通信接口。现在RS232接口常用于仪器仪表设备,PLC以及嵌入式领域当作调试口来使用。
i; u4 s4 F6 b& y7 l, {
8 t* |6 K/ U' m) B- c6 Z* x6 D1 H
7 d+ A8 \9 w% l8 `0 q1 C. k第五:RS232接口形态
9 f+ G9 K8 |1 ]4 y( {) @: E- L9 R1 O4 s* f$ i" j# }2 {+ `, L; S0 p
' f3 t1 Y w& P按照引脚数量分类有两种:. P8 A0 \( k- \ u
25pin–DB25 协议标准推荐的接口类型. H( x$ s( J, w: m% q5 `
由于接口物理尺寸较大,很少使用,此处不做具体介绍。 Z f1 h& M& M& t0 Y5 c9 U
9pin—DE9(通常误叫做DB9) 自IBM PC/AT开始改用9针连接器起,目前是主流接口形态。9针RS232接口按照接口类型,又可以分为:
. w! D# ^8 ?1 Y* ^% d" }$ r公头(Male):带针脚
7 n8 c( g! H8 e" U' o, j( @7 o" B& D6 v9 D4 q6 M( d4 H
" o. z( J3 Z w; g. C
- ~9 ^2 d* W9 ]- F母座(Female):带孔座3 }& ^9 I1 H5 f+ ]5 V6 ~& X) }
0 _8 O1 R1 m @6 l' j: R/ P
: g1 X! {1 W4 C! n* U9 S3 {$ {' D/ H5 \
4 l( R: S: b' X0 r2 _
% m* F' V. c$ i9 G2 Q
8 P L1 t5 u- N, t; T3 _( c( B- r9 Y& h. t
$ ~$ y/ K! p2 a, `1 x
' t& t+ U7 O5 D; I. K; o- g, c
; I$ N ~% T* ]- I/ @, N- z! N
j( ]9 }7 q8 v9 Z, H3 @' @5 j6 w其中DTR/DSR和RTS/CTS用于硬件流控。
9 w- X8 K+ V; v! F4 x1 Z# z2 l, w DTR/DSR状态表明DTE和DCE处于可用状态,有时候设备上电这两个信号即有效,表示设备本身可用使用,但要开始进行数据传输通讯,则需要RTS/CTS流控信号。: X) r5 J- G0 l$ x' f. Y8 L
RTS即DTE发送数据时,该信号有效(ON),向DCE请求发送数据;CTS是对请求发送RTS信号的响应,当DCE已经准备好接收数据时,该信号有效(ON),通知DTE可用使用TXD发送数据了。6 h: c1 W. ~7 d7 V1 ?! n
比如A向B发送数据简单如下逻辑:- [+ w3 h2 b4 {# u% q z X: x
A先设置RTS为1,表示要发数据给B1 |2 Y1 S2 U* p1 d
B检测到RTS为1,先看看自己是否准备好:
' v, {- d C, A5 d5 F, @! E! H如果准备好,就设置CTS为1表示A可用发数据给B了
$ r* m7 ~0 E/ j5 R, b如果没有准备好,继续处理自己的数据。弄完了,再将CTS设置为1,让A发数据) F3 h. r- h5 e# q# W1 Z
A发现CTS置1了,将数据通过TXD信号线发送出去# R0 G, g2 D, x/ Z) \! `
A每发送一次数据给B之前,都会继续上面的逻辑
, D, R/ l. \" f/ ?3 {, Y- s9 r, DA发送完数据后,就将RTS置0,表示数据发送完毕
. g+ {8 I# p8 f! X0 T
: @1 [ d0 i# i" g" D6 ^, P& @2 A7 {
第六:RS232硬件连接方式2 [& M0 R' C1 c( _- U% O8 W
6 @1 ?# ]/ b* R+ D& x, X; @0 _+ M) E/ ]2 l& n% U4 V, S
$ ] @4 ^+ o, ?) {1 o连接分为3种
8 K b' T! G. m3 o+ H: @* g, u i3 l2 P: w8 `$ c& E" t( Z
; B1 R# w H9 h7 b) y8 Z第一种:9线方式连接示意图% p/ P( @) @5 c8 Q T
" K% h) e3 e I, E: M: |
$ R' I3 O" K5 e9 x
$ q8 P- L9 s5 m5 u! {/ `: w1 e) F# D4 A* x7 r2 H# y
R; p& q/ P. m
7 u# {! \, s2 @1 T: n; \& X1 G) g3 P
第二种:5线方式连接示意图9 Y9 K+ n5 S+ U: f. {
8 L0 Q) V: ~3 @) R' q3 H) Y ^% l" J# r6 J
: @8 R- t' F# @' J$ D/ W, S2 _% I. F" O1 k; M. f; O' U
/ ~$ H" k0 {6 w) i4 L7 h( G8 Y4 s3 }
! I3 J- O0 ]- Y' I( }4 D* k# e) P- H' L! w3 s% W: w, w
. ^5 O0 g' g! |+ d7 n9 v
第三种:3线式连接示意图
- v, U: J$ p# P: ]' t8 ]
. h) u4 J; n3 n' M% L, S
* |* B# `+ |/ p$ ?8 C) j
0 P% U1 L( c% a4 v3 ~. J注:3线连接中,DTE使用TXD和RXD两条数据线,无法实现硬件流控功能,在做大量数据传输应用时,建议使用5线或9线连接方式。8 m. C7 q, v" ]
9 u- p" [9 r! i; e2 J, o
- z! r- ?1 M) Q3 l# Q第七:电平及时序
$ M% `# u" i* }! l% t9 D1 T4 t& }9 C. O5 E4 H5 t! J
/ b0 R2 `/ v5 F% d6 O7 v8 y* T
+ W3 R* l( ]2 P( q; a
* U5 i* ^+ K* h8 T! \5 f
0 [. i& j6 L4 {# Z6 y" v& M, y K- e, _
+ d0 N8 h1 {. r, G
下图是使用RS232接口按照UART串口协议进行传输,UART协议具体请参考 UART详解。图中传输的数据为0100 1011b 即0x4B,按照1bit开始位,8bit数据位,1bit停止位格式传输。9 w/ ?0 }: q C F- x7 _
. F9 o8 B* I9 J- @* f2 l
% O. v2 K0 ]$ \' p2 n( B& z
* g+ i, L+ E. B4 J; Y; s8 w# |8 I" T$ t& X, D3 V
' H. q2 V0 M& c) ~0 h% o
第八:最大通讯距离及速率# { r* q) I# p
! q- X' g3 w4 L) J4 B! s9 J+ q
协议最初规定设备最大速率为20kbps。+ ~& M8 b: n1 I l2 B# S! p' b
. e. o) Z: `! v
- H3 o- n3 Y/ P& B' g6 z
) e8 k; x6 `- Y) v
. u+ r, [; l% r8 O
6 u1 W% U4 j, S; \* z! }% P注:协议规定最大速率为20kbps,现在看来这个速率已经很低了。一些芯片制造商已经做出了高速率的芯片驱动,具体速率上限请查看器件手册。 |
|