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

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.

云计算如何影响数字化营销? 榜单:十位帮我们打理数据的存储大佬 OpenStack Grizzly版发布 Comcast、CERN成为新会员 谷歌携Blink来势汹汹 WebKit将成明日黄花? 星巴克与苹果合作 顾客可免费下载付费App 微信回应信令争议 将启动2.5G网络优化计划 凤凰网CTO吴华鹏离职 先后供职长达10年 外媒:开发者每周编码时间仅19.1小时 AppGratis CEO现身说法:应用被苹果儆杀始末 一个Web设计师眼里的云计算 戴尔高管:服务器业务领先惠普五年时间 Hoodie:基于JS与CouchDB的超快速Web开发框架 设计优秀API的五大规则 盘点英特尔IDF2013第一天:技术产品新趋势 英雄组队去打怪!Nimble Quest开发团队访谈 云通讯平台打造本土Twilio 被逼无奈?传微软或明年秋发布iOS和Android版Office 欧洲各国政府将向大众开放公共数据 访联想云存储罗予晋:优化MooseFS,共建生态系统 磊友创始人赵霏:关于HTML5与Flash争执之我见 国际混乱C语言代码大赛优胜作品详解之“A clock in one line” 揭秘程序员大脑编程的七大“误区” 从Java到ObjC语言的桥梁:谷歌J2ObjC 0.7版本亮相 数据库管理系统ParElastic:打破常规 扩展云端MySQL 谷歌苹果专利纠纷意在战略无意和解 美法官为其苦恼 Facebook收购神秘移动软件创业公司Osmeta 修改驱动,使用Erlang+VoltDB实现每秒87.7万事务 横评美国IaaS“8匹狼”:AWS、GCE、Azure、Rackspace、SoftLayer、Dell、HP、Joyent 独立游戏精神释放的舞台:IGF China 2013作品火热征集中 三款热门入门级在线编程教程对比 微软modern.IE:网站兼容性测试利器 急需foxpro for win版,哪有??? 请教一下,ado.net里如何返回表里的行数? 如何在HTML页面中使用 Acrobat 的 PDF 阅读器控件 关于一个遗传算法得问题!! 请问一个TSR问题! 关于跨数据库查询的问题 请问在ListBox中可不可以将每一行字符串设置成不同的颜色? vb6.0中如何将dbgrid里的内容添加到数据库里? 请问怎样才能将窗体上的最大化按钮设置成无用,而保留最小化按钮? 各位专家:请问win2000 PRO 下的config.msi目录中的好多以rbf为扩展名的文件是什么文件?有什么用?可以删除吗? ASP.NET中DATAGRILD的烦人处 新手问两个简单的问题??? 想知道如何才能看见前页纸油笔写过后留下的字迹?(散分) 为什么用odbc连接的paradox表不能编辑? 哪位大侠帮看一下代码(关于链表),为何出"invalid type argument of `->'"的错 一个非常非常想从事计算机软件开发的愿望 关于Hook的一个小问题 文档视图结构中无法显示编辑框,怎么办啊??用什么代替啊 十万火急! 通过网络,进行语音聊天的程序。 你了解人工受精吗? 有关“无纸化考试系统”bow api中的常量 关于addslashes的问题 有关“无纸化考试系统”的问题??thanks all,bow 如何删除windowsXP?紧急!!! 【数据结构】考试用的是类pascal还是c语言 我想往服务器中传文件。请问,需要组件吗? 如何写naked function的prolog 和 epilog? LoadIcon(NULL,IDR_QQ) 关于用c写聊天室 帮忙看看是不是session_start()惹的祸 请问谁知道那里有php源码下载的好站,贴几个出来看看 一妹妹姐姐程序员求职,找深圳的工作 初级问题:RichEdit控件的ScrollBy方法自动滚动 推荐一个毕业设计题目,不要太难,我学的流体,用VC来做一个什么东西,推荐一个,谢谢. 今天中午饭后练习时台球斯诺克单杠52分~~~ 二个问题,第二个问题比较难! Windows.Net 3607 简体中文版下载,要的话赶快,不然链接要被删除了. From left to right: Jini, Mini, and Umji 请问我应该如何把图片存储在数据库里啊(急啊) 成都的高程何时报名,在哪,电话,何时考?? 有关access与sql的比较。 百思不解,请指点迷津 看点什么好 在PB作安全管理时,要编历菜单,而我问的问题是... 发现触发器的问题 有个小问题.请高手们回复一下.谢谢 请问怎样用lotusscript生成一个文本文件,并写值? 请问各位,哪有英语听力mp3下载?(送分) 问题!斑竹看过来! 大家觉得 人民邮电 出的那套怎么样? 一个三位数,十位上是0,个位与百位上的数字之和是9,如果把这个三位数的个位数字与百位数字对调,则得到的新三位数比原三位数大693,求原来的三位数 直角三角形中两直角边长ab,斜边为c,斜边高h,说明1/a^2+1/b^2=1/h^2用初二能看明白的算法 写出算法 任意画一个△ABC,作下列旋转:(1)以A为中心,把这个三角形逆时针旋转40°(2)以B为中心,把这个三角形顺时针旋转60° (3)在三角形外任取一点为中心,把这个三角形顺时针旋转120° (4) 以AC中 一个三位数,十位上是0,个位与百位上的数字之和是9,如果把这个三位数的个位数字与百位数字对调,则得 设直角三角形直角边为a,b,斜边c上高为h,则以c+h,a+b,h为边的三角形是 三角形 三角形ABC怎么绕逆时针旋转90° 一个三位数,十位上是0,个位上与百位上的数字之和是9,如果把这个三位数的个位与百位对调,则得到新的三位数比原来的三位数大693,求原来的三位数. 直角三角形两条直角边为a b斜边为c斜边的高为h则以c+h a+b h 为边构成的三角形的形状是什么怎么办啊 1:2000的图用什么多大纸画不懂,有知道的吗? 已知:如图,在△ABC中,AB=13,BC=10,BC边上的中线AD=12.求证:△ABC是等腰三角形 一个三位数,十位数上是0.个位与百位上的数字之和是9.如果百位和各位对调之后两数相差693.求原来的三位有算式 一直角三角形中一条直角边比另一条直角边大d厘米,斜边上高时h厘米,求斜边的长 在rt三角形abc中,角c是90度,ac是3,bc是4.以c为圆心,当半径是2.4时,r与ab有什么位置关系? 关于确定一次函数表达式的题.已知y与x成正比例,且x=3时,y=-6,则y与x的函数关系式是?若直线y=kx+1,经过点(3,2),则k=?已知一次函数y=kx-2,当x=2时,y=-6,则当x=-3时,y=?若一次函数y=kx-(2k+1)的图像与y轴交 如图是一个长12cm,宽4cm,高3cm的无盖铁盒,在其内部要放一根笔直的铁丝,则铁丝的长度最长是多少求求大家画出 展开这个图帮我分析,不要复制原有答案,答得好的再追加50分 在RT三角形ABC中,角B =90',AB=6厘米,BC=8厘米.点P由A 出发沿AB,边向点B 以1厘米/S的速度移动,点Q由点B 出发沿BC 边向C 以2厘米/S的速度移动.如果点P,Q 分别从点A,B 同时出发,那么经过几秒后QP平行AB?有 确定一次函数表达式的两道简单题1.已知一次函数的图像过点(0,1)和点(2,-1)点M(m,二分之一)在图像上,则m的值是______.2.一次函数y=bx+2的图像经过点A(-1,1),则b=_____.写出方法教我 把一个图形先按1:2缩小后再按3:1放大得到的图形与原图形比较是A变大了B缩小了C大小一样 Rt三角形ABC中,角C=90°,AC=3cm,BC=4cm,以C为圆心,r为半径的圆与AB有什么位置关系?1、r=2cm 2、r=2.4cm 3、r=3cm’ 有一个三位数,个位数字为百位数字的2倍,十位数字比百位数字大1,若将此数个位数字与百位数字顺序对调,所得的新数比原数的2倍少49,求原数. 游泳池的长和宽缩小为实际长度1/500后画出的平面图,这个游泳池实际深2米,它最多能装多少立方米的水? 宽度约为130像素,高度约为160像素,宽高比例为1.3:1.6左右,jpg格式,30kb 以下.急. 有一个三位数,个位数字为百位数字的2倍,十位数字比百位数字大1,若将此数个位于百位顺序对调(个位变百位)所得的新数比原数的2倍少49,求原数 如果两个直角三角形相似,相似比为1:2,那么它们斜边上高的比为 宽度约为130像素(110~160之间),高度约为160像素(130~200之间),宽高比例为1.3:1.6左右,近期正面免冠1寸 有一个三位数,个位数字为百位数字的2倍,十位数字比百位数字大1,若将此数个位与百位顺序对调 在三角形ABC中,cosA=4/5,求sin^2A+B/2+cos2A的值 一元二次方程(x-1)(x-2)=0的两个根为x1,x2,且x1,x2,且x1>x2,则x1-2x= 直角三角形两直角边分别为5厘米,12厘米.其斜边上高为多少 25.已知:二次函数 的图象经过点(1,0),一次函数图象经过原点和点(1,-b),其中 且 、 数学七年级第七章与三角形有关的角.CE是ABC的外角角ACD的平分线,且CE交BA的延长线于点E,证明角BAC大于数学七年级第七章与三角形有关的角。CE是ABC的外角角ACD的平分线,且CE交BA的延长线于点 一个直角三角形他的两条直角边分别是3分米和4分米,斜边是5分米,求他的斜边上高是多少?女儿的数学题 若两个数的和为5,积为6,求以这两个数为根的一元二次方程(主要是过程) CF是三角形ABC的外角∠ACD的平分线,且CE交BA的延长线于点E,证明∠BAC>∠B.这道问题在初一下册数学书的第77页的第10题(人教版)注意结尾是∠BAC>∠B.而不是“=”. 一个等腰直角三角形斜边和斜边上高的和是21则斜边的长是多少 一个两位数,其十位数是a,个位数是b,如果它们的位置对调,得到一个新的两位数,则原来两位数与新的两位数的差必定是9的倍数,你能说明其中的理由吗? CE是三角形ABC的外角角ACD的平分线,且CE交BA的延长线于点E,证明角BAC等于角B加2角 一个直角三角形3,4,5 斜边上高线分成2个直角三角形,这两个小三角形的内心连线长度 一个两位数,个位上的数字与十位上的数字之和是7,若把个位与十位数字对调,则所得的两位数比原两位数大27求这个两位数. CE是三角形ABC的外角,角ACD的平分线,且CE交BA的延长线天点E,证明角BACD大于角B 已知直角三角形斜边的长是斜边上高的4倍,求两个锐角的度数 已知:一次函数y=kx+b的图像与y轴的交点到原点的距离为3,,且过A(2,1)点,求它的解析式. 如图在三角形abc中,ab=17,bc=16,bc边上的中线ad为15,三角形abc是等腰三角形吗?为什么 用24厘米的铁丝围成一个直角三角形,这个三角形三条边长度的比是3:4:5,求这个直角三角形的面积. 一次函数y=kx+b的图像过点(-1,- 3),且与x轴,y轴的交点到原点的距离相 等,那么它的表达式不可能是 y等于x-2y等于-3x-6 在△ABC中,AB=17,BC=16,BC边上的中线AD=15,求ABC的形状 用24厘米的铁丝围成一个直角三角形,这个三角形三条边长度的比3:4:5,这个直角三角形斜边是多少厘米? 一个半圆形花池,画在比例尺是1比500的图纸上.量出图上相关. 已知a+b+c=3,a^2+b^2+c^2=3,求a^2010+b^2011+c^2012 在三角形ABC中,AB=AC=12,∠BAC=150°,CD垂直于BA的延长线于D点,求D点到A点的距离 如图,三角形ABC中,角ACB=90度,AC=BC,将三角形ABC绕点C逆时针旋转角a(0度 已知c为负整数,且a,b,c满足(a-1)^+|2b+2|=1+c,则(a+b)^2009+a^2010+b^2011+c^2012= 一次函数y=x-4与y=-x+2的图象交点的坐标是()这个交点到x轴的距离是()到y轴的距离是()到原点的距离一次函数y=x-4与y=-x+2的图象交点的坐标是()这个交点到x轴的距离是(),到y轴的距 在三角形abc中,ac=bc,bc边上的中线ad把三角形的周长分为12厘米15厘米两部分,求三 如果2010分之A=2011分之B=2012分之C,则A:B:C= 一次函数y=x-4与y=-x+2的图像的交点到原点的距离是? 已知在三角形ABC中,AB=3厘米,BC边上的中线AD,把三角形ABC分成了周长差为1厘米的两个三角形,求AC的长.(两种情况) 已知a=2011x+2010,b=2011x+2011,c=2011x+2012,求a2+b2+c2-ab-ac-bc的值a2,b2,c2,为a的平方,b的平方,c的平方. 在三角形ABC中,AB=AC,E是AB的中点延长AB到D,使BD=BA,求证CD=2CE 将一个三角形ABC绕点A逆时针旋转90度,A(0,4),B(-4,0)C(0.0)c'(4,4)B’(4,0),原三角形ABC内一点P(a,b),旋转后p‘坐标为,方法听老师讲过,不记得了,好像是找出已知3个点坐标变化规律,列一
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘