说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

Delphi 中 串 行 通 信 的 实 现

HTML文档下载 WORD文档下载 PDF文档下载
Delphi 中 串 行 通 信 的 实 现

随 着 现 代 信 息 技 术 的 发 展 以 及 计 算 机 网 络 的 广 泛 使 用, 计 算 机 通 信 技 术已 经 日 臻 成 熟, 但 串 行 通 信 作 为 一 种 灵 活 方 便 可 靠 的 通 信 方 式, 仍 不 失 为有 效 的 通 信 手 段, 被 广 泛 应 用 于 工 业 控 制 中。 在 工 业 生 产 实 践 中, 用PC 机 对工 程 实 现 实 时 监 控, 通 常 要 求PC 机 能 在 用 户 界 面 上 具 有 数 据 采 集、 数 据 处理 以 及 控 制 信 号 的 产 生 与 传 输 等 功 能。 在 这 种 特 定 的 环 境 下,PC 机 要 与 过程 控 制 的 实 时 信 号 相 联 系, 就 要 求 能 实 现 对PC 机 的 串 行 端 口 直 接 操作。Borland公 司 推 出 的Delphi 是 一 种 功 能 强 大 的 高 级 编 程 语 言, 其 具 有 的 可 视 化 面 向 对象 的 特 性, 特 别 适 于 在Windows 环 境 下 图 形 界 面 和 用 户 程 序 的 编 制。 本 文 就 是介 绍 基 于Windows95/NT 操 作 系 统 用Delphi 来 实 现PC 机 与 下 层PLC 控 制 器 之 间 的 串 口通 信 方 法。

基 于WIN95/NT 的 串 行 通 信 机 制

Windows 操 作 系 统 的 机 制 禁 止 应 用 程 序 直 接 访 问 计 算 机 硬 件, 但 它 为 程 序员 提 供 了 一 系 列 的 标 准API 函 数, 使 得 应 用 程 序 的 编 制 更 加 方 便 并 且 免 除 了对 有 关 硬 件 的 调 试 麻 烦。 在Windows95/NT 中, 原 来Windows3.X 的WM_COMMNOTIFY 消 息已 被 取 消, 操 作 系 统 为 每 个 通 信 设 备 开 辟 了 用 户 可 定 义 大 小 的 读/ 写 缓 冲

区, 数 据 进 出 通 信 口 均 由 操 作 系 统 后 台 完 成, 应 用 程 序 只 需 对 读/ 写 缓 冲 区操 作 即 可。WIN95/NT 中 几 个 常 用 的 串 行 通 信 操 作 函 数 如 下:

CreatFile

打 开 串 行 口

CloseHandle

关 闭 串 行 口

SetupComm

设 置 通 信 缓 冲 区 的 大 小

ReadFile

读 串 口 操 作

WriteFile

写 串 口 操 作

SetCommState

设 置 通 信 参 数

GetCommState

获 取 默 认 通 信 参 数

ClearCommError

清 除 串 口 错 误 并 获 取 当 前 状 态

---- 除 上 述 几 个 函 数 外, 还 要 经 常 用 到 一 个 重 要 的 记 录DCB( 设 备 控 制

块)。DCB 中 记 录 有 可 定 义 的 串 行 口 参 数, 设 置 串 行 口 参 数 时 必 须 先 用

GetCommState 函 数 将 系 统 默 认 值 填 入DCB 控 制 块, 然 后 才 可 把 用 户 想 改 变 的 自 定

义 值 设 定。

---- 在WIN95/NT 中 进 行 串 行 通 信 除 了 解 基 本 的 通 信 操 作 函 数 外, 还 要 掌 握 多 线

程 编 程。 线 程 是 进 程 内 部 执 行 的 路 径, 是 操 作 系 统 分 配CPU 时 间 的 基 本 实

体。 每 个 进 程 都 由 单 线 程 开 始 完 成 应 用 程 序 的 执 行。 串 行 通 信 需 要 利 用 多

线 程 技 术 实 现, 其 主 要 的 处 理 逻 辑 可 以 表 述 如 下: 进 程 一 开 始 先 由 主 线 程

做 一 些 必 要 的 初 始 化 工 作, 然 后 主 线 程 根 据 需 要 在 适 当 时 候 建 立 通 信 监 视

线 程 监 视 通 信 口, 当 指 定 的 串 行 口 事 件 发 生 时, 向 主 线 程 发 送

WM_COMMNOTIFY 消 息( 由 于WIN95 取 消 了WM_COMMNOTIFY 消 息, 因 此 必 须 自 己 创

建), 主 线 程 对 其 进 行 处 理。 若 不 需 要WM_COMMNOTIFY 消 息, 则 主 线 程 终 止 通

信 监 视 线 程。

---- 多 线 程 同 时 执 行, 将 会 引 起 对 共 享 资 源 的 冲 突。 为 避 免 冲 突, 就 要 用 同

步 多 线 程 对 共 享 资 源 进 行 访 问。WIN95 提 供 了 许 多 保 持 线 程 同 步 的 方 法, 笔

者 采 用 创 建 事 件 对 象 来 保 持 线 程 同 步。 通 过CraeteEvent() 创 建 事 件 对 象, 使

用SetEvent() 或PulseEvent() 函 数 将 事 件 对 象 设 置 成 信 号 同 步。 在 应 用 程 序 中,

利 用WaitSingleObject() 函 数 等 待 同 步 的 触 发, 等 到 指 定 的 事 件 被 其 它 线 程 设 置

为 有 信 号 时, 才 继 续 向 下 执 行 程 序。

---- Delphi 下 的 具 体 实 现 方 法

---- Delphi 的 强 大 功 能 和 支 持 多 线 程 的 面 向 对 象 编 程 技 术, 使 得 实 现 串 行 通 信

非 常 简 单 方 便。 它 通 过 调 用 外 部 的API 函 数 来 实 现, 主 要 步 骤 如 下: 首 先, 利

用CreateFile 函 数 打 开 串 行 口, 以 确 定 本 应 用 程 序 对 此 串 行 口 的 占 有 权, 并 封

锁 其 它 应 用 程 序 对 此 串 口 的 操 作; 其 次, 通 过GetCommState 函 数 填 充 设 备 控 制

块DCB, 再 通 过 调 用SetCommState 函 数 配 置 串 行 口 的 波 特 率、 数 据 位、 校 验 位 和

停 止 位。 然 后, 创 建 串 行 口 监 视 线 程 监 视 串 行 口 事 件。 在 此 基 础 上 就 可 以

在 相 应 的 串 口 上 操 作 数 据 的 传 输; 最 后, 用CloseHandle 函 数 关 闭 串 行 口。 具 体

的 程 序 如 下, 本 程 序 用Delphi3.0 编 制 在Win95 环t 境 下 调 试 通 过, 已 投 入 实 际 应 用

中, 供 广 大 读 者 参 考。

---- 程 序:

unit comdemou;

interface

uses

Windows

Messages

SysUtils

Classes

Graphics

Controls

Forms

Dialogs;

const

Wm_commNotify=Wm_User+12;

type

TForm1 = class(TForm)

procedure FormCreate(Sender: TObject);

private

Procedure comminitialize;

Procedure MsgcommProcess(Var

Message:Tmessage); Message Wm_commnotify;

{ Private declarations }

public

{ Public declarations }

end;

//线程声明

TComm=Class(TThread)

protected

procedure Execute;override;

end;

var

Form1: TForm1;

hcom

Post_Event:Thandle;

lpol:Poverlapped;

implementation

{$R *.DFM}

Procedure TComm.Execute; //线程执行过程

var

dwEvtMask:Dword;

Wait:Boolean;

Begin

fillchar(lpol

sizeof(toverlapped)

0);

While True do Begin

dwEvtMask:=0;

Wait:=WaitCommEvent(hcom

dwevtmask

lpol);

//等待串行口事件;

if Wait Then Begin

waitforsingleobject(post_event

infinite);

//等待同步事件置位;

resetevent(post_event); //同步事件复位;

PostMessage(Form1.Handle

WM_COMMNOTIFY

0

0);//发送消息;

end;

end;

end;

procedure Tform1.comminitialize;

//串行口初始化

var

lpdcb:Tdcb;

Begin

hcom:=createfile('com2'

generic_read or

generic_write

0

nil

open_existing

file_attribute_normal or

file_flag_overlapped

0);//打开串行口

if hcom=invalid_handle_value then

else

setupcomm(hcom

4096

4096);

//设置输入,输出缓冲区皆为4096字节

getcommstate(hcom

lpdcb);

//获取串行口当前默认设置

lpdcb.baudrate:=2400;

lpdcb.StopBits:=1;

lpdcb.ByteSize:=8;

lpdcb.Parity:=EvenParity; //偶校验

Setcommstate(hcom

lpdcb);

setcommMask(hcom

ev_rxchar);

//指定串行口事件为接收到字符;

end;

Procedure TForm1.Msgcomm

Process(Var Message:Tmessage);

var

Clear:Boolean;

Coms:Tcomstat;

cbNum

ReadNumber

lpErrors:Integer;

Read_Buffer:array[1..100]of char;

Begin

Clear:=Clearcommerror(hcom

lpErrors

@Coms);

if Clear Then Begin

cbNum:=Coms.cbInQue;

ReadFile(hCom

Read_Buffer

cbNum

ReadNumber

lpol);

//处理接收数据

SetEvent(Post_Event);

//同步事件置位

end;

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

comminitialize;

post_event:=CreateEvent

(nil

true

true

nil); //创建同步事件;

Tcomm.Create(False);

//创建串行口监视线程;

end;

end.

改变 ListIndex而不发生 Click 事件 -VB资料 改变 TreeView 的背景 -VB资料 改变安装向导的背景色-VB资料 改变按钮的文本颜色-VB资料 功能强大的增强列表框 ――VB6控件LISTVIEW使用指南 关闭MDI窗体中所有的子窗体-VB资料 规范设计Windows应用软件菜单-VB资料 VB建立可滚动的视区 -VB资料 VB建立可下拉选择的属性 -VB资料 VB建立无模式窗口 -VB资料 将VB5中的ToolBar变成平面的 将程序从任务列表中隐藏 -VB资料 将我自已的命令加入窗体的控制菜单栏-VB资料 VB利用 UnloadMode 来控制窗体的卸载? VB利用Form_QueryUnload询问使用者是否关闭窗口 利用VB的图片框实现屏幕的滚动 利用VB动态改变Windows显示模式的两种方法 利用VB控制窗口显示风格 利用VB实现浮动按钮 VB利用子类处理技术限制窗体的大小 奇形怪状的窗体 -VB资料 强制ComboBox弹出下拉框 -VB资料 强制和防止窗口重画 -VB资料 巧用“关于”对话框-VB资料 请问在VB中如何关闭别的应用程序窗口 确定屏幕分辨率-VB资料 让VB5支持动画光标 让窗口拒绝接受键盘和鼠标事件 -VB资料 让窗体处于最前面 -VB资料 让窗体居中 -VB资料 让所有的控件都动起来 -VB资料 有关ATL的最基础问题 怎样监控icmp包?用自编的程序 急急急急急!!!!!!!!!!,Band里的内容过长,如何让它自动的分页??? 使对话框最小化渐变到托盘区。 各位高手!!我用的是win2000工作组模式,为什么我能访问别人,而别人不能访问我呢??? 有关文件的读写问题。 大家讨论一下内存分配、释放的问题 关于在jsp中运用sqlserver的小问题!!! 怎么样可以将session的存活期限设置成“永远不死”?? 送分题,如何取得一个表的所有字段名? 那里可以下载Wrox系列书的英文版? 无法启动sqlserver的问题. DELPHI中dbgird的语句问题 关于控制动态产生Checkbox,并进行动态控问题 BCB中使用MSComm控件,无法定义动态数组变量,该怎么办?--急啊!在线等待 战神----巴蒂 两个问题! 用ADO访问DBASE数据库 百分求救:关于COM方法的reference参数不返回值的问题 请教各位高手 如何将程序中不同的查询结果写入报表? 怎样自编程序监控icmp包,应该截获什么消息,还是用别的方法? java本地化的问题(各位帮帮我!) 一个关于类型转换的菜鸟问题!! 招聘 Jpeg中FFd9可以有几个? ?????不同窗口中多个参数传递的问题,在线等待中........ 关于 EmbeddedWb 的Mshtml_tlb, SHDocVw_tlb 问题! 各位大虾 帮我翻译一下 急 悲... DBGrid为什么没有数据集记录失去焦点事件? 怎样手动和在程序中更改SEQUENCE的当前值? 怎么结贴子,什么叫FAQ? 关于“软件蓝领”的3个疑惑。 在函数中以引用方式调用结构的问题?给我能给的最高分100 怎样实现随机打印一个数据表的几个子段? 大家看看,这个功能如何实现? 怎样编一个程序读取服务器上的时间? VC工程不能正常打开? Jpeg中FFd9可以有几个? datawidgets简介!简单的问题---“送大伙一点小分” 新人到!!有问题想要问!!! 有谁知道sybase12.5中定义的所有保留字keywords? 为什么我的Tomcat突然找不到Serverlet了 关于报考程序员的问题 请问:一个应用程序发布时需要为每个发布的实例建立一个唯一标识用GUID好不好? 介绍些ActiveX/COM的好书吧! 图片的名字是中文就不能显示,怎么办 奇怪的问题关于NULL! 高分求助:pb中数据传输的问题 请教,在窗体改变大小时,有没有通用的办法,改变窗体内控件的大小,位置 怎么跑100米和200米啊?星期三就要比赛了. 地热供暖疑问《不热》我家是电厂统一供暖,5楼,83平 地热3组 把冷山墙.4楼6楼停暖 ,测量出水管温度37°现在室外温度-17°,我家室内温度15度左右,地热已经清洗.气也放了、过滤阀也清洗了.现在 谁知道如果不慎将油汤洒到衣服上,可以用什么方法除去?并说明依据原理. 致100米、200米、800米、4*200米运动员 台灯灯罩的原理学习或工作用的台灯灯罩是利用了光的( )定律将光线尽量集中照到需要的地方,因此灯罩内表面应该尽量( ) 一台单缸四冲和柴油机,每分钟转1800r,每一个工作循环燃气做的功为500J,如果汽缸的效率为30%,做这些功需要完全燃烧多少柴油?一台单缸四冲和柴油机,每分钟转1800r,每一个工作循环燃气做的功 什么是实验室反应釜?它的作用是什么? 谁会手工制作台灯的灯罩?谁会用生活中常见的材料制作台灯的灯罩,要方法简单,易学,式样别致的. revolve door是什么啥意思 最近家里蚊子特别多怎么办哦!求大神帮助 谁知道牧童这首诗是谁写的 怎么自己做台灯灯罩? 海南的蚊子为什么那么毒?被叮一下就肿起一个大包,隔天都还会痒,讨厌死叻! 哪位能把牧童这首诗的意思写出来吕岩写的 1千克的液体物质吸收了2.1×1000的热量后,气温度有25°到35°.该物质的比热容是多少?这种物质是什么? 为什么澳大利亚的蚊子这么毒阿大神们帮帮忙 a 如果不慎将油汤洒到衣服上,可以用汽油除去的原理 家里的蚊子.苍蝇从哪里来?如何才能彻底消灭它们?求大神帮助 关于铝合金箱长城包装箱怎么样 不透明体的颜色由通过它的色光决定,不透明物体的颜色是由它反射的色光决定的?举个例子!就这样! 第13频道至第68频道属于微波中的“分米波”,试着算出第68频道的波长范围就知道这个呼称的原因了. 铝合金箱长城包装箱? 没财富了 但是希望高手和懂汽车电路的来小弟之前改了大灯 不是总成.Q5透镜远近光氙气灯 以及天使眼泪眼.之类的 后来感觉不妥就全部拆除了剩下氙气灯现在残留一些疑惑需要大家帮忙1、 阅读短文,回答问题:为了满足人们对能源不断增长的需要,科学家们设想在空间建立太阳能电站来利用太阳能.这种空间太阳能电站建在地球同步轨道上,其工作过程如图所示.在太阳能收集 理想气体的基本定律有哪些?其内容是什么? 奇特的电子生物第一段有什么作用? 光学波长频率的计算红光在水中的波长和绿光在真空中的波长相等,水对红光的折射率是4/3,则红光和绿光在水中的频率之比为?我要过程,和解释? 《牧童》表达了什么情感? 脂质具有生物学功能的是什么 微波属于?,但其波长较短,频率较高. door是什么意思? 免疫系统具有哪些功能,正常或异常时有何生物学效应? 书上说:“体系只做体积功而不做其他功时,恒容反应热等于体系热力学能的变化”.那我有个疑问,它说是只做"体积功",做体积功是要变体积的,但又说是"恒容反应热",但"恒容"又是不变体积的, 台灯的灯光,透过灯罩开口射出后的状况 led台灯灯罩材料有哪些? 汽车无极变速器(CVT)它的原理是什么? Q(热量)、T(热力学温度)、V(系统体积)、W(功)、ρ(密度),其中属于状态函数的是 双灯罩台灯灯内外层灯罩分别有什么作用 火电厂中什么气体可看作理想气体?什么气体可看作实际气体? 塑胶熔点与阻燃性的关系 door是什么意思 卧式反应釜的加热系统如何做恩?说说啦 牧童这首诗中抓住什么进行描写 当扶手拖拉机上的柴油机出现故障而使转速急剧增加时,正常的操作已经不能使它停转,下列应急措施中,可行的是:A.捂住进气口B.立即找一个隔热的东西,捂住排气口C.脚踩刹车板,同时手拉制 应该是溶解度单位.还有这个Ncm3/g?不知道那个3时不是个上角标.n为什么要大写! 举例说明古今声调的关系(文字说明,从古声调至今声调,再从今声调至古声调) 一台单缸柴油机,飞轮每分钟往返转动3000转,那么柴油机每秒钟曲轴往复100次, 我400米59秒 800米2分20秒 请问我100米.200米正常应该跑多少?我400米59秒 800米2分20秒 请问我100米.200米正常应该跑多少?我14岁 175cm 60KG注 我短跑不是很厉害 家里地热的问题 供暖我家是复式的房子 家里都是地热 现在发现 一到供暖的时候 楼下的地热就自动过水 自动循环的流动 但是楼上的地热却是都是空气 把空气放出去 就能听到水在流动 学习或工作用的台灯上有一个灯罩其作用是利用光的什么定律将光线尽量集中照到需要照射的地方,因此灯罩内表面尽量什么? 若不慎将油汤洒到衣服上,可以用什么办法出去,说明依据的原理-_-|||高一化学.. 离子浓度大小判断,D选项哪里出错呢?.A选项感觉也不对,A选项对吗?麻烦详细解释 《牧童》这首诗是什么意思? 汽车变速箱中的齿轮是一档齿轮大还是五档齿轮大? 什么是地热供暖 牧童这首诗的意思是什么? 鼓怎样改变音调 音调的单位是如何定义的 如果不慎将油汤洒到衣服上可用什么方法除去说明依据的原理
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘