现从串口取的数据,需从中取出28H到54H中间5个字节中的前4个字节,代码如下:
//数据接收消息处理函数
procedure tform1.wmcommnotify(var message:tmessage);
var
titem:tlistitem;
commstate:comstat;
dwnumberofbytesread:dword;
errorflag:dword;
inputbuffer:array[0..1024] of char; //静态数组
recstr:string;
i,n:integer;
begin ===========数据引出============== //开始提取数据
for n:=0 to dwnumberofbytesread-1 do//dwnumberofbytesread为串口已读取字节
begin 数,在api函数readfile()中已获取
if inttohex(ord(inputbuffer[n]),2)='28' then
begin
i:=0;
recstr:='';
while i<4 do
begin
i:=i+1;
recstr:=recstr+inttohex(ord(inputbuffer[n+i]),2);
end;
titem:=listview1.Items.Add;
titem.caption:=datetimetostr(date()+time());
titem.SubItems.Add(recstr);
但是就是这样,前二组28H和54H之间的能正确的取出来(11022B15,11022B01)到第三组就前面1102为对的0030为错的,本应为2B05),到第四个就是发送测试包中完全没有的00301AFA本应为(11022B09),接下就如上面循环出现错误前,即两组对,半组错,一组全都一直到结束,不知是那里算法有问题,请大家帮我看一看,急啊!!
//数据接收消息处理函数
procedure tform1.wmcommnotify(var message:tmessage);
var
titem:tlistitem;
commstate:comstat;
dwnumberofbytesread:dword;
errorflag:dword;
inputbuffer:array[0..1024] of char; //静态数组
recstr:string;
i,n:integer;
begin ===========数据引出============== //开始提取数据
for n:=0 to dwnumberofbytesread-1 do//dwnumberofbytesread为串口已读取字节
begin 数,在api函数readfile()中已获取
if inttohex(ord(inputbuffer[n]),2)='28' then
begin
i:=0;
recstr:='';
while i<4 do
begin
i:=i+1;
recstr:=recstr+inttohex(ord(inputbuffer[n+i]),2);
end;
titem:=listview1.Items.Add;
titem.caption:=datetimetostr(date()+time());
titem.SubItems.Add(recstr);
但是就是这样,前二组28H和54H之间的能正确的取出来(11022B15,11022B01)到第三组就前面1102为对的0030为错的,本应为2B05),到第四个就是发送测试包中完全没有的00301AFA本应为(11022B09),接下就如上面循环出现错误前,即两组对,半组错,一组全都一直到结束,不知是那里算法有问题,请大家帮我看一看,急啊!!
readfile(hrecv,inputbuffer,commstate.cbInQue,dwnumberofbytesread,@read_os))全部的设置为begin
if not clearcommerror(hrecv,errorflag,@commstate) then
begin
messagebox(0,'clearcommerror !','notice',mb_ok);
purgecomm(hrecv,purge_rxabort or purge_rxclear);
exit;
end;
if (commstate.cbInQue>0) then
begin
fillchar(inputbuffer,commstate.cbInQue,#0);
if (not readfile(hrecv,inputbuffer,commstate.cbInQue,dwnumberofbytesread,@read_os)) then
begin
errorflag:=getlasterror();
if (errorflag<>0)and (errorflag<>error_io_pending) then
begin
receive:=false;
raise exception.Create('读串口数据出错!!');
end
else
begin
waitforsingleobject(hrecv,infinite);
getoverlappedresult(hrecv,read_os,dwnumberofbytesread,false);
end;
end;
if dwnumberofbytesread>0 then
begin
read_os.Offset:=read_os.Offset+dwnumberofbytesread;
inputbuffer[dwnumberofbytesread]:=#0;
那位大侠能帮我看一看找一找原因,原因基本都是在四位上出现错误,当个字串时就在第四个字节,当多个字串时,就在第三个字节部份,第四个字节全部上出错,刚好和取数取4位同,不知和这个有没有关系,急