分享
 
 
 

Visual C++在异步串行通信控制中的应用

王朝vc·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

Visual C++在异步串行通信控制中的应用

邱红兵韩峰

摘要:系统介绍了Visual C++实现异步串行通信的基本原理,分别讲述了用Windows函数库API函数实现和C运行时库的实现方法,以及在控制系统中的编程应用实例。

关键词:控制系统;串行通信;Visual C++应用

中图分类号:TP311.11 文献标识码:A

The Visual C++ Application in Asynchronous Serial Communication Control

QIU Hong-bing HAN feng

Abstract: The paper is focus on the principle of asynchronous serial communication by Visual C++, and tells of their implement methods using API function in Windows function warehouse and C function singly. The paper also adduces program application sample in control system.

Key Words: control system;serial communication;Visual C++ application

1引言

Visual C++是建立在Window 95和Window NT 32位程序上的可视化编程环境,对于控制系统的可视化开发提供了极大的便利,但是对于计算机控制系统中数据采集、控制,用Visual C++实现的介绍却很少。基于此,介绍Visual C++在测控系统应用中的基本原理及应用,其中异步串行通信是关键。其基本构成是:下位机(单片机系统)完成信号检测、A/D转换和简单的控制功能,通过系统总线(如RS-232C)与上位机(PC机)相连,进行监测、控制,形成主从式结构。

2工作原理

通过传感器检测得到被控信号及相关信号,经过放大、滤波处理形成有效信号,通过A/D转换形成数字信号,输入到单片机系统进行处理。其中单片机系统完成相应算法或控制功能;PC机主要完成监视、控制其下面的单片机系统,进行集中管理。它们之间的通信可通过RS-232C标准总线进行异步传输。系统结构如图1所示。

图1控制系统网络结构图

3Visual C++实现串行通信

Visual C++实现串行通信有几种方式可供选择,如利用计算机上的标准串行口进行,或自制专用卡插入工控机的PCI总线的ISA扩展槽等。下面主要论述利用计算机上的标准串行口进行串行通信,可分为利用Windows函数库API函数和利用C运行时库实现。其中API函数主要以创建资源的形式进行串行通信,C运行时库采用类似C的方式进行。

3.1API函数实现

Windows应用程序要与标准串口通信,Windows函数库中提供了24个低级函数,这些函数可与外部设备的通信提供了基本的工具,文件输入和文件输出函数为通信资源句柄的打开、关闭以及执行读写操作提供了基本的接口,Win32 API也包含一系列访问通信资源的通信函数,具体工作过程如下:首先打开一个通信资源句柄CreateFile(),接着进行串行通信资源的配置(包括波特率、奇偶校验、停止位和数据位等信息),通过SetCommState()、GetCommState()进行修改和查询完成初始化设置;串行通信资源的读写通过ReadFile()、WriteFile()来完成收发数据,监视串行通信资源某些可能发生的事件可通过WaitCommEvent()来完成,向与某通信资源相关的设备驱动程序发送控制命令,使驱动程序执行特定任务。对于具体参数设置可参阅有关书籍。[1]

3.2C运行时库实现

对于利用C运行时库实现串行通信在此将详细进行讨论。它与硬件密切相关,其核心器件是通用异步接收发送器(简称UART),并在机箱后部外引一个25脚(或15脚、9脚)的D型连接器作为数据终端设备(DTE)一侧,它通过异步通信电缆(RS-232)与另一侧数据通信设备(DCE)(MODEM或其它通信设备)相连。

3.2.1RS-232异步串行口连接

异步串行通信对应用接口极其敏感,常用的RS-232C接口有MODEM接口标准连接和零MODEM的非标准连接,但在实际应用中,并非需要全部控制信号线,而且在某种场合下,还允许采取若干种非标准的连接方式,如图2所示。其中图2a主要适用于长距离串行通信,而图2b适用于短距离异步通信,无需MODEM这类DCE设备介入。

图2RS-232接口连接

3.2.2异步串行通信原理

利用C进行异步通信编程,其实是对UART内部寄存器的读出或写入操作。VC可利用-inp()/-outp()函数对其进行编程,它们的端口地址列于表1。

表1UART内部寄存器端口分配

端口地址**

指令

条件*

寄存器名称及作用

0x3f8(0x2f8)

0x3f8(0x2f8)

0x3f8(0x2f8)

0x3f9(0x2f9)

0x3f9(0x2f9)

0x3fa(0x2fa)

0x3fb(0x2fb)

0x3fc(0x2fc)

0x3fd(0x2fd)

0x3fe(0x2fe)

_outp

_inp

_outp

_outp

_outp

_inp

_outp

_outp

_inp

_inp

DLAB=0

DLAB=0

DLAB=1

DLAB=1

DLAB=0

写入发送器保持寄存器

读出接收器数据寄存器

写入波特率因子(LSB)

写入波特率因子(MSB)

写入中断允许寄存器

读出中断标识寄存器

写入线路控制寄存器

写入MODEM控制寄存器

读出线路状态寄存器

读出MODEM状态寄存器

*DLAB指线路控制器 D7位;

**括号前指COM1,括号内指COM2。

下面,从编程应用的顺序考虑,对表1各个寄存器的作用进行说明(端口地址以COM1为例)。

首先确定异步通信的数据格式,包括波特率因子的锁存,奇偶校验位的设定,停止位数和数据位数的确定,各位定义如下:D7置1对除数锁存,D6置1允许间断,D5D4D3奇偶位,D2停止位数,D1D0数据位数。

接着确定通信双方传输波特率,确定波特率的方法是在通信前,将波特率因子(16位)分两次写入到波特率因子寄存器,波特率与波特率因子的关系举例:如波特率为75,其波特率因子为0x06(MSB),0x00(LSB);波特率为1200,其波特率因子为0x00(MSB),0x60(LSB);1800对应0x00(LSB),0x40(MSB);2400对应0x00(LSB),0x30(MSB);3600对应0x00(LSB),0x20(MSB);9600对应0x00(LSB),0x0C(MSB)等等。

紧接着是读取线路状态判断,适用于URAT的查询I/O,若采取中断I/O,不需判断。对URAT采取查询I/O方式,首先要读取线路状态,以判断是否就绪并用于发送或接收。存在UART内部状态的线路状态寄存器的各位定义如下:D7恒0,D6发送移位寄存器为空,D5发送保持寄存器为空,D4 接收到间断条件,D3接收到帧格式错,D2接收到奇偶校验错,D1接收到超越错,D0接收器数据就绪。

然后进行判断。确定芯片操作方式和控制MODEM可通过对MODEM控制寄存器的写入操作完成。[2]

3.2.3应用实例

VC对异步串行通信编程应用实例。主控计算机主要完成对其下的单片机系统的数据收集、处理控制和报警功能。控制系统结构图如图1所示。对于控制软件的串行通信有以下部分组成:串行口的初始化、数据收集处理和控制报警等部分(以串行口COM1为例,端口基址0x3f8)。

初始化串行通信口一般做以下几件事:确定数据传输帧格式(包括数据位长度、停止位长度及奇偶有无和类型选择)、确定传输波特率(与数据信号传输率同值)以及确定UART操作方式。操作方式指正常通信或循环反馈用于诊断,是程序查询I/O还是通信中断I/O。

void CCommu::Init(){

_outp(0x3fb,0x80);//设置线路控制寄存器置DLAB=1进行设定波特率

_outp(0x3f8,0x30);//写入波特率因子,波特率为2400

_outp(0x3f9,0x00);

_outp(0x3fb,0x03);//设置线路控制寄存器置DLAB=0确定数据帧传输格式

_outp(0x3f9,0x00);//设置中断允许寄存器采用查询I/O

}

数据收集处理主要完成数据接收发送。在收发过程中必须检测MODEM状态寄存器和线路状态寄存器。通信流程如图3所示:图3a为发送流程,图3b为接收流程。部分程序如下:

图3查询I/O方式下通信流程图

BOOL CCommu::WaitForStatus(int flag)

{ //When flag is 1,send else receive

int statusflag,j1=0,j2=0;

BOOL TimeOverFlag=FALSE;

do{

statusflag=(int)_inp(0x3fd);

if(flag==1){

statusflag=statusflag&0x20;

if(statusflag!=0){break;}

}

else{

j1++;

statusflag=statusflag&0x01;

if(statusflag!=0){break;}

else{

if(j1 % 5000==0){j2++;j1=0;}} if(j2>60){TimeOverFlag=TRUE;break;}

}

}while(1);

return TimeOverFlag;

}

void Ccommu::SendData(int data)

{_outp(0x3f8,data);}

_int8 Ccommu::ReceData()

{return (_int8)_inp(0x3f8);

对于控制、报警可根据具体要求确定。一般可采取主控计算机集中控制集中报警的方式,或从单片机系统自主控制主计算机集中管理报警的方式。对于数据的收发过程按上述原则进行,在此不在详述。

4结束语

本文介绍的Visual C++实现异步串行通信用于电力系统电缆故障在线监测系统中运行良好;对于控制系统的可视化、网络化开发有参考意义。

作者简介:邱红兵(1974-),男,湖北云梦县人,硕士研究生,主要从事数学模型建立、微机应用软件开发、机电控制及自动化研究。

作者单位:北京理工大学 机电工程系,北京100081

参考文献

[1]穆宗学,章江,肖蓉.Visual C++ 4.2编程实践指要[M]. 北京:中国铁道出版社,1997. 160-169.

[2]高登芳,潘承武,朱英杰.微型计算机实用测控接口技术[M]. 北京:北京科学技术出版社,1990. 214-224.

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有