分析ComPort1的接收数据代码 ( 积分: 100 )

  • 主题发起人 主题发起人 德尔福_qwz
  • 开始时间 开始时间

德尔福_qwz

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure TDM.ComPort1RxChar(Sender: TObject; Count: Integer);
Var
RecvData :Array of Byte;
AvalidData :Array of Byte;
CountA:integer;
begin
sleep(60);
CountA:=ComPort1.InputCount;
if CountA <6 then
Exit;
SetLength(RecvData, CountA);
//是什么意思?
ComPort1.Read(RecvData[0], CountA);
//是什么意思?
if ((RecvData[0] <>$FF)or(RecvData[1] <>$00)) then
Exit;
//是什么意思?
SetLength(AvalidData, CountA-2);
//是什么意思?
Move(RecvData[2], AvalidData[0], CountA-2);
//是什么意思?
SpliteFram(AvalidData);
//是什么意思?

end;
end.
 
这和串口没什么关系的
看看关于 动态数组的资料吧
 
代码:
procedure TDM.ComPort1RxChar(Sender: TObject; Count: Integer);
Var
  RecvData :Array of Byte;
  AvalidData :Array of Byte;
  CountA:integer;
begin
  sleep(60);
  CountA:=ComPort1.InputCount;
  if CountA <6 then
     Exit;
  SetLength(RecvData, CountA);
//是什么意思?答:将动态数组变量RecvData的长度置为CountA
  ComPort1.Read(RecvData[0], CountA);
//是什么意思?答:将Comport1缓冲区内CountA个字符读入RacvData变量中
  if ((RecvData[0] <>$FF)or(RecvData[1] <>$00)) then
     Exit;
//是什么意思?答:就是说如果接收的字符串不是FF 00开头的就退出本过程
  SetLength(AvalidData, CountA-2);
//是什么意思?答:就是说如果接受的字符串以FF00开头,那么将动态数组变量AvalidData的长度置为CountA-2;
  Move(RecvData[2], AvalidData[0], CountA-2);
//是什么意思?答:将动态数组变量RecvData第三个字符起的CountA-2个字符复制到动态数组变量AvalidData中。
  SpliteFram(AvalidData);
//是什么意思?答:调用SpliteFram过程处理AvalidData所指向的数据
 
to stargazer 高手 再帮我分析一下下面的代码
马上放这100分给你 谢谢了
Except on E:exception do
begin

AssignFile(TxtFile, 'ErrorData.txt');
if not FileExists('ErrorData.txt') then
Rewrite(TxtFile)
else
Append(TxtFile);
Writeln(TxtFile, 'FF 00 ' +HexToStr(Recv_Data, Length(Recv_Data))+ E.message);
CloseFile(TxtFile);
Exit;
end;
end;
 
上面的代码是异常后,则记录日志,但可能出错。下面的则不会。
procedure WriteDebugInfo(strMsg: string; strFn: string = 'Debug');
var
f: textfile;
strLogFile: string;
begin
if strFn <> '' then
strLogFile := strFn //使用指定日志文件名
else
strLogFile := strLogDir + '.txt'; //使用默认日志文件名 debug.txt
AssignFile(f, strLogFile);
if not fileexists(strLogFile) then
Rewrite(f) //不存在,就新建立一个日志文件
else
Append(f); //存在则追加到日志文件
try
Writeln(f, TimeToStr(now) + ' ' + Trim(strMsg));
finally
CloseFile(f); //确保关闭日志文件,否则删都删不掉
end;
end;

使用方法
Except on E:exception do
begin
WriteDebugInfo('FF 00 ' +HexToStr(Recv_Data, Length(Recv_Data))+ E.message,'ErrorData.txt');
Exit;
end;
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
533
import
I
后退
顶部