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

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.

终于来了,微信企业号正式开启公测! 【问底】王帅:深入PHP内核(一)——弱类型变量原理探究 谷歌Kubernetes专访:未来BigTable开发只是课后习题 首届“最具价值CTO”评选来啦!我们在找你! 【CTO俱乐部走进顺丰总部】活动图文直播进行中 中国第一个云主机评测发布:天翼云性价比第一、青云质量第一 Ruby 2.1.3发布,降低内存消耗、修复众多Bug! OpenHW2014开源硬件总决赛鏖战西安 AMD力推异构计算 《坦克世界:闪电战》:PC转手游,不止免费! 【讲师】道里云毛文波:网络虚拟化与SDN实现Docker连通 性能测试:SequoiaDB vs. MongoDB vs. Cassandra vs. HBase 华云数据推运营型PaaS Plus平台,联合Tmax走出“去IOE”的云化之路 聚焦移动新势力 MDCC 2014免费展位团队名单公布 详解Google Authenticator工作原理 云计算的乐高玩具,Docker从根本上改变应用程序开发 【先锋】eSage缔造异构虚拟化管理技术,做数据中心核心思想执行者 Uplinq2014:亲身体验Vuforia与智能眼镜设备 MDCC 2014 移动开发者大会议程全面揭晓! 顺丰模式:物流行业“互联网化”的科技之路 移动应用云服务工具APICloud宣布完美适配iPhone6 从应用分发到能力开放 华为开发者联盟沙龙上的共赢理念 SOOMLA框架:移动游戏分分钟创建个虚拟商店 Facebook:如何让应用适合所有系统、带宽以及屏幕 Docker实践者不能错过2014 Container技术大会的九大理由!(讲师议题全面揭晓) 2014全球云计算大会中国站(CC China)精彩集锦 腾讯X5浏览服务正式开放 30多款APP成为首批受益者 Node.js设计经验谈 LeanKanban University首位中国认证讲师路宁:看板会为更多国内企业带来深刻变革 环信IM沙龙纪实:无分享不IM,无社交不未来 【工具推荐】ESL:更简洁、更高效的标准加载器 【先锋】亲加通讯云:以云服务模式为App提供社交引擎 ======================各位高手,看一下!UP也有分! 请问安徽的高程成绩什么时候可以查? 请问谁知道vb里面如何调用notes对象,怎么调用? 急急急,我好急,有没有办法先把记录集处理一下在绑顶到datagrid 请问为什么这一段XML代码运行不了???为什么???帮帮忙??多谢!! 请教有关手机方面的问题 连编好的可执行文件不能用 帮帮忙啊 哪儿有免费的jsp空间并且有数据库支持的?谢谢 客户机的WinSock控件采用TCP协议,如何使用预设的固定的端口? sos!Help me! 有谁知道怎样用Capwnd控件(用于捕获视频的控件)?? 请帮我看看,谢了 请问如何控制imagecombo控件的下拉高度呢? 能告诉我什么是回调函数吗?注册的系统回调函数中引入的参数能在别的地方得到吗? 在RicheEdit里的字体颜色都是黑色,能变成其他颜色吗? 请问在视中如何使主框架的某个菜单项变为不可用(代码如下,错在什么地方,如何改?)! 请教VFP中GRID的显示和取值问题 请教一些有关用ROSE进行UML设计的问题 高薪寻找合作者:医院信息管理系统 求救!!!!为什么必须多按reset键才可以启动?? 請教: WideString如何存入數據庫image字段? 如何判断一个字符串是数字串?要源码(无内容) 登陆某些网站后浏览器的默认主页不能更改,怎么办???谢谢 请教简单的API函数的问题 ! 简单问题,怎么样得到下拉列表的选项?????最好有简单的原码 主  题:高薪寻找合作者:医院信息管理系统 上海机械电脑有限公司??? 小弟刚刚开始自学pb有好多问题想请教各位老大 HW待遇到底咋样??? 谁在CB里面用过游标? 关于网络协议软件的开发问题,编译成什么形式? 我是个新手,请教Linux下面C编程,该怎么入手,该看些什么样的书?来则有分!!!! 高分求源代码!又谁做过票据打印的软件!帮忙给点源代码! 如何执行insert 语句效率最高 数据窗口相同记录的判断??? 关于网络协议问题 求救,怎么判断试用版的试用天数? 关于IE的问题,help~~~ 请各位老大帮忙啊 请问如何串行化一个COLORREF变量,急---谢谢! 急,急,急,数据库更新的问题 win98下的DrawText api函数与Win200Server下的有什么不用呢? 评选水园“十大杰出青年”,请大家踊跃推荐(自荐)参评! 这个(Oracle)存储过程错在那?很简单,各位大虾看一下,一定给分!!谢谢啦!!!!! 好久不来了,有个问题请高手指点! 怎样设置SQL2000的某一字段为自动类型 熟悉GDI函数的朋友请进 如何屏蔽源代码 哪位大侠行行好,把我的密码屏蔽掉,只要不需输密码,分数一定不会少。 未受人类生活和生产影响的自然环境 天然有机高分子材料就是天然材料吗?羊毛,煤什莫的 铜铝合金散热器好还是铝合金那个好? 世界上使用的天然橡胶大部分来自东南亚,为什么?怎么办呢? 天然有机高分子材料是什么? 怎样理解“靠山吃山,靠水吃水”的含义?举例说明.(提示:人类的生活离不开动物、植物)科学上面的快 能源利用历史 人类历史上的四次能源革命 铝合金拉丝、铝合金面板,铝合金散热器哪家的比较好? 影响生态系统稳定性的因素包括自然因素和人为因素,它们往往是怎么样的,人为因素可以导致自然因素的怎样 简要介绍下人类历史上三次能源革命 是能源革命 能源 人类的衣食住行离不开化学,请你举出相关的例子.衣:食:住:行: 人类使用金属材料的发展历程,150字左右.详细的年代和金属名称. 迄今为止人类历史已经历了几次信息技术革命急用!越快越好,谢谢 徕卡测绘系统 待遇 三江源地区生态环境恶化因素 人类历史上经历了什么信息革命 测量平面坐标系统有哪些 现在地球上生态环境恶化的主要原因是什么? 人类历史经历了哪五次信息革命 胶水和油漆请问哪种胶水或油漆可以把多张牛皮纸,像制作复合板那样,一层层地粘贴起来,使之具有一定的硬(刚)度,变成纸合板.大概需要粘两个平方米. 三江源地区生态脆弱的主要原因A.地势高,气候寒冷 B.冰川众多、湿地广大C..地形崎岖,交通不便 D.深居内陆,远离海洋我想问为什么不选B 水准仪测量 不锈钢和油漆用什么胶水 怎样鉴别是羊毛,棉花还是化纤制成的 电子水准仪如何测量四等水准关键是条码水准尺,没黑红面.一般用什么样表格填写 生物的确太重要了,人们的生活处处离不开生物.请距离说明生物对人类的衣,食,住,行的重要性各举三个例是具体不是距离啊 怎样区分羊毛和棉花?现象是什么? 棉花机可以弹羊毛衫和废旧衣服不? 图纸标注面轮廓度0.5,是否就是该平面高点和低点的差值是0.5mm? 棉花 化纤 羊毛区别棉花 化纤 羊毛分别在酸 碱溶液中的变化和燃烧时的现象 羊毛衫扎人怎么办?怎么处理羊毛衫扎人? 线轮廓度有无基准的区别 人类在历史上的生活正如?求接连! 纽扣常用高分子材料 平面度和变形度的区别比如一个胶件.需要测量这个胶件的变形度,能不能测量平面度就行了? 人类在历史上生存多久? 棉花是高分子化合物么 pvc粘pvc用什么胶水效果好?能够手工做,效果需刷成一条线不能有毛边异位等现象,只要能够平滑好刷粘力要达标! 人类的传统生活方式是什么? 植物与人类的衣食住行必须和植物有关 用来粘PVC胶件的慢干胶水有那些? “人类在历史上的生活正如旅行一样”用的是什么修辞手法 水平仪测量的计算水平仪精度0.02/1000,桥板长度200mm,测量对象为1000mm,共测量5次,每次读数0、+3、+1、+3、-2求工件直线度误差五个点的高度已经明白了,但是直线度0.008mm是如何确定的呢? 举出4个以上的具体事例谈一谈人类的生存为什么离不开生物 作者认为人类在历史上生活应该拥有怎样的心态?不要那种一大片的那种没有用的东东( ⊙ o ⊙ 这是8艰难的国运与雄健的国民的作业本上的 还有一个啊:上文采用了比喻写法.请选择一个比喻 水准仪可以测量些什么有两个空 请各举两列说明,人类的衣\食\住\行都离不开生物.衣:食:住:行:p35 如何用水准仪测量两点间的水平距离? 棉花,蚕丝主要成分分别是什么 道路测量计算公式? 利用水准仪测量距离他能测量多少米 我发觉读数他一般上丝减去下丝都不超过1M 而距离计算是上丝减去下丝乘 100 我想知道他能测多少米的距离 如何用水准仪测量长度,请指教, 求环宽的面计公式 自然环境是人类生产活动与生活活动的物质基础.秘鲁山区的印第安人深受安第斯山脉自然环境的影响他们日常生活中的衣、食、住、行等方面都留有山区环境的烙印.请你说一说秘鲁山区印 棉花羊毛蚕丝都是天然的高分子化合物.都属于天然纤维. 为什么说人类离不开植物的光合作用? 人类活动对自然环境的正面影响 水准仪怎样测量距离 笔记本散热器是亚克力的好还是铝合金材质的好!我的笔记本太烫想买个散热器,但不知道那种材质的用了好,麻烦懂的帮帮忙,顺便说下市场大概的价格是多少,感激不尽!
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn