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

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.

TIOBE 2013年11月编程语言排行榜:C#、Transact-SQL及VB.NET厚积薄发 透过KitKat,Android或与ChromeOS融合? 利用Spring Data Neo4j搭建推荐系统 七丽借百度SiteApp移动化 分发及变现能力获大幅提升 Go语言4岁了 生日快乐 谷歌发布Web延迟基准测试工具 专访JS-Git创始人Tim Caswell:让Git运行于任一平台 一段代码引发的思考 2013年美国开发者薪资调查报告 MDCC之移动娱乐游戏峰会:金玩奖揭晓最火游戏 算法为王:且看Mac Mini如何超越1636节点的Hadoop 鲍尔默成大善人?微软正式废除员工排名评审制度 工信部软件司副司长陈英为MDCC 2013大会致开场辞 全民移动•重塑世界 2013移动开发者大会盛大开幕 泯灭Web App可用性的七个开发错误 保益互动创始人曹军:听到的世界更精彩,盲人应用背后的故事 Gumi公司CEO国光宏尚: 大公开!日本手游市场攻克方法! Great Hill Partners高管Chuck Goldman & 南京创毅CEO William Wei:超越黑莓——下一代企业移动 高通业务拓展副总裁沈劲:智能手机2.0——以体验为中心 百度副总裁李明远:百度轻应用——长尾APP的最佳选择 中国工程院院士李德毅:大数据时代的认知计算 创新工场联合创始人汪华:2013年中国移动互联网进入深入区 百度副总裁李明远:解答关于百度轻应用的八大疑问 谷歌推出PNaCl,帮助开发者在任何硬件和网站上运行代码 阿里云:双十一350亿交易额的幕后英雄 索尼移动智能设备全球技术总监Goran Andersson:索尼移动可穿戴设备解决方案 腾讯社交网络事业部副总裁陈磊:腾讯移动开发者服务体系 基调网络副总裁陈靖华:全面掌握移动应用性能 蓝港在线创始人王峰:手游新时代下的机会与挑战! Couchbase CEO Bob Wiederhold:数据库云端同步,移动应用开发的未来 三星电子大中华区副总裁黄伽卫:构建移动互联生态,解读内容服务新方向 难道没有人会ADO事务处理吗?请帮忙回答‘这个事务操作错在哪?’ 请给以人道主义援助!!! 如何自定义消息??? 求救!请教高手VC里如何产生一个类似CDialogBar或CToolBar的可任意停靠的东西,并且拖动时没有虚框显示。 错误提示:“无法为更新行集定位:一些值可能已在最后读取后改变”。看一下,谢谢。 SQL Server 存储过程中错误处理问题,请教高手 請教: ADO 的 RecordSet 的打開方式和鎖方式 如何选择三层架构的中间件产品? 小呆猫谢谢了,再请教一下。。。 我想问一下,如何能在程序中锁定键盘和鼠标 西摩斯(厦门)医疗软件开发有限公司急招精通Delphi,MS SQL Sever软件设计师! 大家帮忙啊... 关于 int[][][] a = new int[3][3][3] 再问clavy(有巢无车氏) 和 wqxtt(wqxtt) 关于WINCE 下ACCESS 与 WINDOWS 下ACCESS 的转换 关于C/S结构的问题?快帮我啊!!! 各位programer加班有加班工资吗? 代理服务器的原理?——有谁知道! 请问怎么在一个对话框程序的文本框中绘图 请问windows网络程序PING编程技术里的几个问题,ICMP回显里面的timestamp是怎么纪录进去的 什么地方可以Down rose?或谁寄给我一个? 编写一个函数,通过指针连接两个字符串!!!!!!!!!!!! 用applet怎样打开一个文件吗? 请问哪种ORB产品实现了com服务器/corba客户机的桥 我读《深入探索C++对象模型》的感受,cber能再回答我一次么? 谁有DELPHI的有关网络编程方面的资料?给我一份可以吗? 关于stringgrid的问题????? 痛苦啊,难道要放弃BCB吗? 大家认为在开发过程中是否不能用全局变量? 如何让LINUX支持我显卡 高手,谁来帮我一下~! 取字符 在SDK中,如何获得客户区的宽度和高度呢??(哪两个函数呢?) 哪里有ATL的电子书下载?最好是中文的! 高手谁能帮帮我呀~~~~~~~! 请教:如何在statusbar的panel中显示一个图标呢? VC++中如何使用OLE对象? 初来乍到,发现这儿JJMM还挺多的。。。 请高人指教~! CSDN中碰到这种问题,该如何解决呢? 如何学习director 你能帮我一下吗?~ 企业商务管理软件,开放全部的源代码及开发文档! 企业管理软件,全套源码及开发文档!!!! 哪里有支持任何波特率的通讯控件下载? net_lover(孟子E章)请进~! 一个有关CWebBrowser的问题,急急急!!! 这样的语句为什么不可以实现一次删除多条记录 plmm是什么意思? 各位大侠,知道哪儿有直接可用的上传文件的控件吗? 多谢了!!! 论坛的题目是不是太没意思了 一个sqlserver7统计的问题?? ,△ABC的三条角平分线交于一点G,∠DAC=76°,∠ABE=20°.求∠BEC、∠ADC、∠DGC的度数 BE和BF三等分∠ABC,CE和CF三等分∠ACB,∠A=75°.求∠BEC和∠BFC的度数.如图,BE和BF三等分∠ABC,CE和CF三等分∠ACB,∠A=75°.求∠BEC和∠BFC的度数.∠A是75°,不是60°,看清楚啊./> 如图:己知∠BAD=∠CBE∠ACF,∠FDE=58∠DEF=45,求三角形ABC各内角的度数 如图,三角形ABC的三条角平分线交于一点G,角BAC=76°,角ABE=20°,求角DGC的度数. 在△ABC中,∠ACB=90度,AC=BC,BE垂直CE于点E,AD垂直CE于点D,试说明:△BEC全等于△CDA. 如图.在三角形abc中,ab=ac,点d,e,f分别在bc,ab,ac上,bd=cf,be=cd,角fde=58°,求角c的度数 如图,点E是△ABC的两条角平分线的交点.若∠A=80°,求∠BEC的度数. 在三角形ABC中,角ACB=90°,AC=BC,BE垂直于CE于点D,说明三角形BEC全等于三角形CDA. 在三角形ABC中,角A、角B、角C的对边分别是a、b、c,下列条件中,能判断三角形ABC为直角三角形的是( )A.a+b=c B.a:b:c=3:4:5C.a=b=2c C.∠A=∠B=∠C 如图,点E是△ABC两条角平分线的交点.(1)若∠A=80°,求∠BEC的度数.(2)若∠BEC=30°,求∠A的度数.(3)写出∠BEC与∠A之间的关系. 如图,在△ABC中,AB=AC,以AB为直线的圆O交AC于E,交BC于D 求证(1)D是BC上的中点 (2)△BEC相似△ADC(3)BC²=2AB*CE 在△ABC中,∠A,∠B,∠C的对边分别是a,b,c判断该三角形是否是直角三角形?并指出哪一个角是直角?(1)a=根号3,b=2根号2,c=根号5 (2)a=5,b=7,c=9 (3)a=2,b=根号3,c=根号7 (4)a=5,b=2根号6,c=1 如图点E是△ABC的两条角平分线的交点 若∠A为80°求∠BEC的度数 若∠BEC=130°求∠A的度数 ∠BEC是直角吗.如图点E是△ABC的两条角平分线的交点若∠A为80°求∠BEC的度数 若∠BEC=130°求∠A的度数 如图所示在RT三角形ABC中,角ACB=90度,AC=BC.D为BC中点,CE垂直AD于E,交AB于点F.连接DF求证角ADC=角BD此题与市面上题目不同,请认真思考是角BDF,打不上去了,嘻嘻,sorry 在直角三角形ABC中,角C=90度,过点B作BD平行AC且BD=2AC连结AD判断三角形ABD...在直角三角形ABC中,角C=90度,过点B作BD平行AC且BD=2AC连结AD判断三角形ABD形状并说明理由(角C=90度,就是一个直角梯形上底 如图,点E是△ABC的角平分线的交点.若∠BEC=130°,求∠A的度数 如图,在△ABC中,AB=AC,以AB为直径的圆O交AC于E,交BC与D,求证:(1)D是BC的中点(2)△BEC相似于△ADC(3)BC平方=2AB*CE 在直角三角形ABC中,角C=90度,若A+B=13,且该三角形的面积是22.,则C等于-----. 如图,在△ABC中,∠C=∠ABC=2∠A,BE是∠ABC的平分线,求BEC的度数 如图,点E是△ABC的角平分线的交点.⑴若∠A=80°,求∠BEC的度数⑵若角BEC=130度,求角A的度数 在△ABC中,AB=AC,以AB为直径的⊙O交AC于点E,交BC于点D.求证 (1)△BEC∽△ADC (2)BC²=2AB·CE如图 如图,在△ABC中,∠C=∠ABC=2∠A,BE是∠ABC的平分线,求∠BEC的度数 如图,在△ABC中,∠A=60°,∠B、∠C的三等分线交于D、E,求∠BDC和∠BEC的度数. 如图,在△ABC中,AB=AC,以AB为直径的圆O交AC于点E,交BC于点D.求证 (1)点D是BC中点 (2)△BEC~△ADC(3)BC²=2AB X CE 已知:DE∥BC,BE是∠ABC的平分线,∠ABC=70°,∠C=50°,试求∠DEB ∠BEC的度数 在三角形ABC中,∠B,∠C的角平分线相交于点D,若∠BDC=110°,求∠A的度数? 如图在三角形ABC中∠ACB=90CD垂直AB与D∠BAC的平分线交CD于E过E点作EF‖AB交BC于F求证CE=FB图传不上来 在三角形ABC中,∠B与∠C的外角平分线BE,CE交于点E 试说明∠BEC=90°-1/2∠A 如图已知在三角形abc中角a等于60度角b与角c的角平分线交于点b求角BDc的度数 三角形ABC中,∠C=90°,CD垂直AB于点D,∠BAC的平分线交CD于E,过点E做EF平行于AB,交BC于F,求证:FB=CE 如图11-1-12,已知点E是角ABC的两条角平分线BE,CE的交点,试说明角BEC等于角A加角1加角2. 三角形ABC的角B和角C的平分线交于点D角A和角BDC的度数分别为x和y当角A的度数x发生变化1.求出变量y与x之间的关系式2.当x由40度变化到100度时,角BDC的度数Y发生怎样的变化? 已知,如图,在三角形ABC中,角ACB=90度,CD垂直AB,AE是角CAD的平分线,过点E作EF平行于BC交AB于F,求证:CE=EF 如图,△ABc为等边三角形,角1=角2=角3,①求角BEc②△DEF是等边三角形吗? 如图,在三角形ABC中,角A大于角B,CD是AB边上的高,CE平分角ACB.求证:角DCE=速度 我现在就要求证:角DCE=二分之一(角A-角B) 已知三角形abc中,角ACB=90°,CA=CB,CD垂直AB于D,CE平分角BCD交AB于E,AF平分角A交CD于F.求证:EF平行BC 三角形ABC和三角形DEC均为等边三角形,角DAB=40°角ACD=15°求角BEC的度数 如图,角A=50°,角ABC=60°.(1)若BD为角ABC平分线,求角BDC.(2)若CE为角ACB平分线且交BD于E,求角BEC别说看不清图,图上条件在已知中已经有了 如图,在三角形ABC中∠BAC=90度,AD垂直于BC于点D,CE平分∠ACB,交AD于点G,交AB于E,EF垂直于BC于F,求证:四边形AEFG是菱形 如图,在三角形ABC中,角BAC=90°,AD⊥BC于D,BF平分∠ABC交于E点,交AC于F点,求证角AEF=角AFE 如图,角A=64度,角ABD=30度,角ACB=72度,且CE平分角ACB,求角BEC的度数(不用三角形内角和等于180°) 三角形ABC是圆O的内接三角形.AC=BC.D为圆O中弧AB上一点.延长DA至点E.使CE=CD 求证AE=BD 已知:如图,三角形ABC中∠1=∠2,BE⊥AC于E,交AD 于F 求证:∠AFE=1/2(∠ABC+∠C 角a=65度,角acb=72度,且CE平分角ACB,BD平分角ABC,求角BEC的度数! 在三角形ABC中.BD,CE分别是边AC,AB上的中线.点M是三角形BEC的重心点N是三角形BCD的重心 求MN:BC 如图,在三角形ABC中,BC=10,边BC的垂直平分线交AB,BC与E,D,BE=6,求三角形BEC的周长 如图,在△ABC中,∠ACB=90°,AC=BC,BE⊥CE于点E,AD⊥CE于点D.求证:△BEC≌△CDA. 如图,已知 ∠ABC=∠ACB CE⊥AB于E BD⊥AC于D △BEC≌△CDB么 如图,在等边三角形ABC的边BC、AC上分别取点D、E,使BD=CE,AD与BE相交于点F,求角AFE的度数 如图,在△ABC中,角ACB=90’,AC=BC,BE垂直CE于点E,AD垂直CE于点D.求证:△BEC全等于△CDA 已知,如图,在等边△ABC中,点D,E分别在BC,AC上BD=CE,AD与BE交与F.求:如果AB=12,BD=4,求S△BDF:S△BEC 三角形ABC的三条角平分线交于一点G,角BAC=76度,角ABE=20度.求角BEC,角ADC,角DGC的度数? 在△ABC中,∠ACB=90°,AC=BC,BE⊥CE于点E,AD⊥CE于点D.求证:△BEC≌△CDA 如图,在△abc中,ab=ac,bd=cf,be=cd,∠fde=58°求∠c的度数 △ABC的三条角平分线交于一点G ∠BAC=76° ∠ABE=20° 求∠BEC ∠ADC ∠DGC 如图三角形ABC中,角ACB=90度,AC=BC.BE垂直CE于点D,求证•三角形BEC全等CDA.谁能写写过程给我, 三角形ABC中,AB=AC,BD=CF,BE=CD,角FDE=58度求角A图 △ABC的三条平分线相交于一点G ∠BAC=76 ∠ABE=20 求∠BEC ∠ADC ∠DGC的△ABC的三条平分线相交于一点G ∠BAC=76 ∠ABE=20 求∠BEC的度数 http://hi.baidu.com/%C4%B3%CF%A3%CF%A3%CF%A3/album/,这是图片 如图,在△ABC中,BD是高,CE是∠ACB的平分线,BD,CE交于点P,∠A=70°,∠BEC=110°,求∠BPC和∠ABC的度数 如图在△ABC中,点D,E,F分别在BC,AB,AC上,且BD=BE,CD=CF,∠A=70°,求∠FDE的度数
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn