Windows2000环境下PC机与单片机串行通信技术研究

更新时间:2023-07-29 03:05:36 阅读: 评论:0

Win d ows 2000环境下PC 机与单片机串行通信技术研究
温富光,林永君,罗廷坤
(华北电力大学工业工程仿真与控制实验室,河北保定071003)
摘要:通过实例,介绍为大型直流电机调速系统开发PC 机与89C51芯片之间串行数据通信的经验。详细阐述了一种在W ind ows 2000环境下,以C ++Builder 6.0为开发平台,通过调用W in 32API ,建立基于多线程和定时事件驱动的串口通信的应用程序开发方法,并说明了事件对象在线程同步中的具体应用。关键词:串行通信;多线程;Win32API
中图分类号:TP368.1
文献标识码:B      文章编号:1005-7641(2004)06-0053-03
收稿日期:2004-
03-11
作者简介:温富光(1980-),男,广西横县人,壮族,硕士研
究生,研究方向为先进控制策略及其应用、计算机控制技术、单片机技术与网络;   林永君(1965-),男,山东莱西人,博士,副教授,硕士研究生导师,研究方向为智能控制技术和计算机网络;   罗廷坤(1980-),男,福建福安人,硕士研究生,研究方向为计算机控制系统和单片机技术。
0 引言
在开发大型直流电机调速系统的过程中,笔者采
用PC 机与89C51之间的主从式控制方式和串行端口来传送交互数据信号,将单片机作为下位机(主要负责直流电机的各种数据的采集和模数转换),PC 机作为上位机(主要负责数据的分析处理和显示),连接方式如图1所示。
图1 上位机与下位机的连接示意
由于PC 机和单片机只进行短距离的通信,可以
采用RS -232标准的三线制连接,通过M AX232芯片,单片机和RS -232间进行电平转换。单片机端的串行通信采用汇编语言开发;PC 机端的串行通信是在Win 2dos 2000环境下以C ++Builder 6.0为开发平台,采用Win32API 函数和多线程技术来进行开发的。
1 PC 机端串行通信的开发
1.1 串行通信开发基本方法
从Windows 95以后,开发商对Win32中有关串行通信的API 有了较大的修改,取消了以前的W M -C OM M NOTIFY 消息以及OpenC omm 、CloC omm 、Read 2C omm 、WriteC omm 、FlushC omm 等16位API 函数,使用与文件打开、关闭、读写相同的函数来实现串行端口操作,而且允许自定义读写缓冲区的大小,因而使得读写速度大大加快了。在Windows 环境中开发串口通信程序有4钟方式:查询(需要花费CPU 的大量资源),同步I/O (直到读写到指定的字节数才返回,容易造成主线程堵塞),异步I/O (即以重叠的方式打开串行端口和读写端口,可以在多线程下使用),事件驱动I/O (当串行端口发生某一通信事件时,由操作系统发消息给应用程序,可以在多线程下使用)。本文采用异步重叠操作和事件驱动相结合的方法,在Windows 2000下开发串行通信程序。
PC 机端串行通信的开发主要有以下几步:(1)打开PC 机上的串口资源
串口在被使用前,必须先被打开,为了系统的安全运行,Windows 禁止程序员在任何情况下直接访问串行硬件资源,并把串行硬件端口当作文件来管理,故可以使用打开文件命令CreateFile ()函数来打开串行端口。该函数如果打开成功,指定的串行端口将返回标识该串口的句柄;否则返回I NVA LI D-H AND LE -VA LUE 。代码如下:
hC omm =CreateFile (commNo ,GE NERIC -WRITE |
GE NERIC -RE AD ,0,NU LL ,OPE N-EXISTI NG,FI LE -F LAG -OverLAPPE D ,0);∥以重叠方式打开串口;
(2)配置串行端口参数
打开串口之后,可以调用SetupC omm ()函数,给串口分配一定大小的发送缓冲区和接收缓冲区。然后,使用G etC ommState ()函数来获得当前串口的默认参
数,同时这个函数返回一个设备控制块(DC B)的地址。通过给这个DC B结构体的各个成员赋值,再调用Set2 C ommState()函数,即可用赋过值的DC B结构的参数去设置串行端口状态。通常要设定的参数有波特率、字节位数、是否用奇偶校验、停止位的位数,而其他的参数使用默认值即可。程序如下:
G etC ommState(hC omm,&dcb);
dcb.BaudRate=C BR-9600;
dcb.ByteSize=8;圣诞节放假
dcb.Parity=E VE NPARITY;
dcb.StopBits=ONEST OP BIT;
if(!SetC ommState(hC omm,&dcb))
{
StatusBar1->Panels->Items[0]->T ext=“通信参数设置出错”;
return;
}
(3)超时设置
由于通信中总可能发生各种异常情况,有时候这些异常情况将会导致读写端口函数阻塞时间过长,得
不到正确的结果。这时就要给一个C OM MTI ME OUTS 结构体赋值,然后调用SetC ommT imeouts()函数来设定串口的超时参数。C OM MTI ME OUTS结构体的5个成员分别是读间隔超时(指接收到两个字符间的最大延时)、读总超时系数、读总超时常数、写总超时系数、写总超时常数。总超时是指读写操作总共花费的最大时间。计算公式为:总超时=总超时系数×要求读/写的字节数+总超时常数。设置如下:
C OM MTI ME OUTS commT imeouts;
commT imeouts.ReadIntervalT imeout=150;
commT imeouts.ReadT otalT imeoutMultiplier=30;
commT imeouts.ReadT otalT imeoutC onstant=2000;
commT imeouts.WriteT otalT imeoutMultiplier=50;
commT imeouts.WriteT otalT imeoutC onstant=100;
SetC ommT imeouts(hC omm,&commT imeouts)。
(4)读写串口
要往串口写入一定长度的数据,调用WriteFile()函数;从串口中读取一定长度的数据,可以调用Read2 File()函数。在串行通信过程中,可能会发生很多错误,虽然对于绝大部分的错误都无须去理会,但有时不清除这些错误通信将无法进行下去,必须调用ClearC ommError()函数清除这些错误。这个函数还能够返回错误代码和当前通信状态缓冲区的内容。在必要情况下,还要调用PurgeC omm()函数来清除串行端口缓冲区。本部分的代码将在线程函数中给出。
(5)关闭串口
在通信结束后,调用CloHandle()函数关闭该串口的句柄,释放串口资源。
if(hC omm!=I NVA LI D-H AND LE-VA LUE)
三文鱼的最佳吃法
CloHandle(hC omm);
1.2 多线程技术
Windows2000是32位的抢先多任务操作系统,它把CPU处理数据的时间划分成很多的时间片。线程是操作系统分配CPU时间的面对实体,系统为每一个线程分配一个CPU时间片。某个线程只有在系统分配的时间片内才能获得对CPU的控制权。在执行重叠操作的串行通信开发中,往往把用户界面线程(一般是主线程)和通信线程分开,这样能保证在进行通信时,用户界面程序仍能和用户进行正常的交互。
在C++Builder6.0中,可以直接创建线程对象,使用同步技术,还可以访问可视化控件(VC L)资源,但这样做很不安全。我们采用的是调用Win32API创建线程函数CreateThread(),来直接创建通信子线程,不需要访问VC L资源,只是预先把要写的内容填到发送缓冲区即可。代码如下:
DW ORD commI D;
DW ORD hC ommThread;
hC ommThread=CreateThread(NU LL,0,
(LPTHRE AD-ST ART-ROUTI NE)(LPVOI D3)
C omm Proc,(LPVOI D)NU LL,0,
(LPDW ORD)&commI D);
SetThreadPriority(hC ommThread,THRE AD-PRI ORI2 TY-TI ME-CRITIC A L);
∥设置线程的优先级
线程函数的关键部分代码如下:
…∥通信变量定义及缓冲区处理
while(1)
{
WaitF orSingleObject(hSendCmd,(unsigned)-1);∥等待同步事件对象
ClearC ommError(hC omm,&dwErr,&comStat);∥清除通信错误
PurgeC omm(hC omm,PURGE-TXC LE AR|PURGE-RX2
C LE AR);∥清空发送/接收缓冲区
FillMem ory(&ovWrite,sizeof(OverLAPPE D),0);
…∥通信状态的判定,然后写端口
if(FA LSE=WriteFile(hC omm,byWrite,dwWrite, &dwHasWrite,&ovWrite))
{
dwErr=G etLastError();∥写端口出错
if(dwErr==ERROR-I O-PE NDI NG)
{
if(!G etOverlappedResult(hC omm,&ovWrite, &dwHasWrite,TRUE))
{
dwC ommWriteError++;
continue;
  }
 }
}
…∥通信状态的判定,然后读端口
dwHasRead=0;
FillMem ory(&ovRead,sizeof(OverLAPPE D),0);
if(FA LSE=ReadFile(hC omm,&byRead[3],dwRead, &dwHasRead,&ovRead))
{
道德素质if(G etLastError()=ERROR-I O-PE NDI NG)
妇炎洁使用方法{
if(!G etOverlappedResult(hC omm,&ovRead, &dwHasRead,TRUE))
{
dwC ommReadError++;
continue;
  }
 }
}
…∥其他处理
}
1.3 同步事件技术
在串行通信中,一般使用SetC omm Mask()和Wait2 C ommEvent()函数,来设置被检测和等待的通信事件。我们不设置要检测的通信事件,而是通过定时触发同步事件对象去唤醒通信线程,进行端口的读写,这样既能保证实时通信,又不会因为数据流量过大而导致通信堵塞。具体实现方法是:
(1)首先在应用程序主窗口初始化时创建同步事件对象:
businessH AND LE hSendCmd;∥同步事件对象应定义为全
局变量
hSendCmd=CreateEvent(NU LL,FA LSE,FA LSE,
“SendC ommand”);
(2)其次,在一个定时为1000ms定时器的事件中设置该同步事件为信号态:
SetEvent(hSendCmd);
这样,定时器每秒钟被触发一次,同步事件就每秒钟变为信号态一次,唤醒通信线程,然后被系统自动重置,通信线程在这1s内完成一次读写端口的一定字节的操作。
1.4 通信协议
在大型直流电机调速过程中,通信模块有可能受到外界较大的干扰,为了保证通信的可靠性,制订如下的通信协议:
(1)PC机和单片机都可以发送和接收数据;
(2)PC机和单片机的波特率都选定为9600bit/s;
(3)通信帧格式是:1个起始位,8个数据位,1位可编程位(用以确定发送和接收的是数据还是地址),1位停止位;
青瓜鸡蛋
(4)每发送和接收一个数据包,都要进行累加和检验,对每个字节的发送与接收要进行偶检验;
(5)采用中断通信方式;
(6)为了保证数据的可靠、有效,PC机主动联系单片机,单片机收到PC机发送的地址后再将本机地址发送给上位PC机。在上位机端若检查收到的地址码和开始发送出去的地址码相同,则认定双方握手成功,开始进行数据通信。
2 单片机端的通信
单片机端要对串口和所用到的定时器初始化。我们使用T imer2作为波特率发生器,其初始化部分代码如下:
M OV A,#5;通信初始化
M OV B,A
M OVC A,@A+PC
S JMP BAUD1;
DB0FDH,0FAH,0F7H,0EEH,0DCH,0B8H,070H
BAUD115200,57600,38400,19200,9600,4800, 2400
 BAUD1:
M OV RC AP2H,#0FFH
M OV RC AP2L,A
M OV T L2,A
M OV T2C ON,#34H
M OV T M OD15H;
SET B TR1
SET B ET1
M OV TH0,#0
M OV T L0,#0
(下转第64页)
采用w op光缆捆绑缠绕敷设。首先怀疑光缆在施工中有损伤,引起衰耗大,使通道中断。在雁塔变和乐居厂变两端,分别用光功率计测试,发现光缆通道衰耗不大。然后对尾纤测试检查,尾纤也正常。最后分别对继电保护屏的光通信盒进行测试检查,发现乐居厂变的光发信电平没有,最后更换光通信盒后,设备正常投入运行。
2 光纤保护前景分析
从应用情况来看,用光纤作为继电保护传输通道也存在一定的缺陷,如光纤通道经过许多环节后会增加通道衰耗值,用光纤传送变电站之间的低速率保护信号,会造成光纤资源较大浪费。为了克服这些缺点,可以使用电力通信的S DH传输网络,来提供保护装置之间的通信通道。S DH传送网络的通道资源较为丰富,且具有自愈能力。当两个变电站之间的光纤中断时,S DH可自动为装置之间的通信提供迂回通道,实现保护通道的双重化。S DH设备接口种类很多,其各类的数据接口和E1接口完全能够满足传输保护信号的要求。
参考文献:提问法
[1] 张少凡.光纤在继电保护中的应用[J].广东电力,2003,
(4):49-52.
[2] CS L103C数字式输电线路电流差动保护装置[Z].北京四
六继电保护自动化有限公司.2001.
T ransmitting relay protection signal through fiber optic cable
ZH OU Yu
(Dispatching Dept.of X i’an High V oltage E lectric P ower Bureau,X i’an710032,China)
Abstract:W ith the development of fiber optic cable techn ology,transmitting relay protection signal through optic cable are getting m ore and m ore popu2 lar.T he advantages of this scheme are prented in the paper,and through analyzing practical exam ples,comm on faults of transmitting relay protection signal through fiber optic cable and its countermeasures are given too.Finally,the prospect of this scheme is prented.
K ey w ords:fiber optic cable;relay protection signal;countermeasure
(上接第55页)
3 结束语
本文所提出的方法,已在大型直流电机调速系统的PC机和单片机的通信模块中得到了成功的应用。实践证明,这个方法能够在规定范围内确保通信的实时性。参考文献:
[1] 范逸之,等.C++Builder与RS-232串行通信控制[M].北
京:清华大学出版社,2000.
[2] Allen Denver.Serial C ommunications in Win32[Z].Micros oft
Windows developer Support,December11,1995.
The study on rial communication betw een PC and89C51micro-controller in Windows2000
WEN Fu-guang,LIN Yong-jun,LUO Ting-kun
(Industry Process S imulation&C ontrol Lab.,N orth China E lectric P ower University,Baoding071003,China)
Abstract:The experience of designing the rial communication program between PC and89C51micro-controller for the speed control of large DC m otor is introduced by s ome examples.In windows2000,bad on C++Builder6.0platform,the application program design of rial interface com2 munication is built by prov oking win32API,using multi-thread and timing event drive.This actual application of event object in synchronizing multi -thread is showed.
K ey w ords:rial communication;multi-thread;Win32API双十一是什么节日
(上接第62页)
The method of supplying stable AC source in long term
LI Wei-dong
(The C ommunication Center of Meizhou P ower Bureau,Meizhou514021,China)
Abstract:All the AC power supply provided to the power communication equipments can’t be interrup
ted anytime.This paper introduces a simple method to s olve the problem of supplying stable AC s ource in long term according to actual w orking experience.
K ey w ords:alternating current s ource;supply

本文发布于:2023-07-29 03:05:36,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1122264.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:串行   端口   函数   单片机   串口   进行
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图