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

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.

为移动而设计:交互设计篇 小米游戏中心月度报告:极品、神庙、找你妹 中科院:常温下的液态金属电路3D打印机 细数IE10里的HTML5特性 使用Twitter Bootstrap的五大理由 Twitter重塑API战略 开启V1.1时代 Sony开放SmartWatch 支持第三方定制固件 甩啦甩啦!Apptopia帮开发者在线买卖App所有权 聚焦全球移动市场:印度,这块肥肉不太肥 Google决定明年一月份停止对Chrome Frame支持与更新 你应该关注的几个Eclipse超酷插件 华为王丰:FusionCube打造下一代融合一体机 上海云人联合创始人吴朱华:中国人也能做出最好的实时数据库产品 Facebook RSS替代Google Reader?或因其社交属性失败 让这么多国外开发者如此兴奋,iOS 7到底好在哪里? Web开发中那些不招人“待见”的功能 最好的超级计算机在中国 为开发者提供的10款Web应用程序 5000万次下载:HandyGames如何征服Google Play? 红帽大战Ubuntu:750小时免费企业版红帽套餐即将登陆AWS EMC Sanjay Mirchandani:92%虚拟化,使更少IT人拥有更大交付能力 从NSA携谷歌、微软等9家名企监控用户行为看数据安全 【专访间】新科兰德创始人左磊:我们的“卖点”是“数据弹药” 甲骨文公司宣布推出最新Java EE 7 10款最佳CSS/jQuery开源图片说明 创业者应避免对投资者说的五句话 直接拿来用!最火的iOS开源项目(二) 西部数据Pat Wilkison:云计算市场是创新热点 猎豹浏览器发布手机版:PM谈开发理念 成为伟大开发者的“九步曲” 使用GPU构建更便宜的Google神经网络 如何去掉调用Dll在任务栏产生的图标 ORACLE 8的企业版可以糽一台PC上吗? 急救!1000块钱由1分,2分,5分,1角,2角,5角,1元,2元,5元,10元,20元,50元,100元的任意组合,可有多少种组合? 我的电脑有两个内存条(不是一种型号),今天用优化大师优化了一下,结果出现不能启动的现象,请问各位高手如何解决????? 如何在98下设置默认浏览器? to 吴文智 先生 怎样用Adaptive Server Anywhere6.0发布网络版?PB菜鸟求救.... 我的电脑有两个内存条(不是一种型号),今天用优化大师优化了一下,结果出现不能启动的现象,请问各位高手如何解决??? 菜鸟问题,CString 如何转化成整形 !!!在Delphi中不规则窗体的快速显示??? 我的电脑有两个内存条(不是一种型号),今天用优化大师优化了一下,结果出现不能启动的现象,请问各位高手如何解决? 请教大侠!!!!vb调用com组件方法时传递参数类型的问题 updatesql出错: 在java中如何生成可单独安装运行的应用程序呀?就像.exe一样! 请问有没有关于C#的源代码或资料的网站呢? 怎样定位access数据库的路径? 在32代码中调用过16DLL的高手请进! 高分请教!!!!急请大侠帮忙!!!!!!!!!!!!!!! 我的电脑有两个内存条(不是一种型号),今天用优化大师优化了一下,结果出现不能启动的现象,请问各位高手如何解决 -???? 请大家出谋:朋友要离了,怎么安慰她? pfc问题 jin_shan(DOS)请进来看看,谢谢!! 大家平时玩什么网络游戏?请留下ID和擅长的游戏(玉笛书生有偿调查) 请帮一个忙? 怎么样在程序里注册OCX控件件? 奇怪,为什么我的电脑在死机后重起就不能浏览我写的asp页面了 各位,我現在到這一步了,下一步要做什麼 怎样把一个 Frame 窗体放进一个Penal 中??? 我编了4年程序,可是我在这里的提问没有一个人的回答让我满意!!!! 搞张jbuilder6破解? 特殊字符串查找 请问Win2k pro的Inetinfo.exe进程怎么占用CPU达99%呀?怎么解决呢? 自由自在的人,你在吗? 后缀是nlc的电子图书那里找? 请问vc里缺省参数的函数是怎么定义的?(70分) 救救我!!!数据库管理的几个基础问题?? 急需控件 请教一个关于CListCtrl的问题??? c语言实现"智力游戏" --? Redhat下设置环境变量 我的帐号被盗了啦!!!!!!! select max(count(*)) from table group by aa这个意思的语句该怎么样写? 在SQL SERVER7.0中如何实现类似于ORACLE中的CONNECT BY实现的树型查询? 这里都是些菜尿,吗的没有一次我的提问有人给我解决的! 为什么我的问题没人响应???????? 隐藏FORM的API,谁能提供? 谁知道 jdbc-odbc数据库连接是否要装jdbc程序 哪位大峡知道MetaTools公司的Photo Soap下载网址??? 数据库打开问题? 为什么会出现 Capability not suported???? 请教高手们一个在天极网没人能回答的问题,认真做答者有分 “必需氨基酸需要量模式”是什么意思? 月球的朔日,一般在农历每月的什么时候? 地球上的物体到月球上后的重量只有地球上的6/1,月球上重120千克的物体,在地球上重多少千克? 必需氨基酸有哪些?非必需氨基酸有哪些?必需/非必需氨基酸是怎么定义的?最好都列出来。 爷爷关心我作文,400字左右,急 物体在月球上的重量大约等于地球上重量的六分之一,如果一袋视频在地球上比在月球上重90千克.问:求这袋食品在地球上的重量? 非必需氨基酸的概念 爷爷关心我作文400字以上,很急,不要吵的 我的理想作文400字!急 热爱生命的作文450字急! 为什么阴历每月初七前后太阳,地球,月亮的相对位置才能构成一个三角形(为什么只是初七前后) 月亮大还是地球大 关于写花的作文450字.快————明天就检查啦.最好是菊花 一种树的皮,可作为中药,又可作为食品香料或烹饪调料,这是什么树皮? 地球有没有月亮大谁大 月球进入地球的___区,使得月面变暗的现象叫月食. 日食和月食的时候,太阳,月亮,地球的排列顺序是怎么样的?日食和月食的时候,太阳,月亮,地球?KKKKKKKKK 关于调味料(香料,香辛料.)和中药比较我想买调料,比如八角,小茴香,白芷等.但去中药店看了以后发现和卖调味料的不一样啊.中药店的中药味特别强,怕做出来的食品有中药味,但去调味料那 月食是什么情形,太阳,地球,月球三者如何排列 月球______和地球_______的综合效应是形成日食和月食的成因. 求作文 《 家乡的春节》或 《难忘的春节》200字 1、发生月食现象时,地球、太阳和月球三者位置排列关系可能是( )如题A、太阳、月球、地球 B、月球、太阳、地球 C、月球、地球、太阳 D、地球、太阳、月球 日食和月食是光沿直线传播最有说服力的自然现象,日食的影子在太阳上,月食的影子在月亮上,日食和月食发生时的光源是( ),发生月食时,地球挡住了太阳;发生日食时,( )挡住了太阳 求一篇国庆节的作文300-400字 人体内必需氨基酸有多少种? 假如我是什么450字作文 要写一篇庆祝国庆节的作文!300字到500字左右! 兔子作文290字 假如我是..作文,450字左右假如我是什么..可以是校长、什么的题目最好新颖一点450字左右450字左右 关爱作文300字 一个天真的人作文290字 求的作文.450字以上要一般人想不到的. 爱心作文300字及~~~ 放风筝作文290字左右 作文假如我是爸450字 有草莓/樱桃香精的化学成份表吗? 一篇300字关于动物的作文快急用. 世界上为什么会有太阳,地球.和月亮? 为什么牙膏里都有化学香精?这是什么成分? 描写动物的声音,外形的作文300字 人喝醉酒后,为什么会站不稳? 我家乡的春节 作文600字 我爱我家 作文 300字 某人喝醉酒后,走路摇晃,站立不稳是由于酒精麻痹了脑的哪一个部位? 以{家乡的春节}为题目 写600字的作文 我爱我家的作文 350字 酗酒是一种不良的生活习惯.人喝醉酒后,走路摇摇晃晃,站立不稳,这是由于酒精麻痹了___ __;心跳和呼吸频率异常说明酒精麻痹了__ _;发生语无伦次的现象,这是由于酒精麻痹了大脑皮层的__ _ 家乡的春节作文600字十五分钟以内! 我爱我家 作文100字左右最好详细写一件事 春节作文700字怎么写? 急!帮帮忙吧!谢谢! 为什么每年的农历8月15日是中秋节为什么每年的农历8月15日定为中秋节?要简短一点的,最好是压缩版(4、5句话)的~ 我爱我家作文300来字,急! 爷爷对我的关心作文500字一篇5年级作文要求500字写得好给20分 芝麻油香精制作配方?用什么合成的? 半必需氨基酸的概念 800字作文 “我在关爱下成长” 我的理想 作文 400字要写清楚自己的理想是什么,要写清楚为什么有这样的理想 ,以及准备怎样去实现自己的理想,明天要交了 速 不要抄来的 必需氨基酸指数的定义是什么?是"必须氨基酸指数"不是"必需氨基酸" 春节的作文怎样写400字左右 某航天英雄在月球上重六分之六十一千克,相当于地球上重量的六分之一他在地球上的重量是多少千克?最好说明单位1
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn