最近有点想研究USB协议,正好也看到有评论说对如何选择USB转串口模块有些疑惑,其实我也一直很想写一篇关于串口的总结式的文章,借此契机来完善一下。
所谓通信协议,顾名思义,其本质就是一个协议,即一个约定,大家约定好通信的一些标准,这样大家就能根据这个标准来设计并生产产品,而避免了A产品不兼容B这样的情况发生。
那不妨先想一下,一个通信协议需要规定哪些内容呢?
一般来说,主要包括三个方面:
以下的内容也将按照上述思路来进行展开。
最后,再简单解释一些基本名词的概念:
对于玩单片机的同学来说,UART可能是接触的最早的串行通信协议了,基本每个单片机都有TXD,RXD两个引脚,此即所谓的Universal Asynchronous Receiver/Transmitter,异步串行通信。
实际上现在大多数单片机使用的都是CMOS电路,电平容限比TTL要大一些,但由于TTL出现较早,目前仍然把这种电平称为TTL电平。
总结:
UART没有规定接口的具体样式,只是规定了引脚,所以在实际使用中比较灵活。但是引脚的电平要注意和单片机的电源保持一致,要注意区分3.3V和5V。UART是单片机中的基础外设,一般称之为串口,通过USB转TTL模块可以实现单片机与上位机之间的通讯。
RS-232其实是出现比较早且应用较为广泛的标准。由美国电子工业协会(Electronic Industries Association,EIA)联合多家公司于1970年制定,目前最新的标准是RS232C(前面是A和B)。所谓RS,即Recommended Standard,推荐标准,232为标识号。

| 简写符 | DTE25芯(公) | DCE25芯(母) | DTE9芯(公) | DCE9芯(母) | 信号功能解释 |
|---|---|---|---|---|---|
| TXD | 2 | 3 | 3 | 2 | 发送数据 Transmit Data |
| RXD | 3 | 2 | 2 | 3 | 接收数据 Receive Data |
| GND | 7 | 7 | 5 | 5 | 信号地 Ground |
| RTS | 4 | 5 | 7 | 8 | 请求发送 Require to Send |
| CTS | 5 | 4 | 8 | 7 | 清除请求 Clear to Send |
| DSR | 6 | 20 | 6 | 4 | 数据装置就绪 Data Set Ready |
| DCD | 8 | 8 | 1 | 1 | 接收线信号检测 Data Carry Detected |
| DTR | 20 | 6 | 4 | 6 | 数据终端准备好 Data Terminal Ready |
| RI | 22 | 22 | 9 | 9 | 振铃指示 |
其中,前面三根线为必须的线,后面6根线其实都是流控信号,在实际使用时其实不一定会使用。
总结
RS-232是一种全双工通信方式,时序和UART相同,只是电气属性存在差异。此外,它只能实现单点通信,且最大通信速率为20kbps,最大通信距离为15m。
总结
相比于RS-232的单点通信,RS-485支持总线通信,总线上最大可以挂载32个设备(这个数字好像和总线阻抗大小有关)。RS-485属于半双工通信协议。
RS-422其实就是两组485,一对发一对收,因此需要4根线,实现了全双工通信。但是其实RS-422是基于RS-232提出的,比RS-485要早一些。虽然422和485都是差分信号传输,但它的电气特性和485有所差别。
RS-422也支持总线挂载多个设备,但没有485那么多,只支持10个设备,最大传输距离与最大传输速率和RS485一样。

USB转串口常用的芯片有CH340,CP2102、FT232、PL2303,这些都是可以直接使用的,具体用法建议参考官方的手册,主要是看其中的示例电路用法。
而MAX232需要注意的是,它的作用是电平转换,即把TTL电平和RS-232电平进行互转,因此一般还需要再接一个USB转串口的协议才能和电脑USB进行通信。
由于MAX232使用方式用途比较单一,且使用较为简单,这里简单记录一下MAX232的相关内容,避免以后再查。
首先是使用方面,MAX232的基本使用如下图所示。

先看外围器件,可以发现只有四个电容,其中C1+、C1-之间一个;C2+、C2-之间一个,然后V+与电源电容隔离;V-与地之间也是电容隔离。另外电源和地之间的电容算是可选项。
再来看信号流向。需要注意,这里的IN和OUT是基于芯片说的,1和2代表两组转换端口,T和R分别接对应的TX和RX端口,至于哪个是IN哪个是OUT就需要分析一下信号流向了。
另外,我好奇的一个点是,MAX232是怎么实现电平转换的。根据上面的内容,RS-232协议是负逻辑,即-3~-15是1;3~15是0,升压好说,但是这个负压是怎么产生的。通过查找资料发现它内部是通过电荷泵来实现升压,而外围的电容就充当了能量存储的容器。而负压的实现其实也简单,因为只需要改变参考电压即可,那么自然就会有负压了。
一般来说,电脑上的RS-232串口电压是12V,而MAX232在使用时,V+会产生+10V的电压,V-会产生-10V的电压(如果功耗不是很大的话,这个芯片一定程度上可以当作稳压芯片来使),足够满足电脑的电平需求。