⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 send.pas

📁 用C++ vc编程的串口通讯软件和源代码
💻 PAS
字号:
unit send;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Dialogs, ExtCtrls,
  Controls, StdCtrls, ComDrv32, Forms, ZLibEx;

const
  DEBUG_MODE = true;     //是否处于调试模式

  COM_IN_BUF_SIZE: Integer = 9999;    //原来的默认值是2048
  COM_OUT_BUF_SIZE: Integer = 9999;   //原来的默认值是2048
  OUTPUT_TIME_OUT: Integer = 1000 * 10;   //timeout,10S
  COM_PORT_POLLING_DELAY: Integer = 100;

  MAX_FILE_SIZE: Int64 = 1024 * 1024 div 2;   //每个要发送的文件,最大尺寸为512K
  FILE_PACKAGE_SIZE: Integer = 120;    //每个数据包的最大尺寸
  FIFLE_TITLE_LEN: Integer = 120;      //每个文件名的最大程度

  MAX_COMM_STRING = 9999;    //接收到的字符串的最大长度

  P_PREPARE_SEND_FILE = $01;
  P_SEND_FILE_DATA = $02;
  P_FINISHED_SEND_FILE = $03;

  P_CAN_SEND_NEW_FILE = $31;
  P_RECEIVED_FILE_DATA = $32;
  P_HAD_SAVED_FILE = $33;

  TMP_FILE_NAME = '$combuf$.tmp';
  COMPRESS_LEVEL: TZCompressionLevel = zcMax; //压缩比率

  SOCKET_ORDER_HEAD = 'SVA_VIDEO_COM_SEND_FILE_HEAD';
  SOCKET_ORDER_STOP = '1';
  SOCKET_ORDER_RESUME = '0';
  SOCKET_ORDER_SERVER = '127.0.0.1';
  SOCKET_ORDER_PORT = '8154';
type
  TProtocol = class
  public
    class function Int64ConvertChar4(AInt: Int64): string;
    class function ProtocolPrepareSend(AFileSign: Byte;
      AFile: string; AFileSize: Int64): string;
    class function ProtocolSendData(AFileSign: Byte;
      APos: Int64; AData: string): string;

    class function SendComData(AComPort: TCommPortDriver;
      AData: string; var ARecentData: string; var ATimerOut: TTimer;
      var ATimeOutFlag: Boolean; var ATimeOutCout: Integer): Boolean;
  end;

implementation

uses hexconv, ComSys;

{ TProtocol }

class function TProtocol.Int64ConvertChar4(AInt: Int64): string;
var
  DivTmp, ModTmp: Int64;
  RetValue: string;
begin
  if AInt > $FFFFFFFF then
    AInt := $FFFFFFFF;

  RetValue := '';

  DivTmp := AInt div (256 * 256 * 256);
  ModTmp := AInt mod (256 * 256 * 256);
  RetValue := RetValue + char(DivTmp);

  DivTmp := ModTmp div (256 * 256);
  ModTmp := ModTmp mod (256 * 256);
  RetValue := RetValue + char(DivTmp);

  DivTmp := ModTmp div (256);
  ModTmp := ModTmp mod (256);
  RetValue := RetValue + char(DivTmp);

  RetValue := RetValue + char(ModTmp);

  Result := RetValue;
end;

class function TProtocol.ProtocolPrepareSend(AFileSign: Byte;
  AFile: string; AFileSize: Int64): string;
var
  FSize: string;
begin
  FSize := Int64ConvertChar4(AFileSize);
  Result := char(P_PREPARE_SEND_FILE) + char(AFileSign) +
    FSize + AFile;
end;

class function TProtocol.ProtocolSendData(AFileSign: Byte; APos: Int64;
  AData: string): string;
var
  FPos: string;
begin
  FPos := Int64ConvertChar4(APos);
  Result := char(P_SEND_FILE_DATA) + char(AFileSign) +
    FPos + AData;
end;

class function TProtocol.SendComData(AComPort: TCommPortDriver;
  AData: string; var ARecentData: string; var ATimerOut: TTimer;
  var ATimeOutFlag: Boolean; var ATimeOutCout: Integer): Boolean;
var
  TmpStr, dispstr: string;
  i: Integer;
begin
  Result := true;

  if false = AComPort.Connected then  //如果串口没有被打开,返回false
  begin
    Result := false;
    Exit;
  end;

  try
    ARecentData := AData;   //必须在DataDispose处理前返回

    if DEBUG_MODE then    //调试状态,显示接收的串口数据
    begin
      dispstr := '';
      for i:=1 to (Length(AData)) do
        dispstr := dispstr + Format('%.2x',[Byte(AData[i])])+' ';
      frmComSys.AddMsg('未组织数据:' + dispstr);
    end;

    TmpStr := AData + char($FF);
    AData := char($7E) + DataDispose(TmpStr) + char($7F);   //#00是为校验码留位置
    ATimeOutFlag := false;
    ATimeOutCout := 0;
    ATimerOut.Enabled := true;    //开始准备超时处理
    Application.ProcessMessages;
    AComPort.FlushBuffers(True, false);
    AComPort.SendString(AData);  //发送数据

    if DEBUG_MODE then    //调试状态,显示接收的串口数据
    begin
      dispstr := '';
      for i:=1 to (Length(AData)) do
        dispstr := dispstr + Format('%.2x',[Byte(AData[i])])+' ';
      frmComSys.AddMsg('发送数据:' + dispstr);
    end;
  except
    Result := false;
  end;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -