串行通信的实现

原创 2004年09月18日 00:03:00
串行通信的实现
串行通信的实现

随 着 现 代 信 息 技 术 的 发 展 以 及 计 算 机 网 络 的 广 泛 使 用, 计 算 机 通 信 技 术已 经 日 臻 成 熟, 但 串 行 通 信 作 为 一 种 灵 活 方 便 可 靠 的 通 信 方 式, 仍 不 失 为有 效 的 通 信 手 段, 被 广 泛 应 用 于 工 业 控 制 中。 在 工 业 生 产 实 践 中, 用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.

51单片机编程:双机串行通信

利用 2 个实验系统通过 232 通信,实现双机串行通信功能。用汇编或 C 语言编写一个 51 单片机程序,用本侧的 K0~K3 能控制对侧的 L0~L3,用对侧的 K0~K3 能控制本侧的 L0~L...
  • baidu_33836580
  • baidu_33836580
  • 2016年01月25日 12:11
  • 1520

同步串行通信和异步串行通信

原文地址:同步串行通信和异步串行通信作者:SUN_403   串行通信的数据是逐位传送的,发送方发送的每一位都具有因定的时间间隔,这就要求接收方也要按照发送方同样的时间间隔来接收每一位。不仅如此,接收...
  • Sun19910114
  • Sun19910114
  • 2014年08月19日 16:27
  • 1524

串行通讯与并行通讯区别

1  串行通讯        一条信息的各位数据被逐位按顺序传送的通讯方式称为串行通讯。串行通讯的特点是:数据位传送,传按位顺序进行,最少只需一根传输线即可完成,成本低但送速度慢。串行通讯的距离可以...
  • u013243710
  • u013243710
  • 2015年01月11日 20:58
  • 1922

嵌入式系统学习——STM32之串口通信UART

处理器与外部设备通信的两种方式: 1、并行通信   -传输原理:数据各个位同时传输。   -优点:速度快   -缺点:占用引脚资源多 2、串行通信   -传输原理:数据按位顺序传输。 ...
  • hjf161105
  • hjf161105
  • 2017年05月22日 23:29
  • 309

双机(51单片机)串行通信最基本的方法

有网友求助双机串行通信的方法,做而论道以前曾经发表过这方面的博文,但是当时没有配发电路图,不太好理解和仿制。做而论道过去一直使用硬件的仿真器,在最近,把 PROTEUS 软件逐渐的熟悉起来了,用这个“...
  • baidu_33836580
  • baidu_33836580
  • 2016年01月25日 11:39
  • 1809

串行通信实验

要求:理解单片机串行口实现通信的各种工作方式,掌握单片机串行通信程序设计、调试方法 实验题目:甲乙两个单片机进行串行通信。采用12MHZ时钟频率晶振频率和方式1进行通信。甲机上有4*4键盘、一个七段...
  • zhihang1103
  • zhihang1103
  • 2013年12月12日 12:40
  • 867

单片机C51 - 串行通信原理及串口编程实验

一、两种通信方式概念 1.并行通信 传输原理:并行通信时数据的各个位同时传送,以字节为单位并行传输优点:并行通信速度快,传输的数据宽度可以是1~128位,甚至更宽缺点:并口上导线之间数据同步难处理...
  • u012313335
  • u012313335
  • 2016年09月07日 10:42
  • 1233

串口通信程序的编写

Win 32系统把文件的概念进行了扩展。无论是文件、通信设备、命名管道、邮件槽、磁盘、还是控制台,都是用API函数CreateFile来打开或创建的。该函数的声明为:  HANDLE CreateFi...
  • darren2015zdc
  • darren2015zdc
  • 2016年06月27日 13:26
  • 2457

DSP—2812、28335串行通信接口SCI

文章来自:http://blog.csdn.net/wu159632/article/details/7996886 SCI(Serial Communication Interface),即串...
  • jinn3
  • jinn3
  • 2014年06月27日 13:25
  • 2718

STM32F的几种串行通信总线总结

一 USART 通用同步异步收发器(USART)提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间进行全双工数据交换。 USART支持同步单向通信和半双工单线通信,也支持LIN...
  • u010497783
  • u010497783
  • 2016年08月20日 17:45
  • 1162
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:串行通信的实现
举报原因:
原因补充:

(最多只允许输入30个字)