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

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.

从NSA携谷歌、微软等9家名企监控用户行为看数据安全 【专访间】新科兰德创始人左磊:我们的“卖点”是“数据弹药” 甲骨文公司宣布推出最新Java EE 7 10款最佳CSS/jQuery开源图片说明 创业者应避免对投资者说的五句话 直接拿来用!最火的iOS开源项目(二) 西部数据Pat Wilkison:云计算市场是创新热点 猎豹浏览器发布手机版:PM谈开发理念 成为伟大开发者的“九步曲” 使用GPU构建更便宜的Google神经网络 Facebook与Yahoo!的“火花”:系统间实时数据流管理工具 视金钱如粪土?Yahoo!又要买了,梅姐的算盘是这样打的 MySQL手册不再遵循GPL协议:MySQL走向闭源前兆? 扁平化设计会扼杀人们的创造力吗? 又一巨头涉足移动视频分享领域:传雅虎欲收购短视频应用Qwiki 史上最牛:主要靠三消游戏IPO King也许会是第一家 乐视超级电视预约启动 1小时预约近1.4万台 王坚:未来一年阿里云会有很大变化 梁胜:开源并不是做好软件的唯一方式 如何为IE 10编写特定的样式 MySQL手册许可证更改乃是Bug惹得祸 开源世界高峰论坛首批演讲议题公布 测试工程师的心灵鸡汤:谦虚、不沉默、有危机感、不断努力 高德地图API“沿图有你,晒出你的LBS应用”活动拉开帷幕! 谁能找出Windows 8.1的安全漏洞,就将获得微软10万美元奖金! 【直击美国云计算】Facebook分享数据中心新网络架构Fabric 【直击美国云计算】OCP发起产业界的Maker运动 红帽刘长春:开源是推动云计算和大数据发展的重要力量 【直击美国云计算】出货量达x86的20多倍 ARM或将成为数据中心主角 孙小群:将SAP HANA打造为开放的PaaS平台 GitHub推出重大改进:强调速度、内容和交互性 紧急求救!!! 如何制作浮动面板? 给分的问题! 如何获得 mod_webapp.so 紧急求救 想知道各位WINDOWS下用什么SNIFFER? 对于网络上的第三方控件的看法 简单问题?JTable中的数据如何居中对齐,有没有直接的函数(不用自定义CellRenderer) 有关析构函数 请问一个小问题 关于ADO中ltBatchOptimisticr的FilterGroup的问题 两个星要到多少分才能升到三个星呀 请问有谁知道北京的成人教育大致的情况如何? 是VC编译器不符合ANSI C++,还是?? 我现在在写个程序!是关于证券方面的!可是如下的一个小问题如何解决?? ★★如何让excel的某行的值等于另一行的值乘以一个固定值(急问,在线等待)★★ @@@开学了,散分! 怎样构建一个LDAP服务器和怎样使用 用VFW采集时进行压缩的问题。求解 C# 在DW MX中如何进行层定位? 回复:機會不要錯過! 華強科技有限公司幫你成就軟件工程師的夢想! How to access SMB/CIFS from Sun workstation? 谁来拿分啊。我有一个问题自己解决了,但没有给分的对象。 问一个message Bean的问题,up有分 [EJB]HelloWorldBean正确编译配置和执行,但"HelloWorld"却不见了 寻C语言编程高手!现有一IP地址和网页、搜索栏关键词拦截程序需要编写,付酬!!! 如何让主界面变成三维的那种 寻C语言编程高手!现有一IP地址和网页、搜索栏关键词拦截程序需要编写,付酬!!! 用什么组件能得到网站上的末知大小的文件? 问一个简单的问题 还是有问题关于获得选中安钮的当前行,请进>> 请教简单问题,如何将菜单的一个选项隐藏。就是类似cb的将Visible=false的做法!! 连接ACCESS数据库的问题? 寻C语言编程高手!现有一IP地址和网页、搜索栏关键词拦截程序需要编写,付酬!!! 如何提取一个EXE文件的特征码??要高分者和高手进!!!!来者有分! j2ee配置问题,大家帮我看看,错误出在哪里?谢了! 如何在注册表中修改使得浏览的网页可以即时通过工具栏的“编辑”调用DW修改? "聊聊"网站是怎样建的?用拉什么技术,可以即使聊天? 类型转换,非常奇怪的问题。高手进来 搞纯C++的大虾请进 关于MDI Child窗口的一个问题? DOS6.22的下载及6.0源码 sql语句问题:怎样从表中选出字段值包含在一个变量字串的那条记录。100分!在线等待! 关于那个mesh绕自己中心(注意是自己中心)旋转的问题我还没有解决 抛砖引玉: 证券行业软件之数据库存储。 如果下面这个问题谁能解决,我跪下来拜他三下:在WIN2000里,通过更改注册表,以达到更改IE的页面设置(一定要能更改横向:orientation和 过程的问题!!! 一个非常难的问题---挑战这里所有的高手!(解决了,分数我可以追加到200) 用vc7时候怎么导入一张图片作资源?还有怎么添加popup菜单 有关取得一个Tree Control的一个Notify的问题! 劝诫人们学无止境,奋发努力的名句有那些 急~~寒假作业上的…… 小学五年的生活一晃而过,真是( ),( ) .(写两个表示时间易逝的成语)我即将参加六年级毕业统考了, 甲乙两个人同时从A、B两地相向而行,5分钟后两人相遇,相遇后两人继续前行,又经过15/4分钟,甲已超过B地20米,而乙离A地还有80米,A、B两地相距( )米.希望不要用二元一次方程等复杂方式解答. 人的一生要经历多少事情?几经挫折你才会得到你理想的爱人 事业 家庭 朋友 成功 小学生活一晃而过,真是 .(写一个表示时间易逝的成语)下学期我将参加六年级毕业统考了.看看今天糟糕的成1.小学生活一晃而过,真是 .(写一个表示时间易逝的成语)下学期我将参加六年级毕业 如何改进英语教学 人的一生会经历许多的事,我们不应该只看到伤痛,我们应该善于寻找幸福.人生多磨难,何以强求太多,顺其自然,你会发现生活并不可怕.破碎的心无法使其完好如初,但是可以重新拾起,用心呵护, 妈妈呀,妈妈 这是一篇阅读短文!认真阅读下面短文,完成下面的练习.妈妈呀,妈妈 “哎呀,我的小祖宗,别动别动,让我来做.”这话简直成了妈妈的口头禅了.我放学一进家,她便让我做作业,我干 如何珍惜粮食简短些 人生不幸之事犹如一把刀……“人生不幸之事犹如一把刀,它既可以为我们所用,也可以把我们割伤,这要看我们究竟抓住了刀刃,还是握住刀柄” A、人生难免有挫折B、挫折既有消极作用,也有 这种题目什么的最讨厌了,特别是阅读短文完成练习. 什么是数字PID位置型控制算法和增量型控制算法? 把一张纸对折再对折,重复下去,第43次纸的高度是地球大月球的距离.纸厚0.006CM.距离385000KM相信这个人的说法吗? 请详细说明,谢谢了哦 ! 我求你们了 呜呜~~~~~~~~~~~~~~~~~~~ 读短文,完成练习的题目,公鸡和狐狸狐狸见公鸡站在树上,它像想吃鸡,但自己又不会爬树.于是它说:“啊,公鸡,我告诉你一个好消息!”“什么好消息!”公鸡问.“哦,现在所有的动物都成为好 pid控制的算法 如果将一张纸裁成两等份,把裁成的两张纸摞起来.第43次后所有纸的高度便相当于地球到月球的距离.”请给一个合理的理由,并请告诉0.006的43次方是多少?一张纸的厚度为0.006cm地球距月球约3850 帮我起一个练舞蹈作文的题目 怎样用PID算法控制温度? 面对困难,我们应该说什么名言警句来激励他人? 请问小学英语适合利用英文歌曲进行教学吗? 甲、乙两数相加,结果为357.5,如果甲数的小数点向左移一位,就和乙数一样,那么乙数是( ). 初中第一节体育课到底会干什么啊啊?急 ph试纸哪有卖 100吨米等于多少千牛米?寻求达人 在那能买到PH值试纸 成都ph试纸哪里有卖? 汽车发动机功率和牛米的关系汽车发动机的大问题,功率和牛米的关系,都说看发动机的性能看功率和牛米,发动机的综合性能是功率越大牛米也越大,但如果 100KW-200NM和120KW-180NM,那个发动机更好 PH值试纸那里能买到? 哪里可以买到PH试纸,价钱如何? 《那一刻,我迈上了新台阶》作文的开头不要是这个:人生漫漫,每分每秒,我们都在台阶上攀登.每登上一层,我们就站得更高;每登上一层,我们就看得更远——台阶总是在我们的脚下延伸. 提高警惕的名言警句大哥, 茄子内涵是什么意思 建筑给排水图纸上出现一个箭头,箭头上标注1%, 挖土深度大于5m,按土体稳定理论计算后的边坡进行放坡.我们挖土是11米,应该放多长距离 根据提示补写名句.1.我寄愁心与明月,( ).2.( ),天涯共此时.3.疏影横斜水清浅,( ).4.纸上得来终觉浅,( ) .5.勿以恶小而为之,( ).6.千年扬州古运河,堪称一条诗歌之河,你是否在课内外 将一张厚度为0.05毫米的纸对折30次以后,猜一猜它能有多高?我是初中生,这是家作啊,快.要理由.后面的答案要带单位. 假如你是一个世纪老人,见证了罗布泊的百年沧桑,你将向人们诉说什么? 警惕名言如何提高个人警惕性? 等个茄子是什么意思? 假如你是一个世纪老人,见证了罗布泊的百年沧桑,你将会向人们诉说什么? 我工程采用条形基础,基础大放脚宽为1.5m,基槽深度为2.6m,采用放坡施工,边坡比1:1.我工程采用条形基础,基础大放脚宽为1.5m,基槽深度为2.6m,采用放坡施工,边坡比1:1,基础施工工作面为15cm,计 一个6位数,各个数位上的数字之和是17,则这个数是多少,最小是多少 穿越一个世纪,见证沧桑百年,刻画历史巨变,一个生命竟如此厚重.答对有奖什么时候出来的说得谁? 哪些地区以面食为主、 1.东北平原 2.江南水乡 3.华北平原 4.黄土高原只要一个最准确的啊 一个三位数,三个数位上的数的和是17,十位上的数比百位上的数打5,个位上的数是百位数发2倍,求这个三位数. 挖土方、地槽、地坑放坡起点深度、放坡系数、工作面如何确定? 1北方地区年平均降水量为()-()毫米,属于什么区.2人们把东北平原称为()黄土高原和华北平原称为() 初中地理教学视频我现在初三了,可是地理总是考的不好,我非常苦恼,我不知道该怎么办,请问我应该怎么学呢? 地球到月球的距离384公里,用一张长0.2毫米的纸,折多少次可以到达 哪里可以买到PH试纸 涉及的范围是否比较广呢? 一张纸约0.06厘米厚,将它对折43次,可能等于地球到月球的距离吗?为什么? 在哪里能够买到PH试纸只是一个小县城,别弄什么太高级的地方,没太多的条件,不过要一些普通的场所道还有!THANGK YOU! 如何提高初中地理教学成绩 告诫自己,如果现在不努力学习,以后就会后悔的精辟名言就是告诫自己要珍惜时间,好好学习,强调“不然以后会后悔”,要贴在桌子上告诫自己的,希望比较精辟的,不要那些常见的,因为常见的 哪儿可以买到pH试纸? 甲乙两个人同时从A、B两地相向而行,5分钟后两人相遇,相遇后两人继续前行,又经过4分之15分钟,甲已超过B地20米,而乙离A地还有80米,A、B两地相距( )米. 告诫人们学无止境,奋发努力的名言 在哪里能买到PH试纸 查成语什么日经济
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘