RS-232-C接口(又称 EIA RS-232-C)是目前最常用的一种串行通讯接口. ("RS-232-C"中的"-C"只不过表示 RS-232 的版本,所以与"RS-232"简称是一样的)它是在 1970 年由美国电子工业协会(EIA)联合贝尔系统,调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准.它的全名是"数据终端设备(DTE)和数据通讯设备(DCE)之间串行二进制数据交换接口技术标准"该标准规定采用一个 25个脚的DB-25连接器,对连接器的每个引脚的信号内容加以规定,还对各种信号的电平加以规定.后来 IBM 的 PC 机将 RS232 简化成了 DB-9 连接器,从而成为事实标准.而工业控制的 RS-232 口一般只使用 RXD,TXD,GND 三条线. 下面�让我们使用 S51 增强型单片机实验板来开发一个简单的串口通信实验程序�这是一个串口通信 综合实验�需要全套餐客户的相关配件配合才能完成。通过该实验程序�我们可以检测实验板串口的状态�接收计算机发送来的数据�然后再发送回计算机�如果程序中发送和接收窗中显示的字符相同�则说明实验板的串口是良好的�能够正常收发数据�另外单片机接收计算机的控制指令�根据控制指令来控制实验板上的继电器动作。 首先让我们来看看我们做的通讯软件的实际效果。。。 RS-232 接口与单片机串行通信程序设计的界面 图 1 注�当前按键�“K”�按键的 ASC 码�“75”�按键的 16 进制码�“4BH” S51 增强型单片机实验板与电脑串口实现 RS232 通信运行效果图 图 2 注�按压 PC 键盘的按键“K”单片机将串口接收到按键实时显示在液晶模块上�锁定了大小键�。 1、液晶模块第一行显示“PS2-KEY� K ”� 表示接收到 PS2 键盘的按键�“K” 2、液晶模块第二行显示“HEX�4Bh ASC�75 ”�表示 K 的 HEX 码为“4BH”�ASC 码为�“75” 图 3 注�按压 PC 键盘的按键“2”单片机将串口接收到按键实时显示在液晶模块上 1、液晶模块第二行显示“HEX�32h ASC�50 ”�表示 K 的 HEX 码为“32H”�ASC 码为�“50” 2、液晶模块第一行显示“PS2-KEY� 2 ”� 表示接收到 PS2 键盘的按键�“2” 从上面两幅图中可以看到�我们实现主要目标如下� 1、在计算机上�VB6.0 编写的通信测试程序检测的键盘操作�将我们的按压 PS2 键盘�PC 键盘�按键显示在数据发送窗中�显示按键当前按键、按键的 ASC 码、按键的 16 进制码。同时将键值通过电脑的RS-232 串口发送到 S51 单片机实验板上�实验板上的 AT89S51 单片机接收到数据后�以二进制方式显示在实验板的 8 位高亮度 LED 上�然后把接收到的数据重新发送回电脑的 RS�232 串口�电脑接收到后显示在程序的接收数据窗中。 2、单片机检测识别计算机发送过来的键盘键值�将按键值以二进制形式显示在 P1 口的 8 位高亮度 LED 上�同时�将当前按键、按键的 HEX 码、ASC 码实时显示在 1602 液晶模块上面。 3、单片机接收计算机对单片机的控制指令�当计算机发送“继电器 ON 指令”时�则单片机驱动实验板上的继电器吸合�相反�如果计算机发送“继电器 OFF 指令”时�单片机驱动继电器释放�我们可以学习掌握计算机智能控制的原理�只要掌握了这种方法�我们要在电脑上轻轻点击鼠标就可以控制家里的电气开关了就不难了�操作方法�点击软件的“继电器”按钮�实验板的继电器吸合�再次点击按钮�继电器释放�。 4、单片机接收到数据后�发出一时短声提示。同时将数据重新发送回电脑串口�供电脑程序接收显示�电脑软件接收到单片机发送过来的数据后�显示在软件的接收数据窗中。 【RS-232 接口与单片机串行通信程序设计】 该系统程序由单片机通信程序和电脑通信程序构成。在微机测控系统中�一般称计算机为上位机、而前端采集控制的单片机系统称为下位机。上位机主要负责所有测控数据的综合管理与下位机的调度控制�而下位机由单片机构成前端的测控系统�进行原始数据的采集及设备的控制�下位机受上位机的管理控制。 一、单片机程序开发 51 单片机有一个全双工的串行通信口�非常适合与电脑进行通信�51 单片机的串口开发在各种教科 书上都有详细的介绍�我们这里不在重复�大家可以参考一下书籍。单片机程序功能主要如下�初始化串口、打开串口中断、接收电脑发送的数据、在 1602 液晶模块上显示数据、将数据发送回电脑 RS-232串口、接收继电器控制命令、控制继电器动作等。 单片机通信参考程序如下� ORG 0000H AJMP START ;转到初始化程序 ORG 0023H AJMP PGUART ;转到串行中断服务子程序 START: MOV SP,#60H ;堆栈指针初始化 MOV P0,#0FFH ;P0 端口初始化 MOV P1,#0FFH ;P1 端口初始化 MOV P2,#0FFH ;P2 端口初始化 MOV P3,#0FFH ;P3 端口初始化 MOV TMOD,#20H ;定时器 T1 工作于模式 2,自动重装载 MOV TH1,#0FDH ;TH1 初值为"0FDH",9600bps MOV TL1,#0FDH ;TL1 初值为"0FDH",9600bps MOV SCON,#50H ;串行口工作于方式 1,允许接收 SETB TR1 ;启动定时器 T1 SETB ES ;允许串行口中断 SETB EA ;开总中断 CLR UABIT ;----------------------RS-232 接口与单片机串行通信程序设计------------------------------- MAIN: ...... ;主程序处理其他任务�等待串口中断 AJMP MAIN PGUART: ...... ;串口中断服务子程序�接收处理数据 RETI END 二、RS-232 串行通信测试软件开发 计算机 RS-232 串行通信测试软件采用 VB6.0 开发�VisualBasic 6.0�简称 VB6.0�以其简单易学� VB6.0 为可视化编程开发软件�开发程序简单易学�VB 程序开发主要分为两步�第一步、使用 VB 控件设计出软件界面�第二步、给各种控件编写相应的执行程序代码�代码编写完成后可以运行查看结果了。 VB6 提供了多种控件�其中 MSCOMM.OCX 是用于串行通信的控件�我们可将该控件添加到工具箱�Toolbox�内�这样就可以利用该控件进行串行通信程序的设计了。 下面介绍 Mscomm 控件的主要属性和方法: 1� CommPort�设置或返回串行端口号�VB6 的取值范围为 1�16�表示打开或返回通信端口号COM1�COM16 2� Setting�设置或返回串行端口的波特率、奇偶校验位、数据位数、停止位。如�Mscomm1.Setting=“9600�N�8�1” 3� PortOpen�打开或关闭串行端口�格式为:Mscomm1.PortOpen=『True/False』 4� InBufferSize�设置或返回接收缓冲区的大小�缺省为 1024 字节 5� InBufferCount�返回接收缓冲区内的等待读取的字节个数�可通过设置该属性为 0 来清除接收缓冲区 6� RThreshold�该属性为一阀值�当接收缓冲区内字节个数达到或超过该值后就产生 OnComm事件 7� InputLen�设置或返回接收缓冲区内用 Input 读入的个数。若取 0�则 Input 将读取整个缓冲区的所有内容 8� Input�该属性表示从接收缓冲区 InputLen 个字符 9� OutBufferSize�设置或返回发送缓冲区大小�缺省为 512 字节 10� OutBufferCounter�返回发送缓冲区内等待发送的字符数�可用来清空缓冲区 11� Output�向发送缓冲区传送一字符串�即向串口发送数据 第一步�开发程序界面 打开 VB6.0 -> 新建“标准 EXE”建立一个新的工程。在工程窗口 Form1 中添加我们要使用的各种按钮和控件�其中一个图标如电话一样的控件就是 MSCOMM 串行通信控件了�该控件在界面设计时候可见�在程序运行时候不可见。最后�放置好了各种控件后�程序的界面界面就出来了�是不是很简单呀�如下图 4 所示� RS-232 串口通信测试软件界面开发 图 4 第二步�VB 软件编写 当软件的界面设计完成后�我们就可以给程序添加代码了�在程序中实现的主要功能如下�RS-232端口初始化、检测 PC 键盘按压的按键、发送按键编码、在数据发送窗显示当前按键编码、在接收数据窗中接收显示单片机发送来的数据�检测继电器控制按钮的操作�发送继电器控制命令。。。如下图 5所示� RS-232 串口通信测试软件程序代码编写 图 5 【串行通信实验操作】 完成了单片机通信程序及 PC 上我 VB 程序开发后�我们编译工程�得到单片机芯片烧写的 HEX 格式目标文件 rs232test.hex 和串口测试程序可以执行文件 RS232test.exe�然后我们就可以拿出实验板�马上 进行串口通信实验了�检测一下我们的实际通信效果。 1、使用 ISP 编程器将目标文件 rs232test.hex 烧写到 AT89S51 单片机中�见下图 6� 2、如前面的图 2 所示�我们将烧写好了通信程序的 AT89S51 芯片锁紧到 S51 单片机实验板上�然后把1602 字符型液晶模块插到实验板的 1602 接口上�用 RS232 串口通信电缆和 USB 电缆将实验板和电脑连接好�按压实验板的电源开关�开启电源�此时实验板上的电源指示灯亮起来�实验板准备就绪�随时可以接收电脑发送的数据了。 3、双击我们编写的串口测试程序 RS232test.exe�启动 RS-232 串行通信测试软件�在软件上设置好和实验板连接的通信端口�然后点击“PC 发送数据发送窗”�即可激活输入窗口�然后我们按压电脑键盘上的按键�按压 PS2 键盘的按键将会被显示在软件中�同时发送到单片机上通过 1602 液晶模块进行显示�当接收到正确数据时候�实验板上的蜂鸣器也会发出短促的声音�使你按压键盘的感觉从声音上体现出来。从单片机发送回来的数据被软件接收后�会还原显示在发送数据窗中�如果我们在电脑上按压的键盘上的按键�在软件的发送窗、接收窗及实验板上 1602 液晶模块上显示的按键都相同�则说明我们电脑的 RS-232 串口良好�单片机的串口也是良好的�通信正常。然后�我们可以点击软件中的“继电器”按钮�实验板上的单片机接收到电脑的控制指令后�就会控制继电器产生相应的开关动作�实现电脑软件对实验板上继电器的控制。 通过实验加深对 51 单片机串口的认识: 下面我们通过这套串口测试程序来做个额外实验。理论上�当我们按压键盘上的按键�所有按键都会发送到单片机�然后再返回计算机上的�在串口测试软件上的 PC 发送数据窗和接收数据窗中显示的字符数目、字符应该是完全相同的�如上面图 1 中显示。但是�当我们连续快速按压 PC 键盘�注意�连续速度要足够快哦�才能看到实验现象�时�会发现接收数据窗中有时候会漏掉字符�累积下来�接收窗中的字符就会比发送窗中的字符少了。 发生这种现象的原因是什么 �� 其实这是由于计算机发送过来的数据太快�而单片机的串口中断一次只能接收处理一个数据�前一个数据还没有处理完�后面又有数据发送过来�单片机来不及处理漏掉了。这是由 51 单片机的串口特性决定的�AT89S51 单片机的串口只有一个字节的发送和接收缓冲区 SBUF�也就是说每次只能发送或接收一个字节数据�如果在接收的数据没有及时处理完�而又有新的数据进来�会造成数据丢失�不像计算机中 VB6 的 MSCOMM 串行通信控件�默认的接收缓冲区为 1024 字节�而默认的发送缓冲区也有 512 字节�而且还可以改变缓冲区大小�计算机有了收发数据缓冲区�通信当中就不容易出现缓冲区溢出而通信错误的现象。 在测控系统中�如果出现这种错误的话则有可能系统失控�数据出错�误报警等。当然�我们在通信中也可以加入校验机制来检查错误�但这种现象也使系统稳定性降低�出现莫名其妙的故障�而且这种属于软件故障�我们往往不容易想到�会走弯路。