📄 send.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 + -