摘要
第3章串口通信程序设计
学习内容和目标
学习内容:
.了解RS-232串口通信原理与应用方法。
.学习PC上串口通信的仿真过程。
.学习串口通信程序设计。
学习目标:
(1)掌握在单机上通过仿真工具的通信编程技术和实现能力。
(2)在点对点串口通信程序设计全过程的系统实现能力。
1.
3
串口通信基本原理和应用方法
3.1
串口通信原理
1.
串口通信协议包括RS-232 、RS-422和RS-485三种标准。
RS-232在1962年发布,命名为EIA-232-E,作为工业标准,以保证不同厂家产品之
间的兼容。RS-232-C是美国电子工业协会(ElectronicIndustryAsociation,EIA)制定
的一种串行物理接口标准。RS是英文“推荐标准”的缩写,232为标识号,C表示修改次
数。RS-232-C总线标准设有25条信号线,包括一个主通道和一个辅助通道。在多数情
况下主要使用主通道,对于一般双工通信,仅需几条信号线就可实现,如一条发送线、一条
接收线及一条地线。RS-232-C标准规定的数据传输速率为每秒50 、75 、100 、150 、300 、
600 、1200 、2400 、4800 、9600 、19200波特。RS-232-C标准规定,驱动器允许有2500pF的
电容负载,通信距离将受此电容,例如,采用150pF/m的通信电缆时,优选通信距离
为15m;若每米电缆的电容量减小,通信距离可以增加。传输距离短的另一原因是RS232属单端信号传送,存在共地噪声和不能抑制共模干扰等问题,因此一般用于20m以
内的通信。
目前RS-232是PC与通信工业中应用最广泛的一种串行接口。RS-232被定义为一
种在低速率串行通信中增加通信距离的单端标准。RS-232采取不平衡传输方式,即所谓
单端通信。有9针和25针两种引脚,如图3-1和图3-2所示。
图3-1 RS-232 的DB9 连接器引脚图3-2 RS-232 的DB25 连接器引脚
具体引脚定义如表3-1所示。
表3- 1
RS-232
串口引脚定义
9针串口(DB9) 25 针串口(DB25)
针号功能说明缩写针号功能说明缩写
1 数据载波检测DCD 8 数据载波检测DCD
2 接收数据RXD 3 接收数据RXD
3 发送数据TXD 2 发送数据TXD
4 数据终端准备DTR 20 数据终端准备DTR
5 信号地GND 7 信号地GND
6 数据设备准备好DSR 6 数据准备好DSR
7 请求发送RTS 4 请求发送RTS
8 清除发送CTS 5 清除发送CTS
9 振铃指示DELL 22 振铃指示DELL
收、发端的数据信号是相对于信号地,例如,从DTE 设备发出的数据在使用DB25 连
接器时是2脚相对7脚(信号地)的电平。典型的RS-232 信号在正负电平之间摆动,在发
送数据时,发送端驱动器输出正电平在+5~+15V,负电平在-5~-15V 。当无数据传
输时,线上为TTL,从开始传送数据到结束,线上电平从TTL 电平到RS-232 电平再返回
TTL 电平。接收器典型的工作电平在+3~+12V 与-3~-12V 。由于发送电平与接
收电平的差仅为2V 至3V,所以其共模抑制能力差,再加上双绞线上的分布电容,其传送
距离优选约为15m,优选速率为20kb/s。RS-232 是为点对点(即只用一对收、发设备)通
信而设计的,其驱动器负载为3~7kΩ 。所以RS-232 适合本地设备之间的通信。
RS-232C 串口通信接线方法(三线制):
首先,串口传输数据只要有接收数据针脚和发送针脚就能实现:同一个串口的接收
脚和发送脚直接用线相连,两个串口相连或一个串口和多个串口相连,即
.同一个串口的接收脚和发送脚直接用线相连,对9针串口和25 针串口,均是2与
74
3直接相连。
.两个不同串口(不论是同一台计算机的两个串口或分别是不同计算机的串口)。
表3-2是对微机标准串行口而言的,还有许多非标准设备,如接收GPS 数据或电子
罗盘数据,只要记住一个原则:接收数据针脚(或线)与发送数据针脚(或线)相连,彼此交
叉,信号地对应相接。图3-3是RS-232 的9针串口线。
表3-
2
RS-232C 3.按钮“打开串口”的单击处理事件
该按钮起到翻转作用,单击“打开串口”成功后,串口打开,其名称变为“关闭串口”;再
单击又恢复到“关闭”状态,名称变为“打开串口”。如此,起到了两个按钮的作用。
private void btnSwitchSP_Click(object sender, EventArgs e)//打开串口
{
if (btnSwitchSP.Text=="打开串口")
{
if(strPortName !="" && strBaudRate !="" && strDataBits !="" &&
strStopBits !="")
{
try
{
if (sp.IsOpen)
{
sp.Close();
sp.Open(); //打开串口
}
else
{
sp.Open(); //打开串口
}
btnSwitchSP.Text="关闭串口";
groupBox1.Enabled=true;
groupBox2.Enabled=true;
this.toolStripStatusLabel1.Text="端口号: "+sp.PortName+" 丨";
this.toolStripStatu