MSCOMM(Comm)初始化:
if Comm.PortOpen then
Comm.PortOpen:=False;
Comm.CommPort:=1;
Comm.Settings:='57600,n,8,1';
Comm.Inputlen:=0;
Comm.OutBufferCount:=0;
Comm.InBufferCount:=0;
Comm.RThreshold:=1; //接收缓冲区有一个字符时产生事件
Comm.SThreshold:=0;
Comm.PortOpen:=True;
function TYKTComServer.SendTime(const OpenTime: WideString): WordBool;
var //更新管理器时间
InputArr0,InputArr1,OutArr:array of byte;
Temp:byte;
i,j,k:integer;
rtn:boolean;
begin
try
result:=false;
rtn:=true; SetLength(InputArr0,1);
InputArr0[0]:=254; setlength(inputarr1,13);
InputArr1[0]:=13;
InputArr1[1]:=$A0;
InputArr1[2]:=0;
//当前时间
InputArr1[3]:=strtoint(FormatDateTime('s',time)); //秒
InputArr1[4]:=strtoint(FormatDateTime('n',time)); //分
InputArr1[5]:=strtoint(FormatDateTime('h',time)); //小时
InputArr1[6]:=strtoint(FormatDateTime('d',Date)); //日
InputArr1[3]:=DayOfWeek(date); //星期
InputArr1[4]:=strtoint(FormatDateTime('m',Date)); //月
InputArr1[5]:=strtoint(FormatDateTime('yy',Date)); //年
//开机时间
InputArr1[6]:=strtoint(Copy(Opentime,15,2)); //分
InputArr1[7]:=strtoint(Copy(Opentime,12,2)); //小时
InputArr1[8]:=strtoint(Copy(Opentime,9,2)); //日
InputArr1[9]:=strtoint(Copy(Opentime,6,2)); //月
InputArr1[10]:=strtoint(Copy(Opentime,3,2)); //年
//校验值
Temp:=0;
for i:=0 to 10 do
Temp:=Temp+InputArr1[i];
InputArr1[11]:=Temp;
Temp:=0-Temp;
InputArr1[12]:=Temp; for k:=0 to 2 do
begin
FrmMain.Comm.OutBufferCount:=0; //清空发送缓冲区
FrmMain.Comm.InBufferCount:=0; //清空接受缓冲区
FrmMain.Comm.Settings:='57600,M,8,1'; //发送下位机地址
FrmMain.Comm.Output:=InputArr0; FrmMain.Comm.Settings:='57600,S,8,1'; //发送数据
FrmMain.Comm.Output:=InputArr1;
sleep(1000);
//延时1000ms没有问题
if FrmMain.comm.CommEvent=2 then //查询接收事件
begin
j:=FrmMain.Comm.InBufferCount;
//如果延时5ms的话,问题出在这里:
我定义了Comm.RThreshold:=1,也就是已经查询到接收事件,
按理起码 FrmMain.Comm.InBufferCount>=1 吧?
有时居然 j=0 了 !
下面的数组就出了问题!!!!!!!!!!
setlength(OutArr,j);
OutArr:=FrmMain.comm.Input;
if j=OutArr[0] then //check length
begin
Temp:=0; //check
for i:=0 to j-3 do
Temp:=Temp+OutArr[i];
if Temp=OutArr[j-2] then
begin
Temp:=0-Temp;
if Temp=OutArr[j-1] then
if OutArr[1]=$10 then
begin
Result:=true;
rtn:=false;
end;
end;
end;
end;
if not rtn then break;
end;
except
showmessage('更新管理器时间失败!');
end;
end;
请高手解答!!!!!
if Comm.PortOpen then
Comm.PortOpen:=False;
Comm.CommPort:=1;
Comm.Settings:='57600,n,8,1';
Comm.Inputlen:=0;
Comm.OutBufferCount:=0;
Comm.InBufferCount:=0;
Comm.RThreshold:=1; //接收缓冲区有一个字符时产生事件
Comm.SThreshold:=0;
Comm.PortOpen:=True;
function TYKTComServer.SendTime(const OpenTime: WideString): WordBool;
var //更新管理器时间
InputArr0,InputArr1,OutArr:array of byte;
Temp:byte;
i,j,k:integer;
rtn:boolean;
begin
try
result:=false;
rtn:=true; SetLength(InputArr0,1);
InputArr0[0]:=254; setlength(inputarr1,13);
InputArr1[0]:=13;
InputArr1[1]:=$A0;
InputArr1[2]:=0;
//当前时间
InputArr1[3]:=strtoint(FormatDateTime('s',time)); //秒
InputArr1[4]:=strtoint(FormatDateTime('n',time)); //分
InputArr1[5]:=strtoint(FormatDateTime('h',time)); //小时
InputArr1[6]:=strtoint(FormatDateTime('d',Date)); //日
InputArr1[3]:=DayOfWeek(date); //星期
InputArr1[4]:=strtoint(FormatDateTime('m',Date)); //月
InputArr1[5]:=strtoint(FormatDateTime('yy',Date)); //年
//开机时间
InputArr1[6]:=strtoint(Copy(Opentime,15,2)); //分
InputArr1[7]:=strtoint(Copy(Opentime,12,2)); //小时
InputArr1[8]:=strtoint(Copy(Opentime,9,2)); //日
InputArr1[9]:=strtoint(Copy(Opentime,6,2)); //月
InputArr1[10]:=strtoint(Copy(Opentime,3,2)); //年
//校验值
Temp:=0;
for i:=0 to 10 do
Temp:=Temp+InputArr1[i];
InputArr1[11]:=Temp;
Temp:=0-Temp;
InputArr1[12]:=Temp; for k:=0 to 2 do
begin
FrmMain.Comm.OutBufferCount:=0; //清空发送缓冲区
FrmMain.Comm.InBufferCount:=0; //清空接受缓冲区
FrmMain.Comm.Settings:='57600,M,8,1'; //发送下位机地址
FrmMain.Comm.Output:=InputArr0; FrmMain.Comm.Settings:='57600,S,8,1'; //发送数据
FrmMain.Comm.Output:=InputArr1;
sleep(1000);
//延时1000ms没有问题
if FrmMain.comm.CommEvent=2 then //查询接收事件
begin
j:=FrmMain.Comm.InBufferCount;
//如果延时5ms的话,问题出在这里:
我定义了Comm.RThreshold:=1,也就是已经查询到接收事件,
按理起码 FrmMain.Comm.InBufferCount>=1 吧?
有时居然 j=0 了 !
下面的数组就出了问题!!!!!!!!!!
setlength(OutArr,j);
OutArr:=FrmMain.comm.Input;
if j=OutArr[0] then //check length
begin
Temp:=0; //check
for i:=0 to j-3 do
Temp:=Temp+OutArr[i];
if Temp=OutArr[j-2] then
begin
Temp:=0-Temp;
if Temp=OutArr[j-1] then
if OutArr[1]=$10 then
begin
Result:=true;
rtn:=false;
end;
end;
end;
end;
if not rtn then break;
end;
except
showmessage('更新管理器时间失败!');
end;
end;
请高手解答!!!!!
解决方案 »
- 关于DELPHI调用C++写的DLL问题(120分)
- 问题: 关于数据操作权限的控制
- COM+,大家都来讨论下,以解开迷团
- 有谁用过3DState-for Delphi??????
- 關于開啟子窗口的問題(代碼如下)﹐報錯
- 请问 哪有report builder professional edition 5.0版的报表设计器的使用说明
- 一個禮拜見了三個網友,像這么害羞的人沒想到在女人面前也侃侃而談
- 请教各位大侠,如何获得NT系统的当前CPU占有率???(送分来了)
- DLL中使用TWebBrowser无法使用Navigate
- 在delphi中怎样退出for循环?
- 是否DELPHI的BUG?TclientDataSet.Append
- 现在的it业动荡不安,初学都问一个非技术问题,请各位大哥指路!!!!
我定义了Comm.RThreshold:=1,也就是如果查询到接收事件,
按理起码 FrmMain.Comm.InBufferCount>=1 吧?
有时居然 j=0 了 !
下面的数组就越界了