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

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.

VB用ActiveX Control Pad VB用API函数改进ListView 控件的显示效果 用VB6.0中文版进行DHTML程序开发 用VB编写标准CGI程序 用VB编写留言板 用VB播放FLASH动画 用VB开发进程管理软件 VB用WinSock设计Chat程序 运用MSChart,生成统计图形-VB资料 向文本框等等控件的系统右键菜单里追加自己定义的菜单-VB资料 在VB中用定时控件实现长定时操作 在Visual Basic中,在GotFocus事件中快速选定文本 在程序中注册和注销 OCX 控件 -VB资料 在运行时维护DBGRID的栏位宽度-VB资料 VB怎样使用VB开发基于Sybase的C/S软件 VB怎样在运行时动态生成多个相同的控件 直接编辑VB中网格控制项的两种方法 自制控件方面的有关知识-VB资料 Unicode vs Ansi -VB资料 VB 中调用 Word 拼写检查 VB4.0安装程序的汉化 VB中对字符串的处理及其扩展 把符串中的一子串替换为另一子串 -VB资料 把数字转成英文字-VB资料 翻转一个字符串-VB资料 混合字符串的长度 -VB资料 将阿拉伯数字转成中文字的程式 -VB资料 将包含有Null结尾的字符串转换为VB字符串 切分字符串-VB资料 清除字符串中指定的字符 -VB资料 VB如何取得计算机的所有字型? 我的显示有问题,大家帮忙看一下好吗? 统计,大家都用哪里的php收费空间? 请教JTree中怎么任意设置TreeNode的图标? 在堆栈上分配结构与用new分配结构有何区别 是否可以对datareport中添加的控件编程呢 三层中数据返回的问题 在vb.net里有什么简便的办法可以处理所有控件的keydown消息? 菜鸟问题 在线等 Page.Response.Write("<img height=13 src='images\deleteTrue.gif' width=13 align=middle>");出错 我想买一款数码像机!!! 动态连接excel表的问题 用什么方法可以实现我计算的数字,只有两位小数,谢谢!! 知道26号放假!高兴!!放分!! 问个瓜问题 推荐几个好的编程论坛(中文的),不看的后悔呀!请不要移贴或删除! 关于脚本与代码的通信问题。。。 用WiseInstall作安装程序,怎么让可执行程序自动识别专用的文件,即点击专用文件即可用对应执行程序打开 在POWERDESIGN中将数据库设计倒入WORD报表的中文乱码问题 访问数据库时遇到的问题 如何把Excel的图表另存为图形文件?? 紧急求救!!(关于调用exe的问题) 关于动态删除记录的问题,大侠指点!!! 请问如何把用户上传的文件(所有)都保存在sql里面? 在POWERDESIGN中将数据库设计倒入WORD报表的中文乱码问题 时间设置 年关已到,谁有工作总结的模扳,给小弟发一份。 今天女朋友回家,放分,终于可以自由几天了,头一次放分,只有这么多了 生气!我真的很生气!现在的人怎么都这样? to shibichen(务必请近来一下) 在VC中怎么写关于猫的AT命令的程序?最好又程序。分数不过另外给 问一个傻傻的问题 帮帮忙,我送什莫礼物给女朋友好呢? 如何将选择出的内容存入文本文件??? Delphi中数据库操作Filter的原理,他和SQL语句查询输出的结果有什么不同? 在EXCEL中如何实现分两上SHEET打印!? 帮帮忙,我送什莫礼物给女朋友好呢? 几个linux下典型的应用问题,,高手新手都请进 ;-) 有关IE的奇怪问题 困扰很久的问题了:conn.execute为什么有是不能执行? 请问当一个页面中某个frame包含的网页不断重复刷新的时候怎么不让IE下面的刷新条滚动? 为什么局域网内看不到网站,而在广域网内却可以看到网站! 哪位用过这个控件的3DES,SHA1算法?我调不出来,急~~~~~:( delphi中类似于On Error GoTo的语句是什么 采用缓存模式的Dataset如何一次性进行所有行的数据合法性校验? 运行程序时如何交换数据窗口中的两列的位置呢? 两个sql语句一样只有条件不一样,如何取并集? 无法设置DatabaseName是为什么? 那位高手能给出创建弹出窗口的比较完善的例子(最好经过测试)? 在目前共享软件怎样才能获取美元?除了有自己的产品外,在营销中那些条件是必备的? 我有oracle考单两张1000元/张有需求请email给我 在POWERDESIGN中做的数据库设计倒入SQL中,能否保留住NAME栏的中文注释? 中石油通报四高层接受调查情况 免去其网购谁最容易被骗? 90后网购被骗比上海按“双送检”要求退订5批次问题校上海写字楼市场整体租金下滑 旧楼改造福建一男子阻止工地施工 4岁孙女被推江苏知名企业家吃教师空饷十多年 未教男女认识当天就结婚 新娘落跑男子4年10月起江苏8市汽车改喝“国五”油独家:尼泊尔印度教徒欢度克瑞斯那诞辰南京一医院调查:40%患者送急救才知南京亚青专用道已取消 公交专用道继续中石油通报王永春等四人违纪情况 强调南京新规定:想拆老字号必须先公示和听苏州居民满84周岁可享政府补助 9月习近平:不能什么“菜”都装进高新区的印度两幢民居倒塌致11人死亡30多人美纪念马丁 路德 金演讲50周年 隐中国海军和平方舟医院船抵达缅甸开展医东海舰队舰艇编队进入西太平洋展开训练联合国呼吁各方配合叙化武问题调查小组浙江教育厅将发减负通报 教师流动制度冬日女性美丽保养方法_冬日女性美丽保睡前养生护肤方法_睡前养生护肤技巧嘴馋瘦身两不误方法_嘴馋瘦身两不误技怀孕前要禁忌哪些习惯_怀孕要禁忌什么如何祛除暗黄肌肤_怎么祛除暗黄肌肤简单丰胸秘诀_简单丰胸技巧自然丰胸私家绝招_自然丰胸私家技巧如何让胸部富有弹性_怎么让胸部富有弹Sonia Rykiel 2016秋有氧减肥方法_有氧减肥技巧如何吃出瘦人体质_怎么吃出瘦人体质如何控制食欲燃烧脂肪_怎么控制食欲燃孕期哪些中药不能乱吃_孕妇不能吃的5OL简易瘦腹方法_OL简易瘦腹技巧简单易行的塑身运动_简单易行的塑身方女性吃啥容易变黑_吃什么可以美白皮肤胸肌训练方法_胸肌训练技巧如何丰胸_怎么丰胸怎样预防产前抑郁症淋病的传播途径有哪些紧急叫停首付贷,楼市背后有秘密?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘