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

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.

Google揭露“仙女座”虚拟网络,及分散和集中架构之辩 DHTMLX Touch:开源的HTML5和JavaScript框架 Supercell下一城:《海岛奇兵》续写芬兰手游传奇 开发者盛宴 2014 Unity亚洲开发者大会盛大开幕 微软全球中国云业务总经理:云落地中国的最大难题 PTVS 2.1 Beta版发布 Visual Studio的Python工具 【走近院士】李兰娟:云计算与大数据将成为医疗改革利器 迭代不等于学习,聚类分析也不等于机器学习 Office大肆杀戮,已攻下Chrome Web Store Bug都补好了?Google发布Android 4.4.3更新 微软被传收购Xamarin 强势推进移动新战略 挑战传统金融业务 Facebook进军移动支付领域 亚马逊AWS需解决的五项问题 腾讯自曝:大数据平台的秘密 继Cloudera之后,MapR宣布对Spark的完全支持 企业实施商务智能的6个致命错误 《近匠》HBuilder:如何用JS调用几十万原生API? littleBits新推Cloud Module,普通人也能DIY智能硬件 如何创建浮动式标签模式? Office 365正式落地中国——移动为先,云为先 .NET Native:C++的性能 C#的产能? Arduino联合创始人Tom Igoe:创客,因何而创 【走近院士】高文:多媒体大数据的影响及面临的挑战 微软SQL Server 2014三大新特性:集成内存OLTP、BI和混合云搭建 Linux将会统治桌面端的7个原因 Intel首席科学家Randolph Wang:详解Edison AMD Mantle再添新作,引发下代GPU架构猜想 谈DAM决策,自建还是SaaS 证据显示:Linux战争已经转移到OpenStack RestKit:iOS开发必备,告别众多无聊代码 技术新突破:手机和平板可远程控制PC,Chrome Remote Desktop亮相 简单问题:用Printer.print如何实现这样的打印? 请问一下:"招商银行上海分行南西支行" 英文怎么说? 怎么将vc程序编译成ocx控件,供vb调用! 有关在button中增加图片的简单问题,在线等待 高分求codeWizard和C++Test的license SQL中,INT型是不是只能有4位数?我作的记录点击数反正不能突破一万,要将INT型改为什么型? url傳遞參數變量及Form表單提交問題? 人民币购买房产测绘代码 关于sql的身份验证问题? PC和PS/2鼠标如何通讯? 那位大虾有小写金额转换为英文大写金额的程序? 各位大俠幫幫忙,請問如何將金額的數值轉換為英文的大寫,急線上等待! 如果给定一个表名,怎样知道数据库中这张表存在与否? 双喜临门,激动不已啊... 不能在sql语句中调用字符串处理函数,怎么办? 在WAS4.0 AE控制中,启动应用程序服务器的时候,没有装入相应的 Web 模块,为什么? url傳遞參數變量及Form表單提交問題? 关于声音频率 有关数据库的问题,请不吝赐教 怎样将16进制的转成Unicode? 我的XP不能被局域网内其他用户访问 只提一条记录的问题!! 为什么我的ServletContext会出错呢? 上传看不到主页啊???web.config vb+asp.net 很急,在线等待 網頁url傳遞參數變量及Form表單提交問題? 50分! 又是字符串,怎么总与我过不去 怎样把文件写入服务器端中映射的驱动器中,急 在线等。。。 [我贴我灌]世锦赛罗雪娟夺第三金 关于用户离职和升级后的处理? 代码问题,高手进 急,在线等待 DNS服务器的问题,高手救命!!!问题解决不了,老板要我走人了!!!!!(痛哭中 &&&&&&&&&) 鼠标当前位置的值与窗体位置如me.left 的值是怎么样换算的? 英文OS,我加一个中文字库,我要在我的程序中显示中文,该做些什么? 一个硬件问题,来看看吧!问了好多人多不明白 bcb6自带的install??? 简单要求 CSDN出的《JBuilder实用技术手册》到底怎么样呀?我看目录怎么像垃圾? 在jsp怎么取得用javabean连接得数据库中得记录总数 请教各位大师,如何用VB做一个象ComboBox一样的控件 web Service里的Application的问题 有没有能够打印固定行数的报表? 对XML不太熟悉,麻烦大家再看看! 关于bho及控制ie行为的问题, 如何动态的设置datawindow的计算域的表达式,及从程序中如何得到该计算域的值 [我贴我灌]巴塞罗那凯旋归来 “花样姑娘”泪洒观澜湖 一个到现在还没有解决的问题!我着急用啊!请哪位高手帮忙解决了,有高分相送! WIN32 CONSOLE APPLICATION 中怎么调用DLL (动态连接库) 怎么增加不了行,插入不了了?请大虾给个提示 古人作品写乡愁的名句 出质人、质权人规定中出质人、质权人是说意思 有两个抗寒能力不同的小麦品种,请用学过的植物生理学知识设计实验,综合评价其抗寒性差异 “动产善意取得中占有改定的约定不具有对抗第三人和原权利人的追索的效力”的法律依据何在 占有改定是否适用善意取得 如图质量m物体用长为l轻绳悬挂于o点 1 现用水平拉力从最低位置a点缓慢的移动到b点,此时轻绳与竖直方向夹角θ,求拉力做的工2 在b点撤去拉力,让小球从静止开始下摆,求小球经过a点时绳子 善意取得制度中,无处分权人将其占有的物受让给善意第三人,无处分权人对物的占有是否要基于合法占有? 在水平面上,有拉力作用缓慢移动,拉力是否做工? 古人写乡愁的名句要少一点 古人作品中写乡愁的名句 古人写乡愁的名句两句 李源潮同南非副总统莫特兰蒂举行会谈地方金融机构应做大还是做小?省政协经美国安局30天内收集西班牙6050万中储粮:发现两企业违规将进口油菜籽掺贵州遵义市委书记廖少华涉嫌严重违纪违韩国陆军前方哨所一士兵中枪身亡 军方尼日利亚叛军袭击军队 医院收到35具突尼斯政治纷争致市政荒废 街头成“垃韩国陆军前方哨所一士兵中枪身亡 军方省委通报省级班子专题民主生活会情况女子骑电瓶车上高速 前后行驶约35公楚天都市报讯 龚琳娜 著图文:截至昨日14时398人遇难 1苏宁派微信红包总值18亿元二级水源保护区旁 砖厂傍晚大冒黑烟眼见情人吃醋投河 男子施救未果离开图文:梨园隧道顶部漏水梦见一大堆好吃的,笑醒过来。梅州市长:梅州已启动机场搬迁广州中原地产二季度业绩环比上涨42.市区18路段将建自行车道二本高校在我省增录5000多人
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘