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

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.

移动周报:两岸三地在线编程学习网站大搜罗 有道周枫和他的“放养”团队 看IE11如何助力AAF推动公益事业 SUSE总裁Nils:将SUSE Cloud 2.0打造成“零影响的云安装程序” Windows 8之父Steven Sinofsky:2014年科技界的十大趋势 电视盒子还没智能化?看Fan TV们怎么玩 畅游启动“必赢计划” 十亿巨资代理优质产品 数据控使用Hadoop的三种最常用方式 值得创始人学习的五大企业文化管理方式 圣诞节快乐:来自程序员们的问候 宏碁任命新CEO Jason Chen:曾任职英特尔14年、台积电8年 史上第一次越狱发布会与Evad3rs太极助手罗生门 新东方在线CTO曾明:已用Cocos2d-html5开发出150余款产品 Facebook 2013年的9个开源项目 开源力量公开课2013年度庆典:我们的开源项目 看雪学院“走进企业看安全”活动走进安全管家 视频+PPT:苹果iOS7 Tech Talks大会演讲内容 iPhone 6和Galaxy S5暂不会采用弯曲屏技术 当程序不工作时,开发者常用的借口 携程技术副总裁叶亚明:三次重大技术改进的故事及背后原因 Google抛弃C语言,采用Go语言重写Go编译器 jQuery Mobile 1.4.0正式版发布,着重性能改进 IBM收购Aspera加速大数据传输 各式各样的极品程序员,你属于哪一种 Google员工离职前必做的14件事情 GitHub上最火的开源项目及编程语言是什么? 2014的12个大数据趋势:Hadoop继续升温,R将进入主流 研究称三星手机可能存在安全漏洞 初创IT公司里开发者最容易犯的九种错误 还有多少开发者在为IE6做兼容性测试? 解读华三“新IT易之道”理念下的云计算和数据中心 请大侠帮我解决一个数据库的问题 请问如何操作分布在两个数据库中的表数据? 寻求合作(有关车间数据采集):谁要MONEY? 请问哪里有有关COM原理的Ebook可以下载???? 有谁能够告诉我有关网站发展历史的资料么?世界上第一个网站是怎样建成的?以后的发展脉络呢?如果有谁能够相告不胜感激啊。 讨论:可视化开发XSLT的工具!! 如何使用VC进行“毫秒级”以下的 定时器。即(xx uS 的定时器)。。。。。。。。。。。。 看电视(转载) jsp比asp,php等好么?(在线等候) 怎样实现图像的自动拼接? 报表输出问题 我用ActionManage做出的菜单为何汉字显示总是最后一个字少半边? c#里如何使用shbrowseforfolder?那位兄弟给个例子 如何实现MAC和IP绑定。 帮帮我啊,老大们我真的很急谢了 session问题?????? 报表输出问题 你愿意吗? 关于PB中做VFP的ODBC的一个问题 我为什么不能提问? 在PASCAL语言中的"集合"概念,转化到C语言中,该怎么实现? 帮我看一下这个程序. 谁人发个QB的编辑器给我? 如何改变应用程序的图标 网吧管理 帮我看一下这个程序. 谁看谁头疼的问题!你除外! 请问JDK和J2SDK有什么区别? win98 转 win2000出现的问题,急,再线等候! 停止函数执行 请问如何在鼠标点击xx button 的时候获得 JtextField 中的文本输入--有重分送 我不能关机了!救救我哟~~给你分! tomcat4.0.1无法启动的问题 SoS!俺用fireworks做了一套菜单,但是应用于框架结构中时,只显示菜单所在框架的部分菜单。也就是说菜单显示不完整,如何能够让菜单跨越 刚装了REDHAT 7.2,不知道网络怎么设置 报表打印,望各位指点..... 是不是我这里设错了? 菜鸟有问题,Win2k的定时关机程序 关于天数累加的问题 webbrowser控件问题? 421连续进纸标准,打印问题,难啊,难 有个小问题难住偶了! 请教 bdf 文件的格式 在JPrint中如何设置页面的打印范围(不使用打印机的默认打印范围),找不到例子,那位能够给个实例。。。 开发jsp需要什么环境和安装软件,目前版本为多少? 在PASCAL语言中的"集合"概念,如何转化成C语言表示 怎么回事。formshow 不能写太多sql语句么〉?,怎么不显示?大家快帮看看,急死了 自动累加的问题?(100)我只能给这么多了 哪里可以下载powerbuilder7.0 网页自动累加的问题(100) help 数学中√表示什么啊 如图,在以O为圆心的两个同心圆中,AB经过圆心O,且与小圆相交于点A,与大圆相交于点B,小圆的切线AC与大圆相交于点D,且CO平分∠ACB.(1)试判断BC所在直线与小圆的位置关系,并说明理由;(2) 用狐狸,小山羊和小白兔. 我想问下数学中“^”代表了什么 如图,在以O为为圆心的两个同心圆中,AB经过圆心O,且与小圆相交于点A,与大圆相交于点B.小圆的切线AC与大圆相交于点D,且CO平分∠ACD.(1)试判断BC所在直线与小圆的位置关系,并说明理由.(2) 用小白兔,胡萝卜和山羊编童话故事 500字 火车转弯向心力如何得到 角铝规格6*60*60,长度是2636,怎么计算价格啊? 40(?)+20(?)=1(?)填单位! 3(4):火车在转弯时 受向心力作用,对其所受向心力分析正确的是( )B.主要由于内外轨的高度差的作用,车身略有倾斜,车身所受重力的分力产生了向心力请问上述B选项分析是否正确?为什么? 刺猬汉斯是-----国作家-------写的————(体裁)我还读过他们其他的童话,有,< > 《 》《 》等. 一棵树高20( )填单位 火车转弯时的向心力类型问题真心不会 刺猬汉斯的主要内容是什么? 若二次函数y=f(x)的图像经过原点,且1≤f(-2)≤2,3≤f(1)≤4.求f(2)的取值范围 /在数学中代表什么? 刺猬汉斯讲了几件事,都什么事? 分米的英文符号是什么? 在数学中∧代表什么 《刺猬汉斯》是《格林童话》写的. 改病句 若已知二次函数y=f(x)的图象过原点,且1 ∧这个在数学中代表什么? 刺猬汉斯帮我分段啊! 分米的符号怎么表示? 解释一下火车转弯时外轨和内轨等高和不等高时向心力分别由什么力来提供 【高中物理必修二向心力】火车最佳速度问题中 重力和支持力的合力等于向心力;那么摩擦力呢 是不是没有办法算 所以算这个合力只能通过重力算 不能先把重力正交分解成支持力和静摩擦 会计判断题 1.“短期借款”账户不核算应支付的借款利息.2、银行借款不论期限长短都必须按期偿还,并按规定支付利息.3、企业计提固定资产折旧时,应借记“累计折旧”账户,贷方“固定资产 猴子的屁股为什么是红的写一篇童话故事 为什么火车拐弯时,支持力所提供的向心力是水平的而非其他方向?火车拐弯时除前进方向还有其他摩擦力吗? 求这些会计的判断题答案,最好能说明错在哪里 1.用银行存款去归还银行贷款,属于“一种形式的资产减少,引起另一种形式的负债减少”.2.按会计核算原则,凡是支出的效益仅与本会计年度 汽车转弯时的向心力是静摩擦力提供的,静摩擦力的方向应该是与相对运动趋势相反,而汽车转弯时若不受外力则物体会沿切线方向继续运动,可推的其相对运动趋势应为其切线方向.那为什么静 豆浆里的油条打一歇后语.提示是两个字的. 点A在半径为1且圆心在原点的圆上,且角AOx=45度,点P从A点出发,逆时针等速沿着单位圆旋转已知P在1秒内转过的角度为M(0度 在恶补微积分,我目前大一,希望高手们求救!有什么用的?怎么很多式子都有? 如今的专家些,牛奶和鸡蛋,豆浆和油条都不能搭配!那娃娃现在早餐还能吃啥呢? 如图,在平面直角坐标系xoy中,直线AB过点A(-4,0),B(0,4),圆的半径为1原点为圆心,点P在直线AB上,过点P作圆的一条切线PQ,Q为切点,则切线长PQ的最小值为? 在数学上面X代表什么意思 数学速度是用v表示吗? 如图,以原点为圆心的圆的直径AB= /代表什么数学意思 V代表什么? 如图,在平面直角坐标系中,半径为1的圆的圆心O在坐标原点,且与两座标轴分别交于A/B如图,在平面直角坐标系中,半径为1的圆的圆心O在坐标原点,且与两座标轴分别交于A、B、C、D四点,抛物线y=ax 《时间老人与穿衣镜》是童话还是寓言? v是在古代数学中代表几 童话故事,200字左右的 时光老人与穿衣镜时光老人和穿衣镜明亮的穿衣镜四平八稳地立在过道里,来来往往的人们都向她投去亲切而期待的目光,她总是忠实地反映出人们的容貌和衣着.一天,时光老人路过这里,镜子 小性人怎么交往 跨度9米,用那种规格H型钢能承受10吨的重量柱子与柱子距离是9米,上面铺导轨,10T双梁起重机在上面跑.H型钢用多大16T天车 ,柱子与柱子距离是9米,9米的跨度轨道梁应该是多大的,上面是16T天车 时光老人与穿衣镜的问题答案 已知:如图,圆心C过原点,并与坐标轴分别交于点A,D,∠OBA=30°,点D的坐标为(0,3),求点A,C的坐标求点A,C的坐标 如图在以O为原点的直角坐标系中,点A,C分别在X轴,Y轴的正半轴上,点B(a,b)在第一象限一四边形OABC,反比例函数y=分之k(k>0,x>0)的图像与AB相交于点D,与BC相交于点E,且BE=CE(1)试说明:BD=AD(2) 时光老人和穿衣镜告诉我们什么道理 买2根油条1杯豆浆一共8元4角钱,油条上涨50%豆浆上涨20%一共9元6角钱. 以平面直角坐标系的原点O为圆心以1为半径作圆若点P是是该圆上第一象限内的一点且OP与X轴正方向组成角R则点则点P的坐标为 《时光老人与穿衣镜》的读后感在1月10日之前我万分感谢. 解决几道判断题,顺便讲解一下对或错的理由1、将一个半径为rcm的圆形纸片切割成若干等份后拼成长方形,长方形的长是π rcm ( )2、r的平方=r×r=2r ( ) 如图,在以O为原点的直角坐标系中,点A、C分别在x轴、y轴的正半轴上,点B(a,b)在第一象限,四边形OABC是矩形,若反比例函数y=k/x的图像经过ab边的中点f,交bc边与点e (1)求证be=ce(2)若四边形oe ⊙在数学里代表啥 1、准确数18精确到个位,2、四舍五入奖3.995精确的百分卫是4.00 市场营销判断题~无差异性市场营销战略完全不符合现代市场营销理论.市场定位、产品定位和竞争性定位分别有不同的含义.企业在市场营销方面的核心能力与优势,会自动地在市场得到表现.
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘