串口通訊(Delphi)

原创 2011年07月26日 17:19:45


unit   Comm;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, BaseChildForm, Menus, DBActns, StdActns, ActnList, ImgList, DB,
  ExtCtrls, StdCtrls, ComCtrls, Grids, Wwdbigrd, Wwdbgrid, ADODB,
  DBCtrls;

type

  TComInfo = record
    cCommNum: string;       { com1..com4 }
    cBaudRate: Integer;     { 1200..19200 }
    cDataLen: Integer;      { 6..8 }
    cStopLen: Integer;      { 1..2 }
    cParity: Integer;       { non, odd, even }
    cHandle: THandle;       // 串口打開後用來保存句柄
    Connectioned: Boolean;
  end;

  TComm= class(TfrmBaseChildForm)
  private
    { Private declarations }
  public
    { Public declarations }
    procedure CloseCom(iCom: Integer);
    procedure OpenCom(iCom:Integer);
    function ReadComStr(iCom: Integer): string;
    function GetComStr(cHandle:THandle):string;
  end;

var
  ComInfo: array[1..4] of TComInfo;
  COMIsOpen : Boolean;
  ReadOs : TOverlapped;
  CanisterCode:string;
  CanisterWeight:Double;
implementation

{$R *.dfm}

procedure TComm.CloseCom(iCom: Integer);
begin
   if ComInfo[iCom].cHandle <> INVALID_HANDLE_VALUE then
   begin
      CloseHandle(ComInfo[iCom].cHandle );
      ComInfo[iCom].cHandle:= INVALID_HANDLE_VALUE;
      ComInfo[iCom].Connectioned := False;
      COMIsOpen := False;
   end;
end;

procedure TComm.OpenCom(iCom:Integer);
var ComDCB: TDCB;
   ComTimeOuts: TCOMMTIMEOUTS;
begin
  ComInfo[iCom].cHandle:= CreateFile( PChar(ComInfo[iCom].cCommNum),
                    GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, 0,0);

  if ComInfo[iCom].cHandle=INVALID_HANDLE_VALUE then
  begin
    ERROR_BOX(Self.Handle,PChar('打開串口錯誤!'));      // 提交異常退出
    COMIsOpen := False;
    Exit;
  end;
 
  if not SetupComm(ComInfo[iCom].cHandle,1024,1024) then
  begin
    ERROR_BOX(Self.Handle,PChar('不能設置串口!'));
    CloseHandle(ComInfo[iCom].cHandle);
    COMIsOpen := False;
    Exit;
  end;

  try
    GetCommState(ComInfo[iCom].cHandle, ComDCB);
    ComDCB.BaudRate:= ComInfo[iCom].cBaudRate;
    ComDCB.ByteSize:= ComInfo[iCom].cDataLen;
    ComDCB.Parity:= NoParity;
    ComDCB.StopBits:= OneStopBit;

    if SetCommState(ComInfo[iCom].cHandle, ComDCB) = False then ERROR_BOX(Self.Handle,PChar('設置串口錯誤!'));   // 提交異常退出

    ComTimeOuts.ReadIntervalTimeout:= 0;                // 讀區間超時
    ComTimeOuts.ReadTotalTimeoutConstant:= 0;           // 讀超時常數
    ComTimeOuts.ReadTotalTimeoutMultiplier:= 50;        // 讀總超時
    ComTimeOuts.WriteTotalTimeoutConstant:= 0;          // 寫超時常數
    ComTimeOuts.WriteTotalTimeoutMultiplier:= 50;       // 寫總超時
    if SetCommTimeouts(ComInfo[iCom].cHandle,ComTimeOuts ) = False then
       ERROR_BOX(Self.Handle,PChar('設置串口超時錯誤!'));   // 提交異常退出
  except
    CloseHandle(ComInfo[iCom].cHandle);

  end;
  ComInfo[iCom].Connectioned := True;
  COMIsOpen := True;
end;

function TComm.GetComStr(cHandle:THandle):string;
var
  CommState : COMSTAT;
  dwNumberOfBytesRead : DWORD;
  ErrorFlag : DWORD;
  InputBuffer : array [0..1024] of Char;
  i:Integer;
begin
  if not ClearCommError(cHandle,ErrorFlag,@CommState) then
  begin
    ERROR_BOX(Self.Handle,PChar('清除串口錯誤!'));
    PurgeComm(cHandle,Purge_Rxabort or Purge_Rxclear);
    Exit;
  end;

  if CommState.cbInQue > 0 then
  begin
    FillChar(InputBuffer,CommState.cbInQue,#0); // 接收通訊數據
    if (not ReadFile(cHandle,InputBuffer,CommState.cbInQue,dwNumberOfBytesRead,@ReadOs )) then
    begin
      ErrorFlag := GetLastError();
      if (ErrorFlag <> 0) and (ErrorFlag <> ERROR_IO_PENDING) then
      begin
        ERROR_BOX(Self.Handle,PChar('讀取串錯誤!'));
        CloseHandle(cHandle);
        Exit;
      end;
    end;

    for i:=0 to dwNumberOfBytesRead -1 do
    begin
        if InputBuffer[i]= #13 then Break
        else Result := Result + InputBuffer[i];
    end;
  end;
end;

function TComm.ReadComStr(iCom: Integer): string;
var sWeight:string;
begin
  sWeight := GetComStr(ComInfo[iCom].cHandle);
  if Pos('N/W',sWeight)>0 then Result := Trim(Copy(sWeight,4,8));
end;

procedure TComm.FormCreate(Sender: TObject);
var i:Integer;
begin
  inherited;
  for i:= 1 to 4 do
  begin
    ComInfo[i].cCommNum := 'COM'+IntToStr(i);
    ComInfo[i].cBaudRate := 9600;
    ComInfo[i].cDataLen := 8;
    ComInfo[i].cStopLen := 1;
    ComInfo[i].cParity := NoParity;
  end;
  Self.OpenCom(1);
  if COMIsOpen then Timer1.Enabled := True;

  if  not qryEmployee.Active then  qryEmployee.Open;
  if  not qryCanisterData.Active then  qryCanisterData.Open;
  if  not qryLoomGoods.Active then  qryLoomGoods.Open;
end;

procedure TComm.FormDestroy(Sender: TObject);
begin
  inherited;
  Self.CloseCom(1);
  frmLoomFinish:=nil;
end;

end.

PC机串口通信的工作原理

串口是计算机上一种非常通用设备通信的协议(不要与通用串行总线Universal Serial Bus或者USB混淆)。大多数计算机包含两个基于RS232的串口。串口同时也是仪器仪表设备通用的通信协议;...
  • suxinpingtao51
  • suxinpingtao51
  • 2013年11月25日 12:39
  • 2967

php串口通信编程问题

最近做个小项目,要远程控制一个水泵,编程只会一点儿php,正好方便远程控制。 开发环境 win7 ,一个usb转串口的转换器,淘宝上买的串口4路继电器板。 想最终整个atom的小板子加个u盘做系统...
  • bjash
  • bjash
  • 2013年01月09日 21:45
  • 7986

Delphi 串口通信(1)

利用 Delphi实现串口通信的常用的方法有 3种: 一是利用控件,如 MSCOMM控件和 SPCOMM控件; 二是使用 API函数; 三是调用其他串口通信程序。其中利用 API编写...
  • lailai186
  • lailai186
  • 2013年08月02日 10:16
  • 4676

在C#中实现串口通信的方法

通常,在C#中实现串口通信,我们有四种方法: 第一:通过MSCOMM控件这是最简单的,最方便的方法。可功能上很难做到控制自如,同时这个控件并不是系统本身所带,所以还得注册,不在本文讨论范围。可以访问h...
  • smartsmile2012
  • smartsmile2012
  • 2014年04月22日 17:28
  • 2700

Delphi中ComPort串口控件通信中的数据处理

http://www.cnblogs.com/gaiyang/archive/2011/09/02/2163265.html 1.串口通信的基本原理: 一般计算机与外部设备通讯有两种方式:...
  • lotusyangjun
  • lotusyangjun
  • 2013年11月06日 21:57
  • 10788

高通平台串口调试 AP与模块串口通讯调试总结

原文网址:http://blog.csdn.net/linux_devices_driver/article/details/24329043 1:检查AP端串口配置是否ok: ...
  • u010503912
  • u010503912
  • 2016年07月07日 18:03
  • 2431

Delphi下SPCOMM串口编程(转)

 关键词:Delphi,串口通信,Spcomm控件 摘要:利用Delphi开发工业控制系统软件成为越来越多的开发人员的选择,而串口通信是这个过程中必须解决的问题之一。本文在对几种常用串...
  • kangshijiu1
  • kangshijiu1
  • 2014年09月24日 10:48
  • 1981

Delphi编写串口通讯方法(转)

 ...
  • kangshijiu1
  • kangshijiu1
  • 2014年09月24日 10:41
  • 2833

串口通讯摘要(转)

串口通信之并发与单步 物理连接示意图如下所示,每个串口挂接多个采集器。 通信协议: 包头(1B) + 地址码(1B) + 命令字(1B) + 数据长度(1B) + 校验码1(1B) + ...
  • huwei2003
  • huwei2003
  • 2013年03月29日 14:59
  • 6233

delphi串行通信源码教程

QQ:627459622 一、总目录如下所示 资料1.Delphi安装源文件(总共2个文件,大小:502MB) 资料2.Delphi串口通信源码(总共242个源码,大小:151MB) 资料...
  • hysmcu
  • hysmcu
  • 2013年03月30日 21:14
  • 2149
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:串口通訊(Delphi)
举报原因:
原因补充:

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