| |
|
RS232C串行通讯接口的应用(下篇)
作者:温正伟 原载:无线电杂志
|
软件和通讯协议
实例中的软件可以分为上位机和下位机。下位机是由AT89C51与其固件程序组成,上位机则是由DELPHI编写的串口应用程序。上位机程序主要负责向RS232C发送主控信号和接收处理返回的信号,下位机则用于接收电脑主机从RS232C发送过来的主控信号再根据信号的内容作出相应的控制。上位机和下位机通讯时应先预定通讯所用的速率和格式,这里选用9600波特,8数据位,1停止位,无校验位。为了保证单片机在接收到控制字符时不会误动作,我用设定了一个简单的通讯协议,协议为4个字节,只有当前后两个用于校验的字节都为0x61时,中间的控制字才为有效。如果对通讯的可靠性要求高的话,应用到CRC等算法来产生校验字节。协议说明如下:
| 字节 |
数值范围 |
含义 |
| B1 |
0x61(也可以改为0x00-0xFF) |
用于和B4组成简单的命令有效标识,也可以做为主控板的ID(更改此值要在单片机程序中修改) |
| B2 |
0x00-0x04 |
0x00-0x02分别为表示控制89C51的P0,P1,P2口。当B2B3都为0x03时,关闭P0,P1,P2。当B2B3都为0x04时运行89C51内置测试程序。 |
| B3 |
0x00-0xFF |
向P口输出的数据。 |
| B4 |
同B1 |
只有B1,B4为一样值时命令才有效。 |
表1 实例中程序所使用的简单通讯协议
注:文中"0x"表示十六进制,如发送0x61,0x0,0x0A,0x61,则这时AT89C51的P0口为0x0A(二进制为00001010),P0.1,P0.3脚为高电平,P0口其它引脚为低电平。在单片机完成命令后会向串口发送刚才收到4个字节的字符,上位软件也可以根据这个确认下位机是否顺利完成命令。
本实例提供了单片机固件的C语言源程序和window下的V1.0示例程序源代码(DELPHI)。V1.0的演示程序界面见图七。示例程序的使用也是很简单的,把实例电路连接到电脑的COM1口上,运行示例程序,这时点击"内置测试"24个继电器就会逐个闭合一段时间又断开,完成后程序会弹出如图七的成功对话框,如点击程序界面上编号的选项框则相应P口上的继电器闭合或断开。
上述的所有源码程序和可执行文件都可在本期的附加光盘上找到,更多更新的相关资料可以访问笔者的网站http://www.cdle.net。(源码程序可在这点击下载  )
 |
| 图7:示例软件界面 |
RS232C串口的基本知识
图八是RS232C的DB25针连接器,其引脚排列和名称见表2。在这25个引脚中包含了两个信道,分别为主信道和次信道,其中有4个数据线,11个控制线,3个定时信号线和2个信号地。次信道为辅助串行通道,其传输速率与主信道要低得多,其它功能都一样,但较少的使用到。在AT、ATX型的PC和新其它新型的PC只提供一到两个的只有主信道的RS232C串口,它们通常是使用DB9插针型连接器安装在PC后面板上,在BIOS或操作系统中称之为COM1、COM2(这个设备号也用于程序编写中,也可以用COM3,COM4等),外观和引脚定义分别见图三和图九,实例电路就是要使用它来进行和电脑进行通讯。
 |
| 图8:DB25型连接器 |
 |
| 图9:DB-9型连接器 |
|
|
引脚号
|
名 称
|
|
1
|
保护地 |
|
2
|
发送数据TxD |
|
3
|
接收数据RxD |
|
4
|
请求发送RTS |
|
5
|
清除发送CTS |
|
6
|
数据装置准备好DSR |
|
7
|
信号好GND |
|
8
|
载波检测CD |
|
9
|
保留,供测试用 |
|
10
|
保留,供测试用 |
|
11
|
未定义 |
|
12
|
次信道载波检测 |
|
13
|
次信道清除发送 |
|
14
|
次信道发送数据 |
|
15
|
发送器时钟TxC |
|
16
|
次信道接收数据 |
|
17
|
接收器时钟RxC |
|
18
|
未定义 |
|
19
|
次信道请求发送 |
|
20
|
数据终端准备好DTS |
|
21
|
信号质量检测 |
|
22
|
振铃指示RI |
|
23
|
数据信号速率选择器 |
|
24
|
终端发送器时钟 |
|
25
|
未定义 |
表2 RS232C的引脚定义
|
RS232C的引脚很多。但在业余的电子制作中主要用到的是RxD/TxD(数据收发引脚),它也是在上面实例制作中用到的引脚。RxD(Received
Data)为串行数据接收端,用于接收数据用。TxD(Transmitted Data)为串行数据发送端。其它的控制脚使用时就要注意软件中的功能和电平的状态。当两个设备都有RS232C串行接口时,只要把它们的RxD、TxD交叉相连就可以用实现串行通讯了,如图十的连接方式就可以用于两台电脑之间的通讯。当两设备的接口电平不相同时就要根据上面提到的EIA和TTL电平转换的问题。实际上实例电路也是用到了图十的连接方式只不过是多用了电平转换。
串行通信时,数据和联络信号都是用同一根信号线来传送的,这就要求收发遵守以下几点:
1) 双方约定的通信的速率(波特率),如在实例中单片机和电脑都是使用9600波特。
2) 双方约定的数据格式(帧格式),其中包含控制信息应该有明确的定义,如实例中简单的通讯协议。
3) 接收方应如何得知一段数据的开始和结束(帧同步),如实例中简单协议中的B1,B4。
4) 接收方如何判断收到的数据的正确性(数据校验)。
5) 接收方如何从位流中正确地采样到位数据(位同步)。
6) 收发出错时如何外理(出错外理)。
 |
| 图10:最简单的串口连接方式 |
根据同步方式的不同,串行通信又分为两类,异步通信和同步通信。同步通信时除了需要发送数据线,接收数据线和信号地线以外,还需要一根时钟信号线,时钟信号用于同步数据的发送和接收,传送时是先读取同步位,两设备的同步模式一样时数据开始传送,直到送完数据块,发送大的数据块时要周期性的重发同步字符。同步通信主要是应用于高速数据传送场合。而在实例中用到的是最简单的异步通信,它不需要上述的时钟信号线,只要发送数据线、接收数据线和信号地线就可以了。异步通信发送的数据是以每次一个字符形式发出,接收端的同步是通过检测包含在每个字符的开始和结束外的同步位而形成,这就造成20%冗余时间,使速度通讯速度变慢。
在业余的制作中通常是使用异步通信,在编写程序时只要做到上位机和下位机的使用同样的波特率、数据位数、停止位和有奇偶校验位就可以实现简单的RS232C异步通信。当然异步通信也可实现多种传输制式,如单工、半双工和全双工通信链路,这里不做详细说明了。
RS232C接口在几乎每一台台式PC电脑中被使用,在一些新式的笔记本电脑也许只会有USB接口,这时可以用USB转RS232C的设备取得RS232接口。在你的智能电子制作中不如加入对它的使用,一定会给你的制作或发明增色不少,如我们可以在一些要读数、采集的仪表中加入串口采集或控制这样就可以用电脑强大的处理能力去处理相关的数据,也可以在一些要用到电脑控制的电路制作中用到串口。图一、二、十一是本文实例制作的实物图,关于它的PCB和相关的制作资料请访问笔者的主页http://www.cdle.net,如有相关问题和建议也可以联系笔者Email:pnzwzw@cdle.net。
 |
| 图11:实物图 |
| 零件 |
数量 |
备注 |
| AT89C51 |
1
|
AT89C52,AT89S51/52均可直接代用 |
| DB9插座 |
1
|
|
| 11.0592M晶振 |
1
|
|
| 发光二极管 |
1
|
|
| 10K电阻 |
2
|
以下零件只包括一个主控板和一个继电器控制板 |
| 1K电阻 |
11
|
|
| 8.2K电阻 |
1
|
|
| 10K8位排阻 |
1
|
|
| IN4148 |
9
|
|
| BC547 |
2
|
其它同类管子也可 |
| 30p瓷片电容 |
2
|
|
| 10uF电解电容 |
1
|
|
| 10pin扦针 |
5
|
|
| 9012 |
8
|
|
| 5V继电器 |
8
|
如用大于5伏的继电器需更改驱动电路 |
| 10pin接线 |
1
|
|
表3 零件表
|
| |
|
|
 |
|