MFC 串口通信编程

转载 2017年04月11日 09:57:18

本篇文章主要介绍了”RS-232/RS-485/RS-422 接口简介与编程”,主要涉及到RS-232/RS-485/RS-422 接口简介与编程方面的内容,对于RS-232/RS-485/RS-422 接口简介与编程感兴趣的同学可以参考一下。
一、什么是RS-232 接口?

(1) RS-232 的历史和作用

在串行通讯时,要求通讯双方都采用一个标准接口,使不同的设备可以方便地连接起来进行通讯。 RS-232-C接口(又称EIA RS-232-C)是目前最常用的一种串行通讯接口。 (“RS-232-C”中的“-C”只不过表示RS-232的版本,所以与“RS-232”简称是一样的)它是在1970 年由美国电子工业协会(EIA)联合贝尔 系统、调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。 它的全名是”数据终端设备(DTE)和数据通讯设备(DCE)之间串行二进制数据交换接口技术标准”该标准规定采用一个25 个脚的DB-25 连接器,对连接器 的每个引脚的信号内容加以规定,还对各种信号的电平加以规定。 后来IBM的PC 机将RS-232 简化成了DB-9 连接器,从而成为事实标准。 而工业控制的RS-232 口一般只使用RXD、TXD、GND 三条线。

(2)RS-232 接口的电气特性

在RS-232-C 中任何一条信号线的电压均为负逻辑关系。 即:逻辑”1”为-3 到-15V;逻辑”0”为+3 到+15V 。 RS-232-C 最常用的9 条引线的信号内容如下所示

DB-9 1 2 3 4 5 6 7 8 9

DB-25 8 3 2 20 7 6 4 5 22

定义DCD RXD TXD DTR GND DSR RTS CTS RI

(3) RS-232 接口的物理结构

RS-232-C 接口连接器一般使用型号为DB-9 插头座,通常插头在DCE端,插座在DTE端.

PC 机的RS-232 口为9 芯针插座。 而波士RS-232/RS-485转换器的RS-232 为DB-9 孔插头。 一些设备与PC 机连接的RS-232 接口,因为不使用对方的传送控制信号,只需三条接口线,即”发送数据TXD”、”接收数据RXD”和”信号地GND”。 RS-232 传输线采用屏蔽双绞线。

(4)RS-232 传输电缆长度

由RS -232C标准规定在码元畸变小于4%的情况下,传输电缆长度应为50 英尺,其实这个4%的码元畸变是很保守的,在实际应用中,约有99%的用户 是按码元畸变10-20%的范围工作的,所以实际使用中最大距离会远超过50英尺,美国DEC公司曾规定允许码元畸变为10%而得出下面实验结果。 其中1 号电缆为屏蔽电缆,型号为DECP.NO.9107723 内有三对双绞线,每对由22# AWG 组成,其外覆以屏蔽网。 2 号电缆为不带屏蔽的电缆。 型号为DECP.NO.9105856-04是22#AWG 的四芯电缆。

DEC 公司的实验结果

波特率bps 1号电缆传输距离(米) 2号电缆传输距离(米)

110 1500 900

300 1500 900

1200 900 900

2400 300 150

4800 300 75

9600 75 75

经过许多年来RS-232 器件以及通信技术的改进,RS-232 的通信距离已经大大增加。 波士电子的RS-232 增强器可以将普通的RS-232 口的通信距离直接延长到1000米。

二、什么是RS-485 接口?

  1. RS-485 的电气特性:

发送端:逻辑”1”以两线间的电压差为+(2 至6) V 表示;逻辑”0”以两线间的电压差为-(2 至6)V 表示。 接收端:A比B高200mV以上即认为是逻辑”1”,A 比B 低200mV 以上即认为是逻辑”0”。

  1. RS-485(或 RS-422)的接线:

RS -485(或RS-422)通信建议一定要接地,因为RS-485(或RS-422)通信要求通信双方的地电位差小于1V。 即:半双工通信接3根线(+A、-B、地),全双工通信接5根线(+发、-发、+收、-收、地)。 为了安全起见,建议通信机器的外壳接大地。 RS-485(或RS-422)光隔转换器的所有外接电源的“地”必须全部连在一起但不要与计算机外壳地相连,因为电源“地”同时也是RS-485或RS-422的信号 “地”。 当通信距离超过100米时建议最好使用光电隔离的通信接口转换器。

  1. RS-485 的数据最高传输速率为10Mbps。 但是由于RS-485 常常要与PC 机的RS-232口通信,所以实际上一般最高115.2Kbps。 又由于太高的速率会使RS-485 传输距离减小,所以往往为9600bps 左右或以下。

  2. RS-485 接口是采用平衡驱动器和差分接收器的组合,抗噪声干扰性好。

  3. RS-485接口的最大传输距离标准值为1200米(9600bps时),实际上可达3000米,RS-485 接口在总线上是允许连接多达128个收发器、即RS-485 具有多 机通信能力,这样用户可以利用单一的RS-485 接口方便地建立起设备网络。 因RS-485 接口具有良好的抗噪声干扰性,长的传输距离和多站能力等上述优点就使其成为首选的串行接口。 因为RS485 接口组成的半双工网络,一般只需二根信号线,所以RS485 接口均采用屏蔽双绞线传输。 RS-485 的国际标准并没有规定RS485 的接口连接器标准、所以采用接线端子或者DB-9、DB-25 等连接器都可以。 波士RS-485 接口是事实工业标准。

  4. 采用RS485 接口时,传输电缆的长度如何考虑?

在使用RS485 接口时,对于特定的传输线经,从发生器到负载其数据信号传输所允许的最大电缆长度是数据信号速率的函数,这个长度数据主要是受信号失真及噪声等影响所限制。 最大电缆长度与信号速率的关系曲线是使用24AWG 铜芯双绞电话电缆(线径为0。51mm),线间旁路电容为52。5PF/M,终端负载电阻为100 欧时所得出。 (引自GB11014-89附录A)。 当数据信号速率降低到90Kbit/S 以下时,假定最大允许的信号损失为6dBV 时,则电缆长度被限制在1200M。 实际上,在实用时是完全可以取得比它大的电缆长度。 当使用不同线径的电缆。 则取得的最大电缆长度是不相同的。 例如:当 数据信号速率为600Kbit/S

时,采用24AWG 电缆,最大电缆长度是200m,若采用19AWG 电缆(线径为0.91mm)则电缆长度将可以大于200m; 若采用28AWG 电缆(线径为0.32mm)则电缆长度只能小于 200m。 RS-485的远距离通信建议采用屏蔽电缆,并且将屏蔽层作为地线。

三、什么是RS-422 接口?

RS-422 的电气性能与RS-485完全一样。 主要的区别在于:

RS-422 有4 根信号线:两根发送(Y、Z)、两根接收(A、B)。 由于RS-422 的收与发

是分开的所以可以同时收和发(全双工)。 RS-485 有2 根信号线:发送和接收都是A 和B。 由于RS-485 的收与发是共用两根线所以不能够同时收和发(半双工)。 能否将RS-422 的YA 短接作为RS-485 的A、将RS-422 的ZB 短接作为RS-485 的B呢? 回答:不一定。 条件是RS-422 必须是能够支持多机通信的。 波士电子的所有接口转换器的RS-422 口都能够支持全双工多机通信,所以可以这样简单转换为RS-485。

四、RS-485 比RS-232接口相比有何特点?

由于RS-232 接口标准出现较早,难免有不足之处,主要有以下四点:

(1) 接口的信号电平值较高,易损坏接口电路的芯片,又因为与TTL 电平不兼容故需使用电平转换电路方能与TTL 电路连接。

(2) 传输速率较低,在异步传输时,波特率为20Kbps。 现在由于采用新的UART 芯片16C550 等,波特率达到115.2Kbps。

(3) 接口使用一根信号线和一根信号返回线而构成共地的传输形式, 这种共地传输容

易产生共模干扰,所以抗噪声干扰性弱。

(4) 传输距离有限,最大传输距离标准值为50 米,实际上也只能用在15米左右。

(5)RS-232 只允许一对一通信,而RS-485 接口在总线上是允许连接多达128个收发器。

五、串口通信功能的实现

利用VC++实现串口通信的方法有多种,我们采取直接调用Window API中的一系列标准的串口通信函数,直接用这些标准函数来完成Windows下面的串口通信编程[11]。 利用WindowsAPI函数控制利用API 函数实现对RS232串口通信的访问,在实现控制通信中,我们必定要调动3个函数来实现对串口的控制:

CreatFile()函数实现串口初始化并打开串口;

ReadFile()函数接收串口传递过来的二进制流并返回数据到接收缓冲区中

WriteFile()把应用程序发出的指令送到发送缓冲区以供串口接收1. 打开串口

以下程序用于以同步方式打开串口COM1;

HANDLE hCom;
DWORD dwErrorHcomm=CreateFile(“COM1”,GENERIC_READ|GENERIC_WRITE
,0, NULL,OPEN_EXISTING, 0, NULL);
if (hComm==(HANDLE)0Xffff)
{
    dwError=GetLastError();
    MessageBox(dwError);
} 
  1. 配置串口

配置串口是通过改变设备控制块DCB(Device Control Block)的成员变量值来实现的,程序实现如下:

DCB dcb;
dcb.BaudRate=9600;//波特率为9600bps
dcb.ByteSize=8;//数据位8位
dcb.Parity=EVENPARTTY;//有校验
dcb.StopBits=ONESTOPRTT; //一个停止位
SetCommState(hCom,&dcb); 
  1. 数据读写

对串口进行读写与对文件进行读写所用的函数相同,具体为可采用查询、同步、异步或事件驱动等方法对串口进行读写所用函数如下所示:

bReadStatus=ReadFile(hCom,buffer,length,&length &m_lpOverlapped);
if(!bReadStatus)
{
    if(GetLastError()=ERROR_IO_PENDING)
    {
        WaitForSingleObject(m_lpOverlapped,hEvent,1000);
        return((char)length);
    }
    return 0;
} 

//写入函数程序为:

bWriteStatus=WriteFile(hCom,buffer,length,&length,&m_lpOverlapped)
if(!bWriteStatus)
{
    if(GetLastError()=ERROR_IO_PENDING)
    {
        WaitForSingleObject(m_lpOverlapped, hEvent,1000);
        return((char)length);
    }
    return 0;
} 
  1. 程序的编制

用VC++进行程序的编制首先要对串口进行初始化,设定端口,通信速率和校验方式,并在使用前打开串口,程序部分如下:

Cdialog::OnInitDialog();//TODO: Add extra initialization here
m_comm.SetCommPort(1);//选择串口1
if(! m_comm.GetPortOpen())
m_comm.SetPortOpen(TRUE);//打开串口1
m_comm.SetSettings(“9600,n,8,1”); //设置串口参数
m_comm.SetRThreshold(1);
m_comm.SetInputMode(1);//设置二进制模式 

除了串口的位置和基本串口参数(数据传输速率9600bps,1位开始位,8位数据位,1位停止位,一位奇偶校验)设置外,为了实现实时数据采集功能,接受数据的读写 要尽可能的快速,则设置RTHreshold=1即接收缓冲区收到一个字节产生OnComm事件InputLen=1每次读取一个字节。 如果PC上位机在一定时间内不能将数据处理完,接收缓冲区会滞留数据,数据会产生丢失现象,我们必须对接受缓冲区进行适当的设置。 我们利用API函数实现串口通信的方法,实现了罗经及发射机对上位机串行通信的功能。

VS2015串口通信编程(MFC)笔记

3. 选用MSCOMM控件方式进行串口通信 (1). 只能打开不大于COM16的串口;该控件不能在其他线程中直接被调用,但可以将其操作封装到函数中被间接使用。 (2). 接收:MSCOMM控件中断事件...
  • sqh9595
  • sqh9595
  • 2016年04月10日 00:00
  • 6391

VC_MFC串口通信编程详解

在工业控制中,工控机(一般都基于 Windows 平台)经常需要与智能仪表通过串口 进行通信.串口通信方便易行,应用广泛.   一般情况下,工控机和各智能仪表通过 RS485 总线进行通信.RS4...

VS2013下(MFC编程) 与 Omron PLC 串口通信,工控机案列

//  CDetectDlg   主 类 名, //打开串口 HANDLE CDetectDlg::KSrialOpen() {     /*     Overlapped.hEvent...
  • teleger
  • teleger
  • 2016年07月29日 20:29
  • 418

基于MFC-MSComm控件的PC与单片机串口通信编程

作者:uedsr542   来源:51hei    使用工具Visual C++ 6.0,9针RS232串口线一条,P0口带上拉的LED的51最小系统版。 打开软件,新建——>MFC AppWi...

VS2010中使用MSComm32.OCX进行MFC串口通信编程(Win8.1)

种情况一般出现在Windows7版本下,这说明MSCOMM32没注册,我们可以选择两种方法去解决,一种方法是当我们安装VC++6.0/VB6.0时,如果选择了ACtiveX控件项(自定义安装),MSC...

基于STC串口通信和VC6.0MFC编程的电子琴设计

电子实训课程实验项目                       --电子琴 【前言】        为进一步激发学生对于硬件编程的兴趣而开展的课程“电子实训”课程到目前为止已经要告一段落了。将...

MFC串口通信编程图列子文详解

  • 2013年12月06日 19:26
  • 1.1MB
  • 下载

串行通信的基本原理及用MFC实现串口通信编程

在Windows应用程序的开发中,我们常常需要面临与外围数据源设备通信的问题。计算机和单片机(如MCS-51)都具有串行通信口,可以设计相应的串口通信程序,完成二者之间的数据通信任务。   实际...
  • jctang
  • jctang
  • 2011年09月18日 21:23
  • 418

串行通信的基本原理及用MFC实现串口通信编程

http://www.newasp.cn/tech/program/20140.html   在Windows应用程序的开发中,我们常常需要面临与外围数据源设备通信的问题。计算机和单片机(如MCS...

VC_MFC串口通信编程详解

  • 2012年06月02日 15:57
  • 146KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MFC 串口通信编程
举报原因:
原因补充:

(最多只允许输入30个字)