|
第一:硬件层协议
1 @, ^- i8 t; R6 T4 _$ p$ w* d+ v! \ \& s7 H$ I/ z/ Y$ }& f
4 P& w9 Z8 f7 x8 N
& m) Y" g# Z( X& q8 F1 \通讯协议主要是实现两个设备之间的数据交换功能,通讯协议分硬件层协议和软件层协议。硬件层协议决定数据如何传输问题,比如要在设备1向设备2发送0x63,0x63的二进制数为0110 0011,这8个二进制数从设备1传输到设备2,涉及到1怎么传,0怎么传的问题,这就是硬件层要解决的问题。8 L) m' K( j! F. ^
硬件层协议目前比较多见的有RS-232、RS-485、SPI、IIC等。RS-232规定,线上的电压为x伏都表示传输的是0,y伏传输的则是1。再者,比如要选择多少条线传输数据,选择什么材质的线传输输入,这些也属于硬件层协议约束的。
1 {8 x- ~5 I/ m! j6 e" {! _
+ v) [& c% L) h5 J) Y% [
) o; R! d* q* o0 d& Y
( B1 J1 g( A" _/ r* W. @2 L$ b
9 K: x1 c7 G! Y/ I0 i/ |' v( a
, m/ a, V4 ^# O9 m第二:RS-485通讯协议
8 D0 V+ a) o) p s( x. V) P5 O
1 @8 A- o$ f5 f* ^7 R7 ]) p. I/ H" ]' ]! G, n# c. t: D
" a N0 u& }* G8 S; QMCU管脚输出TTL电平,TTL电平的意思是,当MCU管脚输出0电平时,一般情况下电压是0V,当MCU管脚输出1电平时,电压是5V。因TTL电平的是由一条信号线,一条地线产生,信号线上的干扰信号会跟随有效信号传送到接收端,使得有效信号受到干扰,485通讯实际上是把MCU出来的TTL电平通过硬件层的一个转换器芯片进行转换:
: _7 b) m) K2 P! X5 k3 r
8 l! A1 O% E4 B6 g, x# S
& Z4 k, e9 G) K8 Q) v/ R# {5 @
- m- e, _3 k. _4 G+ a' o; e9 f
" I4 A' J) H% w
& H) W$ T1 `( M( }, ?2 \+ U" y }- i9 I K% r, K$ @; S+ C
$ c& C M6 ~4 @- s
1 [# O2 B' X" x
把MCU出来的一条的TTL信号经过芯片转换为两根线(线A、线B)上的信号。当MCU给转换器输入低TTL电平时,转换器会使得B的电压比A的电压高,反之,A的电压比B的电压高。
: ]) Z! p `, v, l1 d4 W! J485协议规约两条电平线上差值为多少表示0或者1,电压是通过仪表可以测量得到的,所以说RS-485是硬件层协议。 5 W" j3 X* Y6 |8 U# q7 \8 K
485协议的接收端可能是另一个MCU,MCU管脚也只接受TTL电平,转换芯片过来的是两条线的电压,所以需要对此两条线差分电压转换为TTL电平。
$ k5 U) r: T Z9 I
9 L _, c! ~4 t5 d: g* w( q- G
, u& \6 S5 U0 @/ u \/ |
7 C* W- ?7 u/ k$ w. O把TTL转为485,实质是一个集成芯片,其间无任何程序代码,纯粹硬件逻辑。同理,将485电平转为TTL也是如此。现在很多芯片把接收和转换都集成到一块IC,注意,转换器和接收器依旧是没有同时工作的,常见的转换芯片是MAX485。 * h7 m+ s( c+ y: o; X/ h
可以这样理解,硬件层协议是公路,路的目的是为了让车辆能够过去。
# M4 _, w& b) n* j9 `2 m; G z V8 l7 w. P
+ Z. t1 F5 v5 h- e- j/ t第三:RS485半双工通讯: ]! g4 A. g& |/ N- v! n9 }
8 D# x* z0 R: ?
- p/ e# }: t) ^2 d/ Y1 K, p
3 z f* Y4 L% d7 C8 M) \- v# z' a9 t! i
2 n b2 d* x! V8 b
4 M/ R# f" i8 u& h
首先了解什么是单工通讯,单工通讯是指数据只能朝着一个方向传输的通讯方式。而半双工通讯则是指对于通讯两端,不能同时相对方法发送数据,必须错开时间段发送。 + p) q8 v" d- G8 y# y F7 H7 j
RS-485的通讯线只有2条,且这两条通讯线在一次传输中都需要用到,因此485只可实现半双工通讯。485实现半双工通讯,会遇到一个问题,MCU1向MCU2发数据时,并不知道线上是否正传来MCU2数据,因为没有其他线可用来判断对方的收发状态,那么可能也会导致数据冲突。因此,RS-485要实现半双工通讯,就需要上层的软件协议加以规约,也就是做到”不能你想发数据就发数据”。可以理解,软件层协议就好像交通规则,它能让数据有序传输。$ |" i b- _' m0 T
5 j- g0 o8 U! m6 O" Z5 u0 Z' l* }9 f0 z/ c% E1 u0 b8 b
" T, I$ \+ ^! x/ ^& q
第四:RS232通讯
: i) X! B& G/ l# X8 X* P: v0 y# W! Z; r2 n- F% U" o
1 x7 g' u8 `2 O: l9 f
RS-232是美国电子工业联盟制定的串行数据通信接口。现在RS232接口常用于仪器仪表设备,PLC以及嵌入式领域当作调试口来使用。
' B, c# t6 Q- D* O2 j
/ c) n7 ~9 e6 ^+ V* E
- g/ `, C6 v7 l* ?5 _( f( y1 t第五:RS232接口形态 ! r: U# x H# L4 L( f4 c1 D7 E
5 y2 V* Y# m/ m
4 ?# W. k! {$ f8 K% a! ?8 p, u
按照引脚数量分类有两种:: Y+ N4 [2 Z; w2 X% W: @9 D
25pin–DB25 协议标准推荐的接口类型
9 {% j% ?' r6 f, H9 v3 A& M5 ~2 Z由于接口物理尺寸较大,很少使用,此处不做具体介绍。
, t' ^+ N5 q6 \' @& g5 n) r9pin—DE9(通常误叫做DB9) 自IBM PC/AT开始改用9针连接器起,目前是主流接口形态。9针RS232接口按照接口类型,又可以分为:
+ H) Q1 Q" ^0 C- P t公头(Male):带针脚1 K4 N4 ^8 f9 \9 X. d: T2 u
2 |$ C" L% B& z0 Z4 h( {6 ?4 ]
8 V7 }" `7 j7 P( G# T7 r
% m4 ~; q+ a T8 }母座(Female):带孔座) L* b! p+ ] q6 W& A( d
% k0 J& U1 |2 }- _' z
$ C* F3 c2 D; Y' r5 G9 j; v
5 W1 M: M! k0 ]+ e) n
0 f+ Y" n- ?0 B- ?3 g& e. Z1 i2 M1 q) L& E2 n3 K8 N3 [+ i# P+ |4 P Z
7 f( N Y! _$ ^
' E. g% x% m' C2 n( r6 ]+ @: a4 O' K5 l
( A7 w8 `7 ^+ @) J3 `2 G2 S0 K
; w: w4 b, T/ k5 c其中DTR/DSR和RTS/CTS用于硬件流控。; ?; z1 _2 U) X1 h
DTR/DSR状态表明DTE和DCE处于可用状态,有时候设备上电这两个信号即有效,表示设备本身可用使用,但要开始进行数据传输通讯,则需要RTS/CTS流控信号。# ]' D# f+ j5 {" Q1 D; P5 D
RTS即DTE发送数据时,该信号有效(ON),向DCE请求发送数据;CTS是对请求发送RTS信号的响应,当DCE已经准备好接收数据时,该信号有效(ON),通知DTE可用使用TXD发送数据了。
0 B4 R: K! A& D! h) T, h, f$ c比如A向B发送数据简单如下逻辑:- J" w+ V6 T% F; j+ A( I( V3 n
A先设置RTS为1,表示要发数据给B; I% ?7 `& }) ?3 w* N4 U
B检测到RTS为1,先看看自己是否准备好:' ~; x, Z8 Z+ G0 P
如果准备好,就设置CTS为1表示A可用发数据给B了& h7 K( Q2 v" L! n5 Q$ b0 w1 r
如果没有准备好,继续处理自己的数据。弄完了,再将CTS设置为1,让A发数据' w4 E5 n( c0 v. @/ P. k( l' M$ b! u
A发现CTS置1了,将数据通过TXD信号线发送出去9 A+ G9 K7 N9 C& D
A每发送一次数据给B之前,都会继续上面的逻辑
* q; G! |6 R' W$ N, D7 f! r; Z/ lA发送完数据后,就将RTS置0,表示数据发送完毕
* i" c* O0 b5 y/ G4 u6 ^- M% R
$ ]$ `6 X. b" k( j! e; A
" }5 P5 G/ Y9 C S* q第六:RS232硬件连接方式7 c0 w: o* V8 ?, D
' Q2 d0 g9 q, t7 `6 V. ~ Y- \0 d6 c5 O& q% y+ `2 z, U! z
. w3 j& k& n# b, Z; f. G: R$ I0 X# C
连接分为3种
k& A. Z$ _ u( R, d. b2 ^$ l) p5 p; R- P9 {8 q* q
& k7 d; L' y- I: x
第一种:9线方式连接示意图, Q6 K8 v* M0 ~' I1 n) y/ D9 @
2 W. P& X" f1 `) ?" k
/ w# T% M% d+ M/ O& m
, e+ A7 Y! I+ T$ X) X& D
3 {, Y3 s" _& }
; x/ Q1 H* [0 h$ X* ]
: F: B9 K, P* C- _5 |+ B( O: Q7 R$ r" Z c) }) @
第二种:5线方式连接示意图' g+ j5 Y" ~8 O/ b2 n
- p3 i8 C" K# G# j- I# K
7 }3 |" h, L3 z$ |. c! i! e" b l5 S% L& b; q& c1 d: Q
2 }$ c3 X- C, P: B3 c
0 D2 H( c! t- P1 G4 Y4 i* b: Y
: W$ n1 l4 W& A x
7 T3 E# _$ b* C( H
8 L# O0 t$ @/ ~" \( K- z0 i第三种:3线式连接示意图$ x: W+ U6 x3 k; U
! [2 D, c" N7 Y& ?4 V1 I( C
1 _+ Z% v7 F0 W$ j7 A/ w
& _, ?( T: i* Q6 k% Q' g
注:3线连接中,DTE使用TXD和RXD两条数据线,无法实现硬件流控功能,在做大量数据传输应用时,建议使用5线或9线连接方式。( w$ u/ j+ `+ u
6 j, S) D+ S$ R- J) E" g* p5 |4 k
1 J! b/ l2 M- g. b第七:电平及时序1 r7 }) G# C7 n# h# i+ ~
9 }' E! \! [1 M, T
& }) G7 X% o0 x' K3 A2 B; e3 s) t* m k9 M
" C8 _8 z } v, S% D
, g" o" t+ t, k7 }/ x( s
4 O* d9 v8 n. U: {
+ V) g. S# I5 C3 J& l7 u" [4 f0 h下图是使用RS232接口按照UART串口协议进行传输,UART协议具体请参考 UART详解。图中传输的数据为0100 1011b 即0x4B,按照1bit开始位,8bit数据位,1bit停止位格式传输。
7 y; q; _/ j- u! S6 _: M G1 |2 C& K: m# a
. v4 H( a' K, [" [& n \: x# ^4 |' Q% t( b, Z3 _3 i) z
1 B J$ I1 n/ W( A2 D$ Q; |# H( @4 O8 ^2 a( u3 M- [ b
第八:最大通讯距离及速率 w. H# Y8 T+ g6 V) Q
6 s$ B3 n! g5 N. Y2 X- ^协议最初规定设备最大速率为20kbps。% P& P. s: C L6 `
& V3 \4 s! t8 X* S
0 \2 p( Y' F! S
- G- d' q1 M, K* O0 d k2 B; ~6 \8 J) X! f- }; @" l& j
- x6 u1 ^ I& x) h3 I; j注:协议规定最大速率为20kbps,现在看来这个速率已经很低了。一些芯片制造商已经做出了高速率的芯片驱动,具体速率上限请查看器件手册。 |
|