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

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.

打造最佳开发团队的几点建议 Facebook与开发者交恶 扼杀第三方应用 负载大逃亡:四十二路怪兽联军及七条逃生法则 那些年,MIT技术男们奇妙的黑客作品 深度分析:腾讯3.3亿美元收购Epic股份值吗? 传下一代iOS或将推行扁平化设计 iOS开发者注意:苹果将拒绝访问UDID的应用上架 领先Google、Amazon、Dropbox,Apple云存储用户最多 传IBM重新设计晶体管 预计五至七年内成熟 快讯:云计算大会6月召开 云计算概念企业股票飙升 集成开发环境:Qt Creator 2.7.0发布 移动周报:“今日头条”CEO,爱冒险的技术宅 从China Daily的iPad版,看中国纸媒如何摆脱“旧情结” 天睿推出大数据探索平台:“开箱即用”的数据分析 Basho开源Riak CS,与AWS S3兼容的云存储架构 MongoDB Days北京杂记 VMware携手亿阳信通 铺垫混合服务 行业应用,移动优先:移动难七大痛点剖析 HTML5开发必备:游戏开发资源合集 老而弥坚:65岁传奇Android工程师谈开发 2013中国云计算有奖大调查,每周大奖等你拿! Google Reader之死另一个不为人知的原因 小团队谈推广:豆果、金山、微博易、面包旅行 敏捷实战:如何让团队迭代交付周期缩短一半 移动设备管理初创公司AirWatch:首轮融资2亿美元 New Relic:不等应用崩溃,实时监控你的App! Zynga力挽狂澜三步棋:移动+授权+自有网络 巧用MapReduce+HDFS,海量数据去重的五大策略 革自己的命?为带来一致体验 IE11伪装FireFox 最古老的Linux发行版Slackware以及Arch Linux齐弃MySQL JEECG v2.3 发布,基于代码生成器的智能开发框架 如何用脚本动态的生成一个新网页? 如何做出象DELPHI中的菜单在ControlBar1中的样子? 急·!!怎样能把磁盘上的文件删出一行 有关多字段排序的问题? 什么是发布与订阅? 1、五一节快到了,大家打算怎么过啊?:P 我从网上Down下一个VB的事例,但是窗体上控件的位置没法移动??? 如何在访问不同域的COM+服务,如何配置? 求购CRM源码(delphi) 我写了一个exif读取的程序,欢迎大家热心测试,给出好的建议的赠送代码 2、五一散分帖,收集一些东东。 问个弱弱的问题! 帮忙了,谁有XP的序列号? 一个很菜的问题,求助!!! 超时已过期错误提示问题 河北保定,转让大量C++世界经典。 关于控件堆叠的问题 session的问题 今天发工资,太少不爽,大散分,谁要是能帮我找一个挣钱的私活,我给他200分(令给) 请教数据库! 请教有关对话框的问题? 3.五一散分帖,我一个朋友说。。。。。。。。 高分相求:JBUILDER8 Enterprise 版,或下载地址。 怎么才能获得editbox的值 请问rasWinGod 这个控件如何用!(在线等待) 请问如何用CB生成可以在集成到网页上的activeX控件?急阿........ 如何把用逗号隔开的字符串赋给一个数组? FileView下的External Dependencies里面的.h文件是什么?! 请问如何在数据窗口中显示记录序号 怎么看自动生成的Makefile到底做了什么?紧急总动员,满分,在线等待 回答我问题 今天打开邮箱,竟然没有lj邮件,感动ing,散分ing 4、五一散分帖,问问题。:) 单击一个TreeView发生一个事件!我想显示? informix小问题 求一个存储过程,sql server 2000 大家好,请高手赐教,有关在应用程序中如何打开并编辑Word 文档??急需 如何在文本文件中查找一个串 100分,如何安装sturts?解决马上送分 求急! JMAIL组件的收邮件附件的问题,请熟悉JMAIL使用的帮忙看看。 高手请指点..急呀..在线等... 请问怎样固定一个窗口的大小? 请问用正式版能不能修复已过期的sql server 试用版,让它重新启动起来? Asp.net怎麼執行存儲過程﹖是不是用存儲過程執行就不會出現臟數據﹖ ERWin是个什么东东? 键盘响应(F1) 怎么样把一个目录的权限完全给指定的user? 分布式数据处理问题-Sqlserver 开发人员请指点!! 判断数字问题 谁有刷新隐藏帧的例子? 请问世界上哪个国家的人,最爱对别人说三道四、指手画脚? 邻居之间围墙高度有规定吗 对共青团的认识 桃花水母能吃吗? 为啥动物的嘴那么长 人的嘴那么短狗和鳄鱼这样长嘴巴的动物 我用两手把它们的嘴巴抓住 让它们张不开嘴 它们还能咬人吗 吃一斤鲨鱼肉等于吃掉了几斤普通鱼肉?鲨鱼每天都要依靠吃小鱼来长大,被鲨鱼吃掉的鱼肉,远远超过鲨鱼本身的重量.大白鲨长到四米长时,吃掉了比它自身几倍的食物? 桃花水母是什么,它吃东西吗 宇宙有多大,有边缘吗宇宙有多大,有尽头吗,要是有,那么尽头外面是什么?为什么宇宙怎么虚无缥缈.另外问问大,小有没有界限? 照样子写词语,例:人如海 深远 影响霉国经济 的历史人物有多少?在什么时期的什么事件 或者叫做方案 和实施结果 宇宙究竟有多大,它有边缘吗? how happy we are_____each other in washington!wo have hardly ever met in shanghaiseeingto seesaw seen 中国是否降临经济大灾难? 宇宙究竟有多大?宇宙的边缘在哪里?宇宙外又是什么样的洞天? Q1、Q2为两个被固定的正负电荷图所示,Q1、Q2为两个被固定的正负点电荷,在它们的连线的延长线上的a点,电场强度恰好为零,现把另一正电荷q从b点移到c点,该电荷的电势能将(  )(A)不断 白令海峡正中间那块岛,是霉国的还是鹅国的?感谢1楼的回答,但我指的是白令海峡最狭窄处正中间那块芝麻绿豆大的小岛? 明天大风降温是描述天气的吗?但是 还有个气候啊 昆明四季如春呢?是不是一天以内就是天气啊 2天以上就是气候? 若在A、B的连线上放一电荷q,恰能使q1,q2,q三个电荷都处于平衡状态,试确定q所带电荷量及所放的位置?无图 大拉杆是如何承受内压推力 在 钢铁是怎样炼成的 中 保尔因什么原因加入共青团?又应该怎样描写他的朋友们? 钢铁是怎样炼成的第一部中保尔认识了哪些人,保尔的形象是怎样的 Below the mountains ,the sunshine reflcts on the many lakes,-----them shine like diamonds--therich countrysideA.make ,inB.to make ,onC,making ,in D.making,against选什么? 请问各位兵圣裔胄们,孙氏乐安堂中的“乐”字的读音. 用一电阻接在电路上,15分钟后加热一物品.用同一电源在另一电阻加热用10分钟.如果两电阻串联接在同一电源上,要用多少时间加热同一物体 压铆螺母的扭力推力 多少卡路裏等于1斤脂肪如题 多少卡等于1脂肪?人一天最低消耗多少卡?(不动的情况下)一个苹果25卡 一天吃8个 等于600卡.那么要多少时间才减50斤回答清楚 我加分(我每天都要做很多劳动 浩瀚如海的意思 活塞为什么要设立主推力面和次推力面? 保尔.柯察金一生中最重要的三个女人是谁? "只有虚怀若谷,才能吞云吐雾,只有浩瀚如海,才能不择江河"这句话是什么意思?我大概了解了一点点,但我想具体了解下... promise I always by my sun like the sunshine we and see allright 某住宅的平面结构如图所示(墙体厚度不计,单位:米)(1)该住宅的面积是多少?(2)该房的主人计划把卧室以外的地面都铺上地砖,如果他选用的地砖价格是30元每平方米,那么买地砖至少 我没有立堂口,但我会说上方语.自己说的什么还不知道,管不住自己的嘴这是为什么 反推力是什么意思 请教机械传动的效率,最好说明单级齿轮传动和多级齿轮传动的效率 妈妈说我 失去了自我 把自己给丢了 说我把自己给丢了 自暴自弃 我什么都丢了 把自己都给丢了 我什么都没有了 难道我以前那么的坚持那么的执着就曾有过么 我还是没有 只是一直在挣扎 carry out,pick out,look out,work out的区别 为什么肾小球滤下的物质中会有蛋白质,蛋白质不会消化成氨基酸后被吸收了吗? 无口受是什么意思啊? carry out 和work out区别 液力变矩器坏了有什么现象 一个关于糖酵解的问题据总结,从葡萄糖算起,共生成4个ATP,分别在生成6-磷酸葡萄糖和1,6-二磷酸果糖时各消耗一个ATP,所以净生成2个ATP.我的疑问是:在生成1,3-二磷酸甘油酸时没有消耗ATP吗?如 work on 与carry on的区别? 液力变矩器效率90%机械效率只有45%不知道对不对那位大侠能告诉我啊谢谢 妈妈说,有些事情真的不要说得那么明白,不然就没意义,但是不说明白会失去很多? carry on your work这句话对吗,错的话错在哪?the answer is carry on with your work 在机械传动中传动效率最高的是? 仿照苍山如海写词语 过点M(3,-4)且在两坐标轴上的截距互为相反数的直线方程为 选择泵,助磨剂泵,助磨剂弱酸性.作用加压,流量小,输送距离长.管道口径小,32的ppr管不要计量泵.提供型号与参数 大嘴巴的新专辑《王元口力口》是什么意思? 我的爱像尘埃散落在边疆地带不再对谁期待而许诺像尘埃不断被时间掩埋是甚么歌拜托了各位 水泵比水池高1米,水平距离约30米,用一寸的管道,自吸喷射泵加引水/长时间的抽,怎么也抽不上水;把泵换回另一根原来能上水的管道,也抽不上来了.是否长时间不上水空转把泵给抽坏了?1米高/ 大嘴巴的新专辑《王元口力口》是啥子意思? 邻里围墙问题我们是在农村,我们家和邻居家之间有一条路(我们家西边,他们家东边),当初他们家打围墙的时候把路给打进去了,并出具了证明的协议.现在我们家打围墙,为了让父亲的车能开 楼顶有储水池,全自动管道自吸增压泵与无塔供水器的区别 大嘴巴的新专辑(王元 怎么读?. 桃花水母的生活习性是什么?该如何饲养?桃花水母吃什么?如何繁殖的? 关于农村邻里间的围墙高度有什么规定吗?我家要造围墙,可我邻居不让我造高,他说挡住了他的采光了,请问农村邻里间的围墙高度有什么规定吗? 我对共青团的认识越少越好,一定要少!多了就要骂娘了啊~ 英媒:中国“由陆向海”战略面临三个挑港媒:中国令人垂涎又无人问津的公务员前美国国安局长“私聊”遭邻座“直播”新媒:新加坡是中国的“特殊而重要的邻俄罗斯专家:美国例外论在多极化世界难美国电视荧屏常可看到公开对中国人侮辱男子沉迷网游称是因为老婆太能干传蒙古总统将访朝 是金正恩时期首位访美恶妇险扯断幼儿生殖器用胶粘合 面临英国首个“音乐试管婴儿”诞生 狂爱听探访朝鲜志愿军墓 中国老战士和烈士家我国海军三大舰队首次在西太平洋展开实新消法规定网购7日内可无理由退货两男子甬台温高速上拦路称搭顺风车趁机90后男子酒后加无证驾驶千黄高速上丧衢州一处通信基站屡屡爆表牵出电信诈骗温州一名电镀厂老板直排毒性很强的废水80后忧郁男杭州同时骗3名单身女子1丽水男子从废弃X光片中提炼白银10余故宫员工杀2名同事后自杀未遂 警方未新快报记者承认受人指使收人钱财发表失斯诺登:曾是美国情报间谍 将向俄申请最高检:未成年人犯罪趋于低龄化 部分全智贤性感礼服遭批:让人联想到床单(双面东南亚姚劲波现身古城:创业如同做人 58同他大舅他二舅都是他舅 陕西童谣你知多日本一油轮近海失事 3人受伤1人下落有人去韩追星有人手术 许仕仁案陪审团袁占亭会见美国新墨西哥大学副校长兰州:记者实地踏访发现 黄河边仍有污兰州事业单位分类改革全面启动兰州市环保局:细化完善管理办法亚洲合作对话 丝路务实合作论坛侧记兰州市级机关单位办公用房将实行统一物《兰州新观察》关注七里河区惠民活动兰州市环保局针对个性突出问题认真整改亚洲合作对话 丝路务实合作论坛昨举行兰州市环保局多形式畅通群众投诉渠道/台湾民意代表建议当局发粽子券 助弱势毒犯骑车躲避查缉 “铁人所长”跑步狂13岁印度女童从北坡登顶珠峰 成最年
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘