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

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.

助力响应式设计:Adobe发布最新HTML5工具包 VMware控告Hortonworks恶意挖角 2013年大数据真谛:实时分析与批量处理 微软招聘信息证实Windows Blue项目正在推进 研究人员正开发永不会崩溃的计算机 Google:开发者应尽早进入可穿戴式计算 Chrome OS身世及其创始人之谜 谷歌举办Glass Foundry黑客马拉松活动 获80款Glass应用 政府和法律的干预拖慢了云计算发展 AMD打造开放的异构计算标准? Podcasts:苹果史上最烂iOS应用 烂过iOS Maps 日本游戏开发公司谈:如何在激烈的APP世界立足 VC不会告诉你的8件事 Reddit宣布将接受虚拟货币Bitcoin付款 OneID创始人:双因素身份验证无法保护Twitter Opera放弃自家内核转投WebKit的背后 Amazon强攻私有云市场,目标锁定银行 微软的24年数据中心之路 Flurry:约会应用男同性恋用的最多 jQuery消息提示框的简单实现 Mozilla CTO:Mozilla不会转向WebKit 这很重要 Pinterest或超Twitter成第二大社交网站 适合儿童上手的八款编程工具 一周云事件:亚马逊对消费者的吸引力超过苹果 比尔·盖茨对微软创新和手机不满意 让我们一起来做最漂亮的Android界面吧! 响应高达6秒 用户揭露Heroku修改路由“50倍圈钱”? [探讨]响应式设计四大原则 Linux Kernel 3.8发布 停止支持386设备 HTML5手机游戏引擎Devkit开源 程序员的一天:台湾个人移动游戏开发者 outlook邮件求助 不同窗体之间如何传递变量??? 我用Internet Transfer Control 做ftp程序时遇到的问题! 我就这么点分了!谁帮我解释一下滤镜呀!那个用来处理图象的!在JAVBASCRIPT! 路由到底是什么东东,我怎么不明白怎么回事? 如何在属性页中加入静态切分视图??? 我是天津人有没有同乡? ------------------------smiled 快来 我要饿死了----------------------- 我想用DCOM实现访问数据库,请大家指点,请进 竹子, 还给我一点分吧? TO:Vincent_Jiang(无生无灭) 两机相连的问题??? 提问题给的最高分于其余的分有何关系?请问斑竹 什么叫数据库的别名,应该怎样设置数据库的别名? 怎样与telnet应用服务程序通信 怎样在TStringGrid的整个框内绘图,而不是在某个单元中绘图? WEB安全认证问题 TO: neweb(永不言败) 请问各位大虾,哪里有jdk1.3 for linux SPARC 版本 求救!硬盘坏了! 晨昏三灌水,早晚一个屁 怎么在EXCEL中用VBA控制图表的位置? Delphi确实很好,学了好几年了,但在上海差点没有找到工作,很少有招学Delphi的 关于 VC 6.0 有没有什么补丁,升级文件之类的东西? 高分争解 怎么利用Jsp发邮件? 有谁知道光驱加锁的问题 parodox数据库问题 各位平时用 VC 作东西,都用那些辅助工具?  高分争解 【 http://www.esoftware.com.cn/search.php?condition=%BA%AB%C1%F7%C0%B4%CF%AE&page=1&mode=3 】 JBuilder的使用问题 在VFP中,编程执行SQL语句时,怎样使系统的查询结果不出现? 一个程序流程的问题 为什么当我的SpeedButton的enabled为false时,上面的图标就没有了? 囡囡(baicolt)请进,问你一点事情 简单问题,请赐教 高分相赠!!!:操作系统和SQL SEVER2000都是英文版,用VB连接如何可以正确的输入和显示中文? 则么在程序中得到sql的存储过程的返回值? 请问 VB 6.0 有没有最新的升级文件之类的东西?高分争解 谢谢 谁有用java做的复杂一点的图行界面的例子 网管来看看,为什么不能给分了!右边的文本框又不见了! 各位用 VB 编程都用那些辅助工具? 高分争解 关于ShellExecute 装了redhat7,在/etc里没有inetd.conf文件,谁见过这咋整 菜鸟请教大侠!很急!谢谢!!只有10分对不起! 请问一个关于CLASSWIZARD 的问题 这里有PB反编译程序,你信吗? 怎样解 关于大数据量的问题,经验丰富者里面谈! 我想在程序里控制程序外的浏览器窗口资源管理器窗口,怎么做呢?急呀!!!!!! 请问:我用JavaMail收下的邮件主题,发信人姓名不能正常显示。。。。。 认识我的人都进来跟我聊聊吧,我最近新换了工作,还没有适应,你们各位是怎么换工作? 生活中,过滤水或纯水怎么弄到?不能直接用自来水 请问为什么电解食盐水时石墨电极会剥落 为什么Na2O和Na2O2的阴阳离子个数比相同? 过滤后的水是否一定是纯水? 用石墨电极电解500ml饱和食盐水,在阴极得到的气体在标准状况下体积转为56ml假设溶液体积保持不变,求电解后溶液的ph Na2O2晶体中的阴阳离子比 过滤得到的水为什么不是纯水 现有500mL饱和食盐水,其中含有少量NaOH,该溶液的pH为10,用石墨电极电解时,当阴极产生5.6L H2(标准状况)时停止电解,此时溶液的pH约为: 向Na2O2与水完全反应后的溶液中加MnO2,产生O2,是由于该溶液中含H2O2为什么? 杀菌过滤后的水虽然澄清透明,但不是纯水如何证明他不是纯水,写出实验的步骤、现象和结论.(字数不要太多啊) 3V,石墨电极电解食盐水一段时间后溶液变黄,为什么? Na2O2与H2O反应为什么生成H2O2正常不是生成NaOH和O2嘛.为什么会生成H2O2、? 目前市场上买的净水器真有净化水的功能吗?如果安装净水器对身体有益处,什么牌子的质量过关? 由氢氧化钠(NaOH)和过氧化钠(Na2O2)组成混合物,并检测出氢元素的质量分数为1%(出5个类似的计算题)谢谢悬赏20拜托了今晚求答复 设计实验证明O2来自H2O2在H2O2+MnO2====O2↑△这个反应中请用实验证明得到的O2来自于H2O2而不是MnO2(注意,是用实验证明)我知道MnO2是催化剂 但必须用好的实验啊 纯水的标准是什么是?超纯净水的标准是什么? 帮忙出550道计算题和165道应用题 能用FeSO4溶液来检验Na2O2与足量水反应后的溶液中存在的H2O2么 纯水和净水的区别 化学Na2O2+CO21.这是放热还是吸热?2.怎么判断Na2O2和CO2中的氧在反应后变成了哪个物质中的氧啊?我的意思是,2Na2CO3中有6个氧,O2中有两个,那应该怎么判断2Na2O2中的那4个氧和2CO2中的那4个氧分 可用CO2来确定某NA2O粉末是否含有NA2O2,为什么错?不是产生O2吗? 纯净水是纯水吗? 【化学】Na2O2为什么是共价化合物?我查的到Na2O2的电子式如下:....Na+ [ :O:O:]2- Na+....过氧根显-2价,2个Na原子的电子转移到过氧根上,正好形成稳定结构.可它为什么是共用电子对的共价化合物?Na 根据Na2O与O2加热后生成Na2O2可知Na2O与Na2O2哪个更加稳定把前因后果也具体说明一下吧 我想问一下,纯净水和净化水有什么区别? Na2O2可以与哪些物质反应? 证明Na在空气中燃烧生成淡黄色粉末为Na2O2而不是Na2O 以食盐和水为反应物,经过电解制得Cl2 H2 NaO2三种物质,求该反应的化学方程式 将等物质量的 Na2CO3 ,Na2O2 ,Na2O ,NaOH ,NaHCO3 ,NaCO3-8H2O 放置于空气中将等物质量的 Na2CO3 、Na2O2 、Na2O 、NaOH 、NaHCO3 、NaCO3-8H2O 放置于空气中 ,其质量由小到大的顺序是: 为什么说NA2O在空气加热形成NA2O2比NA2O稳定 食盐水微酸性电解制得氯酸钠化学反应方程式是什么? 将Na2O NaOH Na2O2微粒数目相等的上述固体物质长期放制在空气当中,最后质量增加的大小顺序是 Na2O与Na2O2哪个是粉末哪个是晶体 电解氯化钠的化学反应方程式 NaOH,Na2O,Na2CO3,Na2O2 哪一个放在空气中,会发生氧化还原反应而变质?希望能详细解答,谢谢了! 装置I中发生反应的化学方程式为?(金属钠和空气制备纯度较高的Na2O2实验) 用铜电极电解食盐水的先后现象及相关化学方程式.谢谢! 将等质量的①na②na2o③na2o2④naoh将等质量的①Na②Na2O③Na2O2④NaOH ⑤Na2CO3·10H2O露置于空气中,最后质量由小到大的顺序是A.⑤<④<③<②<① B.①<②<③<④<⑤?C.⑤<④<②=③<①?D 现用金属钠和空气制备纯度较高的Na2O2,可利用的装置如下.回答下列问题(注:Na2O2可以与H2O、CO2能反应)(1)装置Ⅳ中盛放的药品是______________,其作用是__________________________.(2)若规定气体的气流 电解氯化钠和电解熔融氯化钠化学方程式、用途.最好有附带离子方程式. 下列物质放置在空气中,变质原因与其他有本质区别的是 Na NaOH Na2SO3 Na2O2请说明原因 一块金属钠放置在空气当中,发生一系列氧化,最终生成什么? 水在通电的情况下分解为氢气和氧气,说明什么? 1.电解NaCl固体熔融物化学方程式---------2.电解饱和食盐水---------3.NaOH溶液与CO2 CO2少量------------ CO2足量---------- Na2O,Na2O2的化学键?分别是什么化学键?离子键?共价键?快 用物理和化学办法证明大气中有水 电解熔融氯化钠和电解饱和食盐水为什么它们的化学方程式 不一样呢?不都是氯化钠嘛? Na2O与Na2O2中化学键的不同点是 什么办法能证明空气中有水 电解熔融氯化钠时为什么写化学方程式,能不能写离子方程式例如2NaCl=(通电)2Na+Cl2能不能写成2Na+ +2Cl-=(通电)2Na+Cl2 Na2O2计算问题一含C、H、O的物质ag在氧气中充分燃烧后产物被Na2O2吸收,符合通式(CO)m(H2)n的产物还是ag,为什么?那什么时候产物会小于ag?( ⊙o⊙?) 如何证明空气中含水和二氧化碳 电解熔融氯化钠制得金属钠的化学式 Na2O2的阴阳离子分别是什么 怎么证明空气中含水蒸汽 食盐水的化学式? Na2O2和Na2O2的阴阳离子个数比相同吗? 什么实验可以证明大气中含水 请问,电解食盐水,怎样防止石墨电极脱落? Na2O2阴阳离子数之比?是不是1:
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn